ansible批量启停多台机器服务的核心是抽象任务、用inventory分组管理主机、通过playbook统一调度;无需脚本和被控端额外软件,仅需python和openssh,支持变量传参、幂等操作、滚动重启及状态校验。

用 Ansible 批量启停多台机器上的服务,核心在于把服务控制逻辑抽象成可复用的任务,并通过 Inventory 管理目标主机,再结合 Playbook 统一调度。不需要写脚本、不依赖被控端额外软件(只需 Python 和 OpenSSH),适合运维日常维护。
定义清晰的 Inventory 分组
按服务类型或环境对主机分组,是批量操作的前提。例如:
[web_servers] app01 ansible_host=192.168.1.10 app02 ansible_host=192.168.1.11 <p>[db_servers] db01 ansible_host=192.168.1.20</p><p>[all:children] web_servers db_servers</p>
- 用 group 区分不同服务角色,后续可针对组执行特定操作
- 支持变量内嵌,如
ansible_port=2222或ansible_user=deploy,适配非标 SSH 配置 - 生产环境建议用动态 Inventory(如从 CMDB 或云平台拉取),避免手动维护
编写幂等的服务控制 Playbook
Ansible 的 systemd 模块天然支持 start/stop/restart/reload,且默认具备幂等性(比如重复执行 state: started 不会报错也不会重复启动):
- name: Manage service across servers
hosts: "{{ target_group | default('all') }}"
become: true
vars:
service_name: "nginx"
service_state: "started" # or "stopped", "restarted"
<p>tasks:</p>
- name: Ensure {{ service_name }} is {{ service_state }} systemd: name: "{{ service_name }}" state: "{{ service_state }}" enabled: no # 启停不自动改开机自启,按需设置
- 用 变量控制服务名与状态,一条 Playbook 适配多种服务和操作
-
become: true是必须的,因服务管理需 root 权限 - 加
ignore_errors: yes可跳过某台机器上服务不存在的报错(谨慎使用)
按需触发不同启停场景
通过命令行传参灵活切换目标组和服务行为,避免为每个场景写新 Playbook:
- 启动所有 Web 服务:
ansible-playbook manage_service.yml -e "target_group=web_servers service_state=started service_name=nginx" - 停止数据库服务并禁用自启:
ansible-playbook manage_service.yml -e "target_group=db_servers service_state=stopped" -e "service_name=mariadb" --extra-vars "enabled=no" - 滚动重启(避免全站中断):
ansible-playbook manage_service.yml -e "service_state=restarted" --limit app01,再换主机执行
增强可靠性与可观测性
简单启停之外,加上状态检查和失败响应,让操作更稳:
- 重启后加
wait_for检查端口或 HTTP 健康页,确认服务真正就绪 - 用
register捕获 systemd 返回结果,在failed_when中自定义失败条件(如要求 active 状态) - 配合
ansible-runner或 Jenkins 封装为按钮式操作,降低误操作风险











