自動化運維之rc.local中hostname獲取失敗

背景:

在自動化運維過程中,我們希望一些操作能隨開啟執行,第一反應就是把操作封裝在腳本中,然后腳本放到/etc/rc.local中去執行,當然同時需要給該文件可執行權限

但是今天實際操作中碰到一個問題,需求是,在開啟自動執行更改/etc/postfix/main.cf文件中的 myhostnamemydestination 為當前主機的主機名,但是更新失敗,獲取的是基礎鏡像的主機名,而不是新增主機配置的新的主機名

問題分析于排查

1、通過在腳本中添加額外debug日志確認獲取的主機名

發現腳本輸出的就是 基礎鏡像的主機名,也就是沒有獲取到當前主機的主機名

2、分析系統啟動日志

通過如下命令分析系統啟動日志

grep hostname /var/log/message

發現一開始獲取的主機名是 基礎鏡像的,后來才在某個節點更新當前主機名為配置的新主機名

Sep 17 17:38:27 devops-demo-05-vpc systemd[1]: Started init after host start.
Sep 17 17:38:27 devops-demo-05-vpc systemd[1]: Starting init after host start...
Sep 17 17:38:27 devops-demo-05-vpc init_system.sh[842]: not include
Sep 17 17:38:33 devops-instance-09-vpc init_system.sh[842]: taskset cpu affinity.
Sep 17 17:38:33 devops-instance-09-vpc init_system.sh[842]: taskset: failed to set pid 1808's affinity: Invalid argument
Sep 17 17:38:33 devops-instance-09-vpc init_system.sh[842]: pid 1808's current affinity list: 0
Sep 17 17:38:33 devops-instance-09-vpc init_system.sh[842]: Start filebeat success

3、也就是說是主機名是在某個節點 才更新的,換句話說分析就是,需要確認主機名變更為最新的 之后我們才能執行分裝的腳本。

所以關鍵就是:前后執行順序的 問題

4、所以就想到centos的管理神器systemd

所以新增自定義啟動服務,/usr/lib/systemd/system/initSystem.service

[Unit]
Description=init after host start
After=network.target systemd-hostnamed.service syslog.target

[Service]
ExecStart=/opt/scripts/init_system.sh

[Install]
WantedBy=multi-user.target

注意核心在于 Unit 配置中的 After 配置項中添加 systemd-hostnamed.service 該服務就是做主機名變更的服務

然后加入開啟自動啟 systemctl enable initSystem.service

5、重新打包基礎鏡像,然后用該基礎鏡像創建主機,發現結果符合我們預期

參考
https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容