运行cloud-init cloud-config yaml文件

问题描述 投票:0回答:5

出于开发目的,如何运行通常通过用户数据运行的 cloud-init yaml 文件?

我知道如何重新运行cloud-init,但我想开发复杂的cloud-init文件,并且要持续构建新实例是相当困难的。

cloud-init
5个回答
2
投票

抱歉,您必须在一个新的干净实例(或至少一个实例的快照)上运行它。即使您手动返回并从不同的步骤开始,也可能存在副作用。

我想您会发现,如果您习惯管理本地虚拟机,您可以相当快地调试脚本。


1
投票

迭代用户数据输入到 cloud-init 的最快路径可能是通过 lxd。您可以在虚拟机主机或裸机系统上快速设置lxd。设置完成后,启动速度非常快。

$ cat ud.yaml
#cloud-config
runcmd:
  - "read up idle < /proc/uptime; echo Up $up seconds | tee /run/runcmd.log"

$ lxc launch ubuntu-daily:bionic ud-test "--config=user.user-data=$(cat ud.yaml)"
Creating ud-test
Starting ud-test

$ lxc exec ud-test cat /run/runcmd.log
Up 8.05 seconds

$ lxc stop ud-test
$ lxc delete ud-test

1
投票

您可能只需运行

cloud-init clean
然后重新运行即可摆脱困境。

我正在尝试 cloud-init 并使用带有 KVM 的 Ubuntu 盒子作为虚拟化实验室。我制作了一个简单的

Makefile
来构建
cloud-init
映像并在 KVM 实例中启动它。

你可以在这里看到我的代码:

https://github.com/brennancheung/playbooks/blob/master/cloud-init-lab/Makefile

all: clean build run

INSTANCE_NAME := "vm"
CLOUD_IMAGE_FILE = "bionic-server-cloudimg-amd64.img"
CLOUD_IMAGE_BASE_URL := "http://cloud-images.ubuntu.com/bionic/current"
CLOUD_IMAGE_URL := "$(CLOUD_IMAGE_BASE_URL)/$(CLOUD_IMAGE_FILE)"

download:
    wget $(CLOUD_IMAGE_URL)

clean:
    @echo "Removing build artifacts"
    -@rm -f config.img 2>/dev/null
    -@virsh destroy $(INSTANCE_NAME) 2>/dev/null || true
    -@virsh undefine $(INSTANCE_NAME) 2>/dev/null || true
    -@rm -f $(INSTANCE_NAME).img

build: 
    @echo "Building cloud config drive"
    cloud-localds config.img config.yaml
    cp $(CLOUD_IMAGE_FILE) $(INSTANCE_NAME).img

run:
    @echo "Spawning instance $(INSTANCE_NAME)"
    virt-install \
        --name $(INSTANCE_NAME) \
        --memory 8192 \
        --disk ./$(INSTANCE_NAME).img,device=disk,bus=virtio \
        --disk ./config.img,device=cdrom \
        --os-type linux \
        --os-variant ubuntu18.04 \
        --virt-type kvm \
        --graphics none \
        --network bridge=br0

0
投票

我不确定为什么这个答案不在这里..也许它不适用于早期版本。

为了重新运行 cloud-init 进行开发测试,我所做的就是(特别是在测试用户数据更改时): 1 - 更改配置文件,通常只需

/etc/cloud/cloud.cfg
2 - 干净运行:

cloud-init clean -l 

-l
还可以清理日志 3 - 重新运行 cloud-init

cloud-init init

当然,这有其局限性,根据您测试的设置,cloud-init clean 不会恢复之前的更改,但也许您能够找到测试方法。例如,我正在测试新用户的创建,每次我更改用户设置中的某些内容并且我想测试它..我都会创建一个新用户。

是的,所有这些都是快速的开发测试,如果您需要真正验证您的更改 - 您需要新实例。


0
投票

不建议在不重新启动系统的情况下重新运行所有 cloud-init 的方法,因为 cloud-init 的某些部分是在 systemd 生成器时间范围内运行以检测新的数据源类型。也就是说,以下命令将允许您在不重新启动系统的情况下完成此操作。

cloud-init 支持

clean
子命令来删除所有信号量文件并允许 cloud-init 再次重新运行所有配置模块。请注意,这将意味着重新生成 SSH 主机密钥并重写 .ssh 配置文件,因此可能会影响您返回虚拟机的能力。

清理所有信号量,以便 cloud-init 模块将在下次启动时重新运行:

sudo cloud-init clean --logs
由于 systemd 服务依赖性,cloud-init 通常会按顺序运行多个启动阶段。如果您想在不重新启动的情况下重复该过程,您可以运行以下 4 个命令:

    检测本地数据源(云平台)并获取用户数据:
sudo cloud-init init --local

    检测 /etc/cloud/cloud.cfg 中定义的任何需要网络启动和运行的数据源和用户数据
  1. cloud_init_modules
sudo cloud-init init

    运行 /etc/cloud/cloud.cfg 中定义的所有
  1. cloud_config_modules
sudo cloud-init modules --mode=config

    运行 /etc/cloud/cloud.cfg 中定义的所有
  1. cloud_final_modules
sudo cloud-init modules --mode=final
    
© www.soinside.com 2019 - 2024. All rights reserved.