Ansible无法连接远程主机通常源于SSH连通性或目标主机环境问题:先用ssh -v user@host_ip验证基础连接,排查认证失败、Connection refused或网络超时;再检查密钥分发、目录权限(~/.ssh 700、authorized_keys 600)、inventory配置、host_key_checking设置及目标主机Python环境与json模块是否完备。

Ansible 无法连接远程主机,多数情况不是 Ansible 本身出错,而是 SSH 连通性或目标主机环境出了问题。排查要从“能不能连上”开始,而不是直接看 Playbook 是否写对。
检查 SSH 基础连通性
先在控制节点手动用 SSH 尝试登录目标主机,这是最直接的验证方式:
- 运行 ssh -v user@host_ip(比如 ssh -v root@192.168.15.4),-v 参数会显示详细连接过程,重点关注认证方式是否被拒绝、是否卡在密钥交换或密码提示阶段
- 如果提示 Permission denied (publickey,gssapi-keyex,...),说明 SSH 认证失败,常见原因是公钥没正确复制到目标主机的 ~/.ssh/authorized_keys
- 如果提示 Connection refused,说明目标主机的 sshd 服务未运行或防火墙拦截了 22 端口
- 如果提示 No route to host 或超时,需检查网络层:目标主机是否开机、IP 是否配错、中间路由或安全组是否放行
确认 SSH 密钥与用户权限配置
Ansible 默认走 SSH 免密登录,依赖正确的密钥分发和权限设置:
- 控制节点执行 ssh-keygen 生成密钥对(若尚未生成)
- 用 ssh-copy-id -i ~/.ssh/id_rsa.pub user@host_ip 把公钥推送到目标主机对应用户的 ~/.ssh/authorized_keys 文件中
- 检查目标主机该用户家目录及 ~/.ssh 目录权限:~ 和 ~/.ssh 必须是 700,~/.ssh/authorized_keys 必须是 600,否则 sshd 会拒绝登录
- 若使用非 root 用户,确保该用户有 sudo 权限(如需提权),并在 ansible.cfg 或 inventory 中配置 become: yes 和对应 become_method
验证 Ansible 主机清单与配置项
即使 SSH 能通,Ansible 仍可能因配置不匹配而报 UNREACHABLE:
- 检查 /etc/ansible/hosts(或自定义 inventory 文件)中主机 IP/域名是否拼写正确,端口是否非默认(如用了 2222,则需写成 host_ip:2222)
- 确认 ansible.cfg 中关键配置未被误禁用:host_key_checking = False 可跳过首次连接指纹确认(避免因 known_hosts 缺失导致失败);remote_user 应设为目标主机上已配置好密钥的用户名
- 运行 ansible -m ping all -i your_inventory_file 测试基础连通性,比跑 Playbook 更轻量、更聚焦连接问题
排除目标主机侧运行环境问题
有些错误看起来像连接失败,实则是远程主机缺少 Ansible 执行依赖:
- 目标主机必须安装 Python(通常要求 2.7+ 或 3.6+),执行 ssh user@host_ip 'python3 --version' 验证
- 常见报错 ansible requires a json module, none found! 表明 Python 环境缺失 json 模块,多见于最小化安装系统,可运行 yum install -y python3-json(CentOS/RHEL)或 apt install -y python3-json(Ubuntu/Debian)修复
- 若使用非标准 Python 路径(如 /usr/local/bin/python3),需在 inventory 中通过 ansible_python_interpreter=/usr/local/bin/python3 显式指定


















