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 
相關問題