如何检测cloud-init是否完成初始化

16

我正在使用cloud-init/cloud-config配置OpenStack。 我希望在开始使用之前等到它完全配置完成。

虽然使用一些标记文件或检测cloud-init进程是否仍在运行并不难,但在每个cloud-init脚本中执行这样的操作似乎相当麻烦。 有没有一些推荐的方式? 最好由cloud-init原生支持?

5个回答

21

以下命令可解决问题:

cloud-init status --wait

来自https://ubuntu.com/blog/cloud-init-v-18-2-cli-subcommands

cloud-init status 提供了简单易读的输出或可编程输出, 用于显示 cloud-init 正在做什么以及它是否已成功完成。 它可以用作机器的健康检查,或者用于脚本中阻止运行, 直到 cloud-init 成功完成。


6
另一种选择是在云初始化完成后让其进行 上线通知
phone_home:
    url: https://example.com/$INSTANCE_ID/
    post:
        - pub_key_dsa
        - instance_id
        - fqdn
    tries: 10

1
听起来不错,但链接已经失效了。这是为什么你需要在SO上包含你的答案的一个典型例子。 - kthy
1
好的,我更新了答案。 - Oliver Gondža

3
正如@flyxiao指出的,cloud-init将状态信息放入了一个专用目录中: /run/cloud-init/(优先于/var/lib/cloud/data/,因为它保证了描述最后一个初始化过程)。status.json包含所有init阶段的详细信息,而result.json表示整个init已经完成。该项目文档建议使用一个Python脚本来检测cloud-init的完成情况。
 fin = "/run/cloud-init/result.json"
 if os.path.exists(fin):

   ret = json.load(open(fin, "r"))

   if len(ret['v1']['errors']):

     print "Finished with errors:" + "\n".join(ret['v1']['errors'])

   else:

     print "Finished no errors"

 else:

   print "Not Finished"

谢谢,非常有用。还需要检查是否安装并启用了cloud-init IMO :) ..以防某些人使用带有和不带有cloud-init的混合镜像。 - akostadinov
1
显然,现在有一个专门的命令 - cloud-init status。更多信息可在此处找到:(https://ubuntu.com/blog/cloud-init-v-18-2-cli-subcommands)。 - Alexander Kucheryuk

3
最简单的方法是在实例上设置一个标记,以便您可以轮询其存在。
如果您有Linux主机,请将此操作放在最后:
aws ec2 create-tags --resources `ec2metadata --instance-id` --tags Key=BootstrapStatus,Value=complete

这样做可以避免设置网络终点、创建故障点或SSH登录,从而创建安全凭据的需求。

没错,虽然需要云初始化的帮助和机器能够与云提供商通信。 - Oliver Gondža
这将需要从用户数据中运行(作为最后一行),这并不保证cloud-init已经完成(它可能在用户数据运行之后继续执行其他操作,比如打印ec2实例指纹等)。 - undefined

2
您可以查看 /var/lib/cloud/data/status.json 以获取 cloud-init 状态。 如果主机正在使用 upstart,请在 /etc/init/newprocess.conf 中添加一个 init 进程,newprocess.conf 应在 cloud-final 后启动。

我正在RHEL上使用cloud-init 0.7.6,但没有newprocess.conf文件。你能提供文档链接吗?我会查看/var/lib/cloud/data/*.json - Oliver Gondža
也许 /var/lib/cloud/data/*.json 适合您,我需要一个清晰的 newprocess.conf 解决方案。如果您的 RHEL 使用 upstart 作为操作系统 init,则可以更改 /etc/init/cloud-init-local.conf(删除一个临时文件),/etc/init/cloud-final.conf(生成一个临时文件)。如果您的 RHEL 使用 systemd 作为操作系统 init,则更改 cloud-init-local.service 和 cloud-final.service。 - flyxiao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接