我在從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
可執行文件,並且我仍然困惑...