背景:
在自动化运维过程中,我们希望一些操作能随开启执行,第一反应就是把操作封装在脚本中,然后脚本放到/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
网友评论