ansible的systemd模块天然幂等,通过state参数(started/stopped等)和enabled参数分别控制服务运行状态与开机自启,支持异常状态清理、批量收敛及并发控制。

Ansible 的 systemd 模块天然支持幂等性,它会先查询目标服务当前状态(active/inactive/failed),再决定是否执行启停操作——重复运行不会改变已符合预期的状态。
用 systemd 模块声明服务期望状态
直接指定 state 参数即可让 Ansible 自动判断是否需要操作。比如确保 nginx 处于运行中:
- state=present:仅确保 unit 文件存在(不启动)
- state=started:确保服务正在运行(若未运行则启动;若已运行则跳过)
- state=stopped:确保服务已停止(若已停止则跳过)
- state=restarted:强制重启(非幂等,慎用)
-
state=reloaded:重载配置(如
nginx -s reload)
结合 enabled 控制开机自启
服务是否开机自启是独立于运行状态的属性,需单独设置 enabled 参数:
-
enabled: yes→ 启用自启(若已启用则无操作) -
enabled: no→ 禁用自启(若已禁用则跳过) - 可与
state: started同时使用,一次完成“启用+启动”
处理依赖或失败服务的健壮写法
某些服务启动失败后可能卡在 activating 或 failed 状态,单纯 state=started 不会自动清理。建议组合使用:
- 先用
state=stopped强制终止异常状态 - 再用
state=started重新拉起 - 加上
ignore_errors: yes防止 stop 失败中断流程(如服务本就不存在) - 必要时加
failed_when: false显式忽略特定错误
批量检查并修复全网节点服务状态
把多个服务统一管理进 playbook,配合 inventory 分组实现全网收敛:
- 定义主机组(如
[app_servers])包含所有目标节点 - 在任务中用
loop或with_items迭代服务名列表 - 每个任务只声明一个服务的期望状态,Ansible 自动逐个校验并按需操作
- 搭配
serial: 5可控制并发批次,避免全网同时重启影响业务











