Ansible操作Azure虚拟机偶发HTTPSConnectionPool导致UNREACHABLE错误求助
报错日志:
fatal: [<< server_name>> ]: UNREACHABLE! => {"changed": false, "msg": "ntlm: HTTPSConnectionPool(host='<<host_name>>', port=5986): Max retries exceeded with url: /wsman (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f9e0b3f7790>: Failed to establish a new connection: [Errno -3] Try again'))", "unreachable": true}所用Ansible环境信息:
ansible [core 2.11.1] config file = /home/jenkins/agent/workspace/Sandboxes/VinSandbox/TST02-EscherCpxEcpDelivery (R8 AIO Manual)/ansible.cfg configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.8/site-packages/ansible ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections executable location = /usr/bin/ansible python version = 3.8.10 (default, May 6 2021, 00:05:59) [GCC 10.2.1 20201203] jinja version = 3.0.1 libyaml = False
排查思路
该报错是Ansible通过WinRM HTTPS协议(端口5986)连接Windows目标机时,网络链路/服务配置异常导致的间歇性连通失败,Errno -3多对应DNS解析异常、临时网络丢包、SNAT端口耗尽三类场景,可按以下步骤排查:
- 验证DNS解析稳定性:在Ansible控制节点持续执行
nslookup <目标VM地址>24小时以上,统计是否存在解析失败记录,Azure跨区域访问时公共DNS偶发秒级超时是高频诱因。 - 检查WinRM服务配置:登录报错过的VM执行
winrm get winrm/config,确认MaxConcurrentOperationsPerUser、MaxConnections参数值,默认值低于50时,并发连接请求过多会直接触发拒绝。 - 排查Azure网络限制:查看VM所属子网NSG流日志,确认5986端口是否存在间歇性流量丢弃;同时检查Jenkins控制节点的公网出口SNAT端口使用情况,多台VM并行部署时容易触发SNAT端口耗尽,导致临时连接失败。
- 核对Ansible连接参数:检查
ansible.cfg中WinRM相关配置,默认超时时间短、重试次数少会将正常的网络波动直接判定为不可达。
解决方案
以下方案按落地优先级排序:
- 调整Ansible WinRM连接参数,在
ansible.cfg中新增如下配置,覆盖临时网络波动窗口:
[defaults] winrm_connection_timeout = 30 winrm_retries = 5 winrm_retry_delay = 3
- 升级WinRM依赖组件,旧版本urllib3存在连接池复用bug,执行如下命令升级即可:
pip install --upgrade pywinrm requests urllib3
- 调整目标VM的WinRM并发配置,在所有目标Windows VM上执行以下PowerShell命令:
Set-Item WSMan:\localhost\MaxConcurrentOperationsPerUser 100 Set-Item WSMan:\localhost\Service\MaxConnections 100 Restart-Service WinRM -Force
- 同区域部署场景下,将Ansible inventory中的主机地址替换为VM私有IP,绕开公网DNS解析和SNAT端口限制,可大幅降低网络波动概率。
- 在Ansible控制节点部署dnsmasq或开启systemd-resolved DNS缓存,避免每次连接都请求公共DNS,减少解析失败概率。
内容的提问来源于stack exchange,提问作者user1
相关产品推荐
相关产品推荐

