ansible 默认并发数为 5,可通过调整 forks(如设为 cpu 核心数的 1.5–2 倍)、启用 async/poll 异步执行、禁用 facts 收集、开启 pipelining、优化模块批量调用及按 inventory 分组限流等方式提升批量执行效率。

Ansible 默认只用 5 个并发连接执行任务,面对几十台甚至上百台主机时,批量执行会明显变慢。调优关键在于合理提升并发能力,同时避免资源过载或任务逻辑冲突。
调整全局并发数(forks)
这是最直接的调优方式。forks 控制 Ansible 同时连接并操作的目标主机数量,默认值为 5。
- 查看当前配置:
ansible-config dump | grep -i forks - 临时生效:运行时加
-f 20(如ansible-playbook site.yml -f 20) - 永久生效:在
ansible.cfg中修改forks = 20(建议设为 CPU 核心数的 1.5–2 倍,但不超过 100) - 注意:值过大可能压垮控制节点或目标主机 SSH 连接数,尤其在低配环境或高延迟网络中需实测收敛
按任务启用异步执行(async + poll)
适用于耗时长、无需阻塞后续步骤的任务,比如启动服务、触发备份、运行数据库迁移等。
-
async: 600表示最多等待 600 秒;poll: 10表示每 10 秒轮询一次状态 - 若任务启动即返回(如
nohup /path/script.sh &),设poll: 0,Ansible 不等待,立即继续下一个 task - 若任务必须等完成才能往下走(如依赖生成的文件),就不要用 async,保持同步语义
跳过不必要的开销
并发数上去了,但单个主机上的冗余操作仍会拖慢整体节奏。
- 禁用 facts 收集:
gather_facts: false(前提是 playbook 不依赖ansible_os_family等变量) - 关闭 SSH pipelining(已在新版默认开启):确认
pipelining = true可减少每次命令的 SSH 连接开销 - 避免在循环中反复调用模块(如用
with_items装多个包),改用原生支持批量的参数(如yum: name={{ packages }} state=present)
结合 inventory 分组与 limit 精准控制
不是所有机器都需要同一时间执行,尤其是跨地域或混合环境。
- 按角色或区域划分主机组(如
[web]、[db]、[cn-east]),再用--limit web分批执行 - 配合
--start-at-task或tags避免重复全量跑,提升调试和补救效率 - 对敏感操作(如重启、内核升级),先用
-C(check mode)预检,再分批上线











