ansible大规模并发性能瓶颈主要源于ssh建连开销、重复认证、fact冗余收集及控制机调度不合理;优化核心是复用ssh连接(controlpersist)、启用pipelining并禁用requiretty、合理调高forks并关闭密钥检查、启用jsonfile facts缓存。

Ansible 大规模并发时的连接性能瓶颈,主要出在 SSH 建连开销大、重复认证多、fact 收集冗余、以及控制机资源调度不合理。优化核心是减少连接次数、复用已有通道、精简远程操作,并适配被控端环境。以下四点最直接有效:
1. 启用 SSH 连接复用(ControlPersist)
这是提升并发效率最关键的一步。避免每台主机每次任务都新建 SSH 连接,改用长连接池管理。
- 在 /etc/ansible/ansible.cfg 的
[ssh_connection]段添加:
[ssh_connection] ssh_args = -C -o ControlMaster=auto -o ControlPersist=600s control_path = /tmp/ansible-ssh-%%r@%%h:%%p
-
ControlPersist=600s表示连接空闲后保持 10 分钟;可根据任务间隔调至 300–3600 秒 -
control_path目录需存在且当前用户有读写权限(如mkdir -p /tmp/ansible-ssh && chmod 700 /tmp/ansible-ssh) - 要求 OpenSSH 客户端 ≥ 5.6(CentOS 7+/Ubuntu 16.04+ 默认满足)
2. 开启 pipelining 并禁用 requiretty
跳过临时文件上传步骤,把任务直接通过 SSH 会话执行,大幅减少 I/O 和进程创建次数。
- 在
[defaults]段启用:
[defaults] pipelining = True
- 同时必须在所有被控节点的 /etc/sudoers 中注释掉这一行:
# Defaults requiretty
- 若使用
become: yes但未配 sudo,或用 root 直连,则无需修改 sudoers
3. 调整并发数(forks)与关闭密钥检查
默认仅 5 路并发,远不能压满带宽;首次连接卡在 known_hosts 校验也会拖慢整体节奏。
- 在
[defaults]段设置合理并发值(建议从 30 起测,最高不超过控制机 CPU 核数 × 4):
[defaults] forks = 40 host_key_checking = False
-
host_key_checking = False等效于 SSH 的-o StrictHostKeyChecking=no,跳过公钥确认 - 注意:该配置仅降低首次连接交互耗时,不降低安全风险;生产环境应配合可信内网或证书体系使用
4. 启用 Facts 缓存(避免重复收集)
大规模场景下,每台机器反复执行 Gathering Facts 占用大量连接和解析时间。缓存可让后续运行毫秒级读取。
- 推荐轻量级
jsonfile后端(无需部署 Redis):
[defaults] gathering = smart fact_caching = jsonfile fact_caching_connection = /tmp/ansible_facts fact_caching_timeout = 3600
- 提前创建缓存目录:
mkdir -p /tmp/ansible_facts && chmod 700 /tmp/ansible_facts -
gathering = smart表示只对新主机或缓存过期主机收集;已缓存则跳过 - 若 playbook 完全不需要 facts,直接加
gather_facts: false更彻底











