美文网首页Linux运维运维
自动化运维之rc.local中hostname获取失败

自动化运维之rc.local中hostname获取失败

作者: 菩提老鹰 | 来源:发表于2021-09-18 11:08 被阅读0次

    背景:

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

    相关文章

      网友评论

        本文标题:自动化运维之rc.local中hostname获取失败

        本文链接:https://www.haomeiwen.com/subject/umiegltx.html