【问题标题】:Rebooting From CloudFormation::Init Command从 CloudFormation::Init 命令重启
【发布时间】:2017-09-12 13:54:58
【问题描述】:

我无法通过 cfn-init 命令重新启动我的 EC2 实例。我的实例的 CloudFormation::Init 元数据中有以下配置键。

dns-hostname:
  commands:
    dns-hostname:
      env: { publicDns: !Ref PublicDns }
      command: |
        old=$(hostname)
        sed "s|HOSTNAME=localhost.localdomain|HOSTNAME=$publicDns|" --in-place /etc/sysconfig/network
        echo HOSTNAME changed from \"$old\" to \"$publicDns\"
        reboot
      ignoreErrors: true

该命令应该做的就是将实例的主机名更改为提供的公共 DNS 名称。此更改需要重新启动才能生效,由于cfn-init 不知道这一点,我必须在最后一行中包含对reboot 的实际调用。不幸的是,构建失败并显示以下日志消息(来自/var/log/cfn-init.log):

2017-04-16 12:16:00,301 [DEBUG] Running command dns-hostname
2017-04-16 12:16:00,301 [DEBUG] Running test for command dns-hostname
2017-04-16 12:16:00,309 [DEBUG] Test command output: HOSTNAME will be changed to "bastion.example.com"
2017-04-16 12:16:00,309 [DEBUG] Test for command dns-hostname passed
2017-04-16 12:16:00,321 [ERROR] Command dns-hostname (old=$(hostname)
sed "s|HOSTNAME=localhost.localdomain|HOSTNAME=$publicDns|" --in-place /etc/sysconfig/network
echo HOSTNAME changed from \"$old\" to \"$publicDns\"
reboot
) failed
2017-04-16 12:16:00,321 [DEBUG] Command dns-hostname output: HOSTNAME changed from "ip-10-0-128-4" to "bastion.example.com"
/bin/sh: line 3: reboot: command not found
2017-04-16 12:16:00,321 [INFO] ignoreErrors set to true, continuing build

显然,实际的主机名更改并没有失败,只是调用reboot。如果我尝试使用shutdown -r 而不是reboot,我会收到相同的错误消息,并且如果我尝试使用绝对路径(sbin/reboot),那么它只会挂起并且堆栈创建超时。这些非常基本的命令怎么找不到?我在这里错过了一些简单的东西吗?任何帮助表示赞赏!

编辑:根据this post,当常用命令不可用时,可能是由于PATH搞砸了。事实上,CloudFormation::Init docs 表示使用env 属性将覆盖当前环境,可能包括PATH。但是,我在我的模板中添加了一行到命令中的echo $PATH,结果为:“usr/local/bin:/bin:/usr/bin”。所以我的PATH 仍然包含bash 可执行文件的路径,我仍然很困惑...

【问题讨论】:

    标签: linux amazon-web-services amazon-ec2 amazon-cloudformation


    【解决方案1】:

    好吧,看起来env 属性的问题。尽管我认为我的PATH 仍然有必要的路径来找到bash 可执行文件并因此运行reboot 命令,但直到我从模板中删除env 属性之后,一切都能够构建成功。我仍然无法让reboot 命令按预期运行,因为该命令似乎不会在您调用它时立即运行。例如,以下代码将在重新启动之前输出数字 1-10。

    echo 1
    echo 2
    echo 3
    echo 4
    echo 5
    reboot
    echo 6
    echo 7
    echo 8
    echo 9
    echo 10
    

    因此,实例显然会在运行来自以后的CloudFormation::Init 配置的其他命令时尝试重新启动,从而导致cfn-init 失败。我对此的解决方案是运行带有commands 块的配置,在所有其他配置之后手动调用reboot。长话短说,这里是工作模板 sn-p:

    other-config:
      ...
    
    # This config comes after the other b/c it manually calls 'reboot'
    dns-hostname:
      commands:
        dns-hostname:
          command: !Sub |
            publicDns=${PublicDns}
            old=$(hostname)
            sed "s|HOSTNAME=localhost.localdomain|HOSTNAME=$publicDns|" --in-place /etc/sysconfig/network
            echo HOSTNAME changed from \"$old\" to \"$publicDns\"
            reboot
          ignoreErrors: true
    # Any other configs that call reboot can follow
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 2019-08-01
      • 2013-02-04
      • 2015-01-10
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多