从CloudFormation :: Init命令重新启动

时间:2017-04-16 23:13:03

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

我无法从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可执行文件的路径,我仍然感到困惑......

1 个答案:

答案 0 :(得分: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。简而言之,这是工作模板片段:

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