强制Ansible使用SSH密码认证连接主机的问题排查
问题根因
从SSH调用参数和环境信息判断,问题由两个常见原因导致:
- 系统缺少
sshpass依赖。Ansible无法自行完成SSH密码的非交互式传递,必须依赖sshpass工具实现该能力。当运行环境检测不到sshpass时,Ansible会自动在SSH启动参数中添加PasswordAuthentication=no,直接跳过密码认证流程,你配置的ansible_ssh_pass变量根本不会被调用。你升级Pop_OS! 22.04属于系统级重装,之前安装的sshpass已经被清除。 - 项目内的
ansible.cfg配置覆盖了默认认证逻辑。从你的版本输出可以看到,Ansible加载的是项目路径下的自定义ansible.cfg,该文件的[ssh_connection]段大概率手动写死了认证规则:要么显式关闭了密码认证,要么在PreferredAuthentications参数中排除了password认证方式,直接导致SSH客户端不会尝试密码登录。
解决步骤
- 安装缺失的sshpass依赖
Pop_OS!属于Debian/Ubuntu系发行版,直接执行apt安装即可:
sudo apt update && sudo apt install -y sshpass
安装完成后执行which sshpass,如果输出/usr/bin/sshpass类的路径,说明安装成功。
- 修正ansible.cfg的SSH连接配置
打开路径/home/home/Projects/federated-agency/ansible.cfg,找到[ssh_connection]配置段:
- 删除显式设置的
PasswordAuthentication = no配置项,若需要保留则改为PasswordAuthentication = yes - 删除手动写死的
PreferredAuthentications配置项,如果必须保留该配置,需要把password加入允许的认证方式列表,示例修正后的配置如下:
[ssh_connection] ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s -o ConnectTimeout=30 # 不要写死排除密码的认证规则 # PreferredAuthentications = gssapi-with-mic,gssapi-keyex,hostbased,publickey
- 验证连接有效性
先不用直接运行完整playbook,执行ad-hoc测试命令验证密码认证是否正常:
ansible -i test-hosts.yml init -m ping
如果所有目标主机返回SUCCESS和pong响应,说明连接配置正常,再执行原playbook命令即可正常运行。
注:你当前使用的Ansible 2.10版本完全兼容
ansible_ssh_pass变量名,不需要修改主机清单里的变量配置。
内容的提问来源于stack exchange,提问作者Hugh Powell
相关产品推荐
相关产品推荐

