本质是SSH连接卡在DNS反向解析,禁用UseDNS no可解决;需同步配置Ansible控制端ssh_config与被控端sshd_config,并优先使用IP而非主机名管理Inventory。

这个问题本质是 SSH 连接卡在 DNS 解析阶段,不是真死,而是超时等待。Ansible 默认使用系统解析逻辑,若目标主机名在 /etc/hosts 中未定义、又无法通过 DNS 正确反向解析,SSH 客户端会默认尝试反向 DNS 查询(即根据 IP 查主机名),这个过程可能阻塞数秒甚至更久,尤其在无 DNS 服务或网络策略限制的环境中。
确认是否为 DNS 解析导致的假死
执行带详细日志的 ping 测试,观察耗时点:
- 运行
ansible -i hosts all -m ping -vvv,关注输出中类似SSH: EXEC ssh -C -o ControlMaster=auto ...后是否长时间无响应 - 在目标机上临时抓包:
tcpdump -i any port 53,看是否有持续的 DNS 查询发出 - 手动用 SSH 模拟连接:
ssh -o ConnectTimeout=5 -o GSSAPIAuthentication=no -o StrictHostKeyChecking=no user@192.168.1.10,若同样卡顿,基本可定位为 SSH 层解析问题
禁用 SSH 反向 DNS 解析(最直接有效)
在 Ansible 控制节点的 SSH 客户端配置中关闭该行为,一劳永逸:
GitHub Hosts 更新工具(仅限中国用户),安全更新系统hosts文件,保留原有非GitHub条目,仅替换GitHub相关地址。支持备份恢复和风险提示。用于解决GitHub访问问题。
- 编辑
~/.ssh/config或全局/etc/ssh/ssh_config - 添加以下内容(作用于所有主机或按 Host 段指定):
Host *
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
ConnectTimeout 10
GSSAPIAuthentication no
UseDNS no - UseDNS no 是关键项,它禁止 SSH 服务端做反向解析,大幅缩短连接建立时间
补充:避免依赖主机名,统一用 IP 地址管理
Inventory 文件中不写主机名,直接用 IP,从源头规避解析需求:
- 错误写法:
web01.example.com ansible_host=192.168.1.10 - 推荐写法:
192.168.1.10 ansible_user=centos ansible_become=yes - 如需逻辑分组,用组名而非主机名:
[web]下直接列 IP,无需别名
验证与收尾
改完配置后,务必清除已有的 SSH 连接复用进程,避免旧连接缓存干扰:
- 运行
ansible-control-node$ pkill -f "ssh.*control"或ssh -O exit -S ~/.ansible/cp/* 127.0.0.1 - 再执行一次
ansible -i hosts all -m ping,响应应明显变快且稳定 - 若仍慢,检查目标机
/etc/ssh/sshd_config是否也设置了UseDNS no(建议同步配置)

















