Ansible 2.6.5无法停止rsyslog systemd服务问题求助
Ansible停止rsyslog后服务自动重启的解决办法
问题概况
在Ubuntu 18.04.6 LTS环境下,使用Ansible 2.6.5执行停止rsyslog服务的剧本,执行无报错,但服务会在停止后立刻自动重启。系统日志显示服务先被停止随即又被启动:
Mar 29 13:55:04 dev systemd[1]: Stopping System Logging Service... Mar 29 13:55:04 dev systemd[1]: Stopped System Logging Service. Mar 29 13:55:04 dev systemd[1]: Starting System Logging Service... Mar 29 13:55:04 dev systemd[1]: Started System Logging Service.
使用的Ansible剧本如下:
--- - name: Playbook hosts: localhost tasks: - name: Stop rsyslog service: name: rsyslog state: stopped
原因分析
出现这种情况通常有两种核心原因:
- Systemd socket激活机制:Ubuntu 18.04中rsyslog默认通过
syslog.socket实现socket激活,即使停止rsyslog服务,只要syslog.socket仍在运行,一旦有日志写入请求,systemd会自动重启rsyslog服务。 - 服务重启策略配置:rsyslog的systemd单元配置中可能设置了
Restart参数(如Restart=always或Restart=on-failure),导致服务停止后被systemd自动拉起。
解决方案
方案1:停止并禁用rsyslog及对应socket单元
改用Ansible的systemd模块(Ansible 2.2及以上支持),同时处理rsyslog服务和syslog.socket,避免socket触发重启:
--- - name: Playbook to stop rsyslog completely hosts: localhost tasks: - name: Stop and disable rsyslog service systemd: name: rsyslog state: stopped enabled: false daemon_reload: true - name: Stop and disable syslog socket systemd: name: syslog.socket state: stopped enabled: false
方案2:修改rsyslog的systemd重启策略
如果不需要彻底禁用socket,可修改rsyslog的服务重启规则:
- 先检查当前的重启策略:
systemctl show rsyslog | grep Restart
- 创建systemd配置重载文件(无需修改原单元文件):
# /etc/systemd/system/rsyslog.service.d/override.conf [Service] Restart=no
- 重载systemd配置并停止服务:
systemctl daemon-reload systemctl stop rsyslog
也可以用Ansible自动化这一步:
--- - name: Playbook to stop rsyslog with modified restart policy hosts: localhost tasks: - name: Create rsyslog systemd override config copy: dest: /etc/systemd/system/rsyslog.service.d/override.conf content: | [Service] Restart=no - name: Reload systemd daemon systemd: daemon_reload: true - name: Stop rsyslog service systemd: name: rsyslog state: stopped
方案3:临时屏蔽rsyslog服务(强制阻止启动)
如果需要临时彻底阻止rsyslog启动,可使用mask操作:
--- - name: Playbook to mask and stop rsyslog hosts: localhost tasks: - name: Mask rsyslog service to prevent auto-start systemd: name: rsyslog masked: true state: stopped
后续需要恢复服务时,执行systemd: name=rsyslog masked=false即可。
内容的提问来源于stack exchange,提问作者Elia
相关产品推荐
相关产品推荐

