我在从cfn-init
命令重新启动EC2实例时遇到问题。我在我的实例的CloudFormation::Init
元数据中有以下配置密钥。从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
),则会得到相同的错误消息,则它会挂起并创建堆栈创建时间。这些非常基本的命令是如何找不到的?我在这里错过简单的东西吗?任何帮助表示赞赏!
EDIT:根据this post,当公共命令不可用时,它可能是由于一个拧起来PATH
。实际上,CloudFormation::Init docs表示使用env
属性将覆盖当前环境,可能包括PATH
。但是,我在命令中添加了一行到我的模板echo $PATH
,并且产生了:“usr/local/bin:/bin:/usr/bin
”。所以我PATH
还包括路径bash
可执行文件,并且我仍然困惑...