44

我正在编写一个 CloudFormation 模板,并尝试调试我在模板中提供的用户数据脚本。如何cloud-init手动运行并使其执行与启动新实例时相同的操作?

4

6 回答 6

54

你可以像这样运行它:

/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,但您可能还会发现这个问题很有用:如何让 cloud-init 启动脚本在我的 EC2 实例每次启动时运行?

此处的 cloud init 文档只是为您提供了示例。但是它没有解释命令行选项或每个模块,所以你必须在配置中使用不同的值来获得你想要的结果。当然你也可以看代码。

于 2014-04-18T10:17:29.080 回答
9
rm -f /var/log/cloud-init.log \
&& rm -Rf /var/lib/cloud/* \
&& cloud-init -d init \
&& cloud-init -d modules --mode final
于 2018-11-26T11:30:00.813 回答
6

Kudus to @Rico,而且,如果你想运行一个模块 - 无论是为了测试还是因为你的发行版默认不启用模块(嗨,精确!),你可以

/usr/bin/cloud-init -d single -n <module-name>

例如,当我的发行版write_files默认不运行时(就像很多旧发行版一样),我在 runcmd 的顶部使用它:

runcmd:
 - /usr/bin/cloud-init -d single -n write-files

[我知道它并不是对 OP 的真正答案,但是在寻求解决我的问题时,这个问题是最好的结果之一,所以我认为其他人可能会觉得这很有用]

于 2016-11-21T19:56:20.343 回答
4

在大多数 Linux 发行版(包括 CentOS 和 Ubuntu)上,您可以使用 systemctl 重新启动 cloud-init 服务:

systemctl restart cloud-init

然后查看日志的输出,看看结果:

journalctl -f -u cloud-init
于 2016-04-14T05:49:05.280 回答
3

作为文档,您可以简单地运行

sudo cloud-init clean

并添加--logs以清理所有日志文件。重新启动时它将重做所有事情

于 2020-10-08T09:56:39.903 回答
0

在 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支持下启动。

于 2022-02-18T15:30:23.167 回答