service模块用于管理Linux系统服务,核心参数包括name(指定服务名)、state(started/stopped/restarted/reloaded)和enabled(yes/no控制开机自启),支持幂等操作与批量管理。

Ansible 的 service 模块是管理 Linux 系统服务状态最直接、最可靠的方式,无需登录每台机器手动执行 systemctl 或 service 命令,支持批量、幂等、可回溯的操作。
service 模块核心参数说明
该模块通过 state 和 enabled 两个关键参数控制服务的运行时状态与开机自启行为:
-
state:控制当前服务实例的状态
可选值:started(启动)、stopped(停止)、restarted(重启)、reloaded(重载配置,如systemctl reload nginx) -
enabled:控制服务是否开机自启
可选值:yes(启用)、no(禁用),设为yes会调用systemctl enable,no则对应disable -
name:必填项,指定服务名(如
httpd、sshd、docker),需与systemctl list-unit-files中显示的服务名完全一致 -
daemon_reload(可选):若修改了 systemd unit 文件,设为
yes可自动执行systemctl daemon-reload
常用操作示例(ad-hoc 方式)
在控制节点上,使用 ansible 命令行快速执行单步服务操作:
- 启动并启用 httpd 服务:
ansible webservers -m service -a "name=httpd state=started enabled=yes" - 停止并禁用 firewalld:
ansible all -m service -a "name=firewalld state=stopped enabled=no" - 仅重载 nginx 配置(不重启进程):
ansible nginx_nodes -m service -a "name=nginx state=reloaded" - 检查某服务当前是否运行(不改变状态):
ansible db -m service -a "name=mariadb state=started"—— 若已运行则返回changed=false,否则尝试启动
集成到 Playbook 实现状态保障
在生产环境中,推荐用 Playbook 确保服务始终处于期望状态。以下是一个典型任务片段:
- name: Ensure NTP service is running and enabled
service:
name: chronyd
state: started
enabled: yes
该任务具备幂等性:无论目标主机当前 chronyd 是否运行或已启用,执行后都会收敛到“运行中 + 开机自启”这一最终状态,且仅在实际发生变更时标记 changed=true。
注意事项与排错提示
使用 service 模块时需注意几个常见问题:
- 服务名大小写敏感,且必须匹配 systemd 单元名(例如 CentOS 7/8 中是
httpd,不是apache2;Ubuntu 中常为apache2) - 被控节点需安装 Python 且能调用
systemctl(主流发行版默认满足) - 若服务依赖其他单元(如 network.target),systemd 会自动处理,无需额外声明
- 遇到
Failed to reload daemon: No such file or directory,通常是daemon_reload: yes误用,确认是否真修改了 unit 文件 - 非 root 用户执行需加
become: true,否则权限不足无法操作服务











