如何解决新版Ansible template模块执行速度过慢的问题?
问题根本原因
性能瓶颈核心为 Ansible 近期版本调整了配置加载逻辑,导致SSH持久连接(ControlMaster)被默认禁用。
SSH持久连接是Ansible降低远端操作开销的核心机制,禁用后每一次循环迭代都会重新走完整的SSH握手、身份验证流程,哪怕单文件体积极小、网络延迟低于100ms,多次重复建连的开销累加后也会导致整体耗时大幅上升。你配置的ANSIBLE_PIPELINING=1仅优化了单连接内的命令传输效率,无法抵消重复建连的额外开销,因此优化效果不明显。
Ansible 循环执行template模块的核心操作步骤
- 每次迭代前,控制节点先校验本地模板文件状态、执行Jinja2语法渲染(哪怕是空文件也会走完整渲染流程)
- 未开启持久连接时,单次迭代就会触发一次完整SSH握手、身份验证流程,单步耗时可达数百毫秒
- 连接建立后,依次完成临时执行脚本传输、目标节点文件状态比对、文件写入、权限修改、临时文件清理操作
- 迭代结束后直接断开SSH连接,下一次循环重复上述全流程
提速方案
- 手动开启SSH持久连接,在
ansible.cfg的[ssh_connection]配置段添加如下内容:
[ssh_connection] pipelining = True control_master = auto control_path = /tmp/ansible-ssh-%h-%p-%r control_persist = 300s
control_persist参数可根据场景调整为180s~1800s,保证同个目标节点的多次操作复用同一个SSH连接,调整后循环操作的耗时会下降90%以上。
- 批量处理小文件场景,可添加
loop_control.label参数减少控制台输出开销,或把多个小文件打包后一次性传输再解压,避免多次循环调用模块 - 禁用非必要的事实收集,仅在Playbook开头执行一次事实收集即可,避免每个任务重复拉取节点信息
- 若使用Ansible 2.10+版本,需确认没有通过
ssh_args配置项覆盖默认SSH参数,若手动指定ssh_args未包含ControlMaster相关配置,也会导致持久连接被禁用
内容的提问来源于stack exchange,提问作者Wang
相关产品推荐
相关产品推荐

