【发布时间】: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