Ansible在收集事实阶段SSH连接挂起问题求助
解决Ansible在Gathering Facts阶段SSH连接挂起的问题
问题现象
- Ansible 2.9.6执行
ansible-playbook -i hosts docker-server.yml时,在**TASK [Gathering Facts]**阶段SSH连接挂起 - 中断操作后直接用SSH命令连接目标主机正常,Ansible ping模块运行也正常
- 仅重启目标主机可临时解决,但无长期有效方案
触发挂起的SSH命令:
ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o Port=22 -o 'IdentityFile=ot/.ssh/ssh_key' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="root"' -o ConnectTimeout=10 -o ControlPath=/root/.ble/cp/6ae141a49f HO.ST.I.P '/bin/sh -c "echo ~root && sleep 0"'
排查与解决方法
1. 关闭SSH连接复用(ControlPersist)
Ansible默认使用ControlMaster=auto和ControlPersist=60s复用SSH连接,这是导致挂起的常见原因。修改ansible.cfg配置:
[ssh_connection] control_persist = 0 control_master = no
修改后重新执行playbook,观察是否仍会挂起。
2. 调整Gathering Facts策略
默认全量收集facts可能触发异常操作,尝试以下调整:
- 改用智能收集模式:
- hosts: all gather_facts: smart - 仅收集必要的facts子集:
- hosts: all gather_facts: yes setup: gather_subset: - "!all" - "!min" - network - 关闭自动收集,手动执行带超时的setup模块:
- hosts: all gather_facts: no tasks: - name: 手动收集facts setup: timeout: 30
3. 优化SSH客户端参数
调整认证顺序与连接参数,修改ansible.cfg:
[ssh_connection] ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o Port=22 -o KbdInteractiveAuthentication=no -o PreferredAuthentications=publickey,gssapi-with-mic,gssapyex,hostbased -o PasswordAuthentication=no -o ConnectTimeout=15
将publickey置于认证顺序最前,避免gssapi相关的耗时认证尝试。
4. 检查目标主机sshd配置
登录目标主机,修改/etc/ssh/sshd_config:
- 关闭DNS反向解析:
UseDNS no - 调整连接阈值:
MaxSessions 10 MaxStartups 10:30:100
修改后重启sshd服务:systemctl restart sshd
5. 升级Ansible版本
Ansible 2.9.6存在已知的SSH连接相关bug,建议升级到2.9系列最新稳定版(如2.9.27)或更高版本(如2.10+),多数同类问题已在新版本中修复。
内容的提问来源于stack exchange,提问作者sivsoft
相关产品推荐
相关产品推荐

