启用 ssh controlmaster 是提升 ansible 批量部署速度最有效的手段,通过 controlmaster=auto、controlpersist=5d 和 controlpath 三参数协同,可将连续执行耗时降低约8倍,并配合 pipelining 和 facts 优化进一步释放性能。

直接开启 SSH ControlMaster 是提升 Ansible 批量部署速度最有效、最易落地的手段之一。它不是“锦上添花”,而是解决 Ansible 核心瓶颈——反复建连耗时——的关键开关。实测显示,对同一主机连续执行 10 次命令,启用后总耗时可从 12 秒降至 1.5 秒左右,提速约 8 倍。
配置 ControlMaster 的三个必要参数
仅靠 ControlMaster=auto 不足以稳定复用,必须配合以下三项协同生效:
- ControlMaster=auto:告诉 SSH 自动判断是否复用或新建主连接
- ControlPersist=5d:指定主连接后台保持时间(建议设为 3–7 天),避免频繁重建
-
ControlPath:定义套接字文件路径,必须含
%h(主机)、%p(端口)、%r(用户)三变量,确保不同目标不冲突,例如:control_path = ~/.ansible/cp/%%h-%%p-%%r
Ansible 配置文件中的正确写法
修改 /etc/ansible/ansible.cfg 或 ~/.ansible.cfg,在 [ssh_connection] 区块下添加:
[ssh_connection] ssh_args = -C -o ControlMaster=auto -o ControlPersist=5d -o ControlPath=~/.ansible/cp/%%h-%%p-%%r control_path_dir = ~/.ansible/cp
注意:
• %%h 中的双百分号是 Ansible 配置转义要求,不可简写为 %h;
• 首次运行前需手动创建目录并设权限:mkdir -p ~/.ansible/cp && chmod 700 ~/.ansible/cp;
• 若提示权限错误,检查 ~/.ssh/config 是否存在同名 ControlPath 冲突项。
配套优化:让复用真正跑满性能
ControlMaster 单独启用已有效果,但搭配以下两项,才能释放全部潜力:
-
启用 pipelining:关闭脚本复制流程,改用 SSH 管道直传命令。在
ansible.cfg中加:pipelining = True,同时确保被控机/etc/sudoers中对应用户禁用 requiretty:Defaults:your_user !requiretty -
关闭 facts 收集(按需):若 playbook 不依赖主机信息,开头加
gather_facts: False;或全局启用缓存:gathering = smart<br>fact_caching = jsonfile<br>fact_caching_connection = ~/.ansible/facts_cache<br>fact_caching_timeout = 86400
验证长连接是否生效
执行任意 Ansible 命令(如 ansible all -m ping)后,立即运行:
ls -l ~/.ansible/cp/ netstat -tnp | grep :22 | grep ESTABLISHED
能看到 socket 文件生成,且 netstat 输出中存在持续的 ESTABLISHED 连接,即表示 ControlMaster 已成功驻留。后续任务将全部复用该通道,不再经历 TCP 握手与 SSH 认证。











