我正在编写一个 CloudFormation 模板,并且正在尝试调试我在模板中提供的用户数据脚本。如何手动运行
cloud-init
并使其执行与启动新实例时相同的操作?
更新:
现在有上游文档。
你可以像这样运行它:
/usr/bin/cloud-init -d init
这将使用初始模块运行云初始化设置。 (-d选项用于调试)如果想运行所有模块,你必须运行:
/usr/bin/cloud-init -d modules
请记住,第二次运行它们时它不会做太多事情,因为它已经在启动时运行了。要强制在启动后运行,您可以从命令行运行:
( cd /var/lib/cloud/ && sudo rm -rf * )
在旧版本中,
cloud-init init
的等效项是:
/usr/bin/cloud-init start
您可能还会发现这个问题很有用,尽管它适用于旧版本的 cloud-init:How do I make cloud-init 启动脚本在每次我的 EC2 实例启动时运行?
cloud init 的文档here只是为您提供了示例。但它没有解释命令行选项或每个模块,因此您必须在配置中使用不同的值才能获得所需的结果。当然你也可以看代码。
rm -f /var/log/cloud-init.log \
&& rm -Rf /var/lib/cloud/* \
&& cloud-init -d init \
&& cloud-init -d modules --mode final
向@Rico致敬,而且,如果您想运行单个模块 - 无论是为了测试还是因为您的发行版默认情况下不启用模块(嗨,Precise!),您可以
/usr/bin/cloud-init -d single -n <module-name>
例如,当我的发行版默认不运行时
write_files
(就像很多旧发行版一样),我在 runcmd 的顶部使用它:
runcmd:
- /usr/bin/cloud-init -d single -n write-files
[我知道这并不是OP的真正答案,但是当我寻求解决我的问题时,这个问题是最重要的结果之一,所以我认为其他人可能会发现这很有用]
在大多数 Linux 发行版(包括 CentOS 和 Ubuntu)上,您可以使用 systemctl 重新启动 cloud-init 服务:
systemctl restart cloud-init
然后检查日志的输出看看结果:
journalctl -f -u cloud-init
在 Amazon Linux 2 上,我们发现
cloud-init
在首次启动后运行,然后被删除。 当我们使用 Packer 构建自定义 AMI,然后想要使用用户数据脚本启动它们时,这会导致问题。 这是我们在构建结束时用来重置的 Packer shell 配置程序(HCL2 格式) cloud-init
:
provisioner "shell" {
inline = [
"echo 'Waiting for cloud-init'; while [ ! -f /var/lib/cloud/instance/boot-finished ]; do sleep 1; done; echo 'Done'",
"sudo yum install cloud-init -y",
"sudo cloud-init clean",
]
}
使用具有此功能的模板构建的 AMI 将在
cloud-init
支持下启动。