【问题标题】:How to run cloud-init manually?如何手动运行 cloud-init?
【发布时间】:2014-06-02 19:17:55
【问题描述】:

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

【问题讨论】:

    标签: amazon-ec2 cloud-init


    【解决方案1】:

    你可以像这样运行它:

    /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 startup scripts run every time my EC2 instance boots?

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

    【讨论】:

    • @Fluffy。是的,我做到了,为什么?
    • 好吧,我收到了cloud-init: error: invalid choice: 'start' (choose from 'query', 'init', 'modules', 'single')
    • 看起来你有不同的版本。可能是最新的 Ubuntu。运行:cloud-init init
    • 不会cloud-init init 只运行来自cloud_init_modules 的模块,跳过其余的运行?
    • 它应该运行和初始设置以及 cloud_init_modules 中的所有内容,但是当你第二次运行 cloud-init init 时它不会像第一次启动机器那样运行(因为它已经运行) 要强制它运行所有内容,解决方法是执行以下操作:( cd /var/lib/cloud/ && sudo rm -rf * ) 从命令行。如果你想在你的配置中运行其他模块,你也可以运行cloud-init -d modules
    【解决方案2】:

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

    systemctl restart cloud-init
    

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

    journalctl -f -u cloud-init
    

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        【解决方案4】:
        rm -f /var/log/cloud-init.log \
        && rm -Rf /var/lib/cloud/* \
        && cloud-init -d init \
        && cloud-init -d modules --mode final
        

        【讨论】:

        • 这可能比 OP 要求的“更好”?也就是说, cloud-init 不会执行您的删除操作,因此您的解决方案不会“执行相同的操作”吗?如果您添加几句话的评论,那么一切都会清楚!
        • 虽然上述解决方案没有重新运行失败的包下载和安装包(salt-minion),但这个解决方案确实做到了。
        【解决方案5】:

        As documentation,你可以直接运行

        sudo cloud-init clean
        

        并添加--logs 以清除所有日志文件。 重启后它会重做所有事情

        【讨论】:

          【解决方案6】:

          在 Amazon Linux 2 上,我们发现 cloud-init 在初始启动后运行,然后被删除。当我们使用 Packer 构建自定义 AMI,然后想要使用用户数据脚本启动它们时,这会导致问题。这是我们在构建结束时用来重置 cloud-init 的 Packer shell 配置程序(HCL2 格式):

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

          【讨论】:

            猜你喜欢
            • 2019-03-25
            • 2014-06-05
            • 2011-09-22
            • 1970-01-01
            • 2014-05-28
            • 1970-01-01
            • 1970-01-01
            • 2016-05-14
            • 2019-02-08
            相关资源
            最近更新 更多