Ansible的systemd模块在启动服务前会自动执行daemon-reload吗?
Ansible复制systemd服务文件后启动服务的正确姿势
当你用Ansible把新的.service文件复制到/etc/systemd/system/目录后,必须让systemd重载配置才能识别这个新服务,否则直接启动会失败。关于systemd模块的daemon_reload参数,这里给你讲透实际逻辑:
官方对这个参数的描述确实有点绕,实际行为是:
- 默认情况下,哪怕你用systemd模块执行启动、停止、重启这类状态变更操作,模块不会自动执行
systemctl daemon-reload - 只有显式设置
daemon_reload: true时,模块才会先执行systemctl daemon-reload,再处理服务的状态变更(比如启动服务) - 官方描述里的“即使模块未启动或停止任何服务,也会执行daemon-reload”,意思是哪怕你只想单纯重载systemd配置、不改变服务状态,设置这个参数为true也能触发reload操作
所以你的剧本里,复制完服务文件后,启动服务的task必须加上daemon_reload: true,否则systemd找不到新的服务文件,启动会报错。修正后的剧本如下:
- name: Install Foo hosts: all tasks: - name: 复制SystemD服务文件 become: true copy: src: ./foo.service dest: /etc/systemd/system/ - name: 确保服务处于运行状态 become: true systemd: name: mqtt-button.service enabled: true state: started daemon_reload: true # 关键:重载systemd配置,让新服务被识别
补充:如果后续修改了已存在的service文件,同样需要在对应的systemd模块task里加上daemon_reload: true,否则systemd不会读取更新后的配置。
内容的提问来源于stack exchange,提问作者lindhe
相关产品推荐
相关产品推荐

