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