0

我在从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可执行文件,并且我仍然困惑...

回答

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 CONFIGS运行其他命令的中间,causeing 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 
相关问题