执行Ansible Playbook时Docker主机不可达(SSH连接未知错误)求助
你遇到的这个SSH连接错误是Ansible最常见的问题之一,咱们一步步来排查解决:
首先先明确你碰到的错误信息:
TASK [setup] *******************************************************************
fatal: [172.17.0.2]: UNREACHABLE! => {"changed": false, "msg": "ERROR! SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue", "unreachable": true}
1. 先排查基础网络与SSH端口连通性
先在控制节点上手动测试最基础的连通性:
- 执行
ping 172.17.0.2,看是否能收到响应。如果ping不通,先解决网络层面的问题(比如容器网络配置、路由规则、底层防火墙拦截)。 - 如果ping通了,测试SSH端口是否开放:执行
nc -zv 172.17.0.2 22或者telnet 172.17.0.2 22,如果显示连接失败,说明目标主机的22端口没开放,或者被防火墙拦截了。
2. 检查SSH认证配置
Ansible默认使用密钥认证,确保你的控制节点SSH公钥已经添加到目标主机的~/.ssh/authorized_keys中:
- 可以手动执行
ssh-copy-id <目标主机用户名>@172.17.0.2来复制公钥,之后尝试手动ssh <目标主机用户名>@172.17.0.2,如果能成功登录,说明认证环节没问题。 - 如果用密码认证,需要在playbook里添加
ansible_ssh_pass变量,或者在inventory文件中配置,也可以在运行playbook时加上--ask-pass参数手动输入密码。
3. 确认目标主机的SSH服务状态
如果能通过其他方式登录到目标主机(比如控制台),检查以下内容:
- SSH服务是否在运行:执行
systemctl status sshd(Systemd系统)或者service ssh status(SysVinit系统),如果没运行,启动它:systemctl start sshd。 - 防火墙是否放通22端口:Ubuntu系统用
ufw status查看,CentOS用firewall-cmd --list-ports;如果没开放,添加规则:ufw allow 22或者firewall-cmd --add-port=22/tcp --permanent && firewall-cmd --reload。
4. 检查Ansible的Inventory与配置
- 确认你的inventory文件里的主机条目是否正确,比如目标主机SSH端口不是默认22、或者使用特定用户名时,需要明确指定:
172.17.0.2 ansible_user=your_username ansible_port=22 ansible_ssh_private_key_file=/path/to/your/private/key - 检查
ansible.cfg中的配置,比如ssh_args是否有错误的参数设置,导致SSH连接异常。
5. 用详细调试信息定位问题
按照错误提示,运行带-vvvv参数的命令,获取SSH连接的完整调试日志:
ansible-playbook install_docker.yml -vvvv
这会显示SSH连接的每一步细节,比如是主机密钥验证失败(会提示Host key verification failed)、密钥权限不正确,还是用户名错误。如果是主机密钥问题,手动执行一次ssh 172.17.0.2,接受主机密钥即可。
内容的提问来源于stack exchange,提问作者Oz Giat

