背景:
在自動化運維過程中,我們希望一些操作能隨開啟執行,第一反應就是把操作封裝在腳本中,然后腳本放到/etc/rc.local
中去執行,當然同時需要給該文件可執行權限
但是今天實際操作中碰到一個問題,需求是,在開啟自動執行更改/etc/postfix/main.cf
文件中的 myhostname
和 mydestination
為當前主機的主機名,但是更新失敗,獲取的是基礎鏡像的主機名,而不是新增主機配置的新的主機名
問題分析于排查
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