我正在使用 cloud-init/cloud-config 配置一个 OpenStack 机器。我打算等到它完全配置好后再开始使用它。
使用一些标记文件或检测 cloud-init 进程是否仍在运行并不难,尽管在每个 cloud-init 脚本中这样做似乎很麻烦。有什么推荐的方法吗?理想情况下,由 cloud-init 原生支持?
我正在使用 cloud-init/cloud-config 配置一个 OpenStack 机器。我打算等到它完全配置好后再开始使用它。
使用一些标记文件或检测 cloud-init 进程是否仍在运行并不难,尽管在每个 cloud-init 脚本中这样做似乎很麻烦。有什么推荐的方法吗?理想情况下,由 cloud-init 原生支持?
以下命令可以解决问题:
cloud-init status --wait
来自https://ubuntu.com/blog/cloud-init-v-18-2-cli-subcommands:
cloud-init status
为 cloud-init 正在做什么以及是否成功完成提供简单的人类可读或编程输出。它可以用作机器上的健全性检查或脚本中的阻塞,直到 cloud-init 成功完成。
另一种选择是在完成后让 cloud-init电话回家。
最简单的答案是在实例上设置一个标签,以便您可以轮询它的存在。
如果您有 Linux 主机,请最后执行此操作:
aws ec2 create-tags --resources `ec2metadata --instance-id` --tags Key=BootstrapStatus,Value=complete
这避免了需要设置网络端点、创建故障点或 SSH 连接、创建安全凭证的需要。
正如@flyxiao 指出的那样, cloud-init 将状态信息放入文件系统上的专用目录中:(/run/cloud-init/
首选,/var/lib/cloud/data/
因为它保证描述最后一个 init 进程)。status.json
包含有关所有初始化阶段的详细信息,并result.json
表示整个初始化已完成。项目文档建议使用 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"
您可以检查 /var/lib/cloud/data/status.json 的 cloud-init 状态。或者如果主机使用upstart,在/etc/init/newprocess.conf 中添加一个init 进程,newprocess.conf 应该在cloud-final 之后启动。