调优ansible并发需“够用且稳定”:forks建议设为cpu核数2–4倍并受ssh限制约束,serial分批滚动执行(如serial: 10或"25%"),配合throttle、pipelining、禁用facts等降低开销。

Ansible 默认按批并行执行任务,但面对数百上千台节点时,盲目提高并发数反而会拖慢整体速度——连接争抢、内存溢出、远端负载过载都可能发生。真正有效的并发控制,是“够用且稳定”的节奏管理,而不是堆数量。
调整 forks 数值,匹配硬件与网络实际承载力
forks 决定了 Ansible 同时连接多少台目标主机,默认通常是 5。对大规模环境,需结合控制节点 CPU 核心数、可用内存和被管节点 SSH 连接上限来设值:
- 一般建议设为 CPU 核心数的 2–4 倍(例如 8 核服务器可试设 forks = 24)
- 若被管节点 SSH 限制了 MaxStartups(如默认 10),则单台最多承受约 10 个并发连接,总并发不宜超过 节点数 × 10 × 0.7(留缓冲)
- 可通过 ansible -i hosts all -m ping -f 100 快速测试不同 forks 下的稳定性与耗时
用 serial 分批执行,避免单次压垮整条链路
相比全局提高 forks,serial 更适合高风险或资源敏感场景(如数据库升级、内核更新)。它让 Playbook 按固定批次滚动执行,每批内部仍可并发:
- 写法示例:serial: 10 表示每次只对 10 台主机运行整个 Playbook
- 支持动态比例:serial: "25%" 适用于节点数不固定的环境
- 配合 throttle: 3 可进一步限制某类重负载任务(如大文件同步)在每批中最多同时跑 3 个
启用 SSH 复用与 pipelining,降低单连接开销
并发提升的前提是单次连接足够轻量。否则 fork=100 只会建立 100 个又慢又重的 SSH 通道:
- 在 ansible.cfg 中启用 SSH 多路复用:
[ssh_connection]
ssh_args = -C -o ControlMaster=auto -o ControlPersist=600s -o ControlPath=~/.ansible/cp/ansible-ssh-%h-%p-%r - 开启 pipelining(需确保被管端 sudo 配置中已注释 requiretty):
pipelining = True - 这两项能让单个 SSH 连接复用多次任务传输,减少密钥交换、脚本上传等重复动作
禁用 facts 收集 + 合理使用缓存,砍掉高频冗余操作
Gathering Facts 是每个 Playbook 的默认首步,对上千台节点意味着上千次 Python 解释器启动和系统探测,极易成为瓶颈:
- 确认 Playbook 不依赖 ansible_facts(如不查 os_family、mem_total 等)时,直接加 gather_facts: false
- 若需部分 facts,改用 gather_subset: ['min', 'network'] 精简采集范围
- 对不变或低频变的 facts,启用 Redis 缓存:
fact_caching = redis
fact_caching_timeout = 86400
fact_caching_connection = "localhost:6379:0"(需 pip install redis)











