Ansible通过跳板机执行playbook提示密码无效错误如何解决?
你遇到的报错核心原因是:当前Ansible配置仅提供了目标主机的SSH登录密码,但通过跳板机建立连接时需要先后完成「跳板机身份验证」和「目标主机身份验证」两次校验,你手动执行SSH时是交互式输入两次密码,而Ansible默认不会自动处理跳板机的密码输入,因此触发密码错误。
Mac上运行正常是因为你的Mac设备大概率已经配置了跳板机的SSH密钥免密登录,不需要额外输入跳板机密码,仅用目标主机密码即可完成完整链路验证。
按易用性和安全性推荐优先级如下:
方案一:配置跳板机SSH密钥免密登录(最推荐)
该方案不需要修改现有Ansible配置,一劳永逸解决问题:
- 在VirtualBox的Linux虚拟机中执行命令生成SSH密钥:
ssh-keygen -t rsa -b 4096
所有提示直接回车即可,无需设置密钥密码。 - 将生成的公钥上传到跳板机的授权列表中:
ssh-copy-id 你的跳板机用户名@跳板机地址
按提示输入跳板机密码完成上传。 - 验证配置是否生效:执行手动SSH命令连接目标主机,此时不需要再输入跳板机密码,仅需输入目标主机密码即可登录。
配置完成后重新运行Ansible命令即可正常执行。
方案二:配置Ansible自动传入跳板机密码
如果无法配置跳板机密钥免密,可通过sshpass工具自动传入跳板机密码:
- 先在Linux虚拟机中安装sshpass:
yum install -y sshpass(适用于CentOS/RHEL系系统)apt install -y sshpass(适用于Debian/Ubuntu系系统) - 修改inventory配置中的
ansible_ssh_common_args参数,用环境变量传入跳板机密码,避免明文写死:
ansible_ssh_common_args: -o ProxyCommand="sshpass -p '{{ lookup('env', 'JUMP_HOST_PASSWORD') }}' ssh -W %h:%p 你的跳板机用户名@jumphost" -o PubkeyAuthentication=no -o PreferredAuthentications=password -o PasswordAuthentication=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
注意:移除原有配置中的ControlMaster=auto和ControlPersist=60s参数,VirtualBox NAT网络下连接复用极易出现传输异常,就是你报错中sftp/scp失败的诱因。
3. 运行Ansible命令时新增跳板机密码环境变量即可:JUMP_HOST_PASSWORD='跳板机密码' ANSIBLE_SSH_USER='toor' ANSIBLE_SSH_PASSWORD='目标主机密码' ansible-playbook -i inventories/inventory.yml -l cluster1 playbooks/deploy-monitoring.yml
方案三:本地SSH配置统一管理
你也可以把所有SSH参数写到虚拟机本地的~/.ssh/config文件中,Ansible会自动读取该配置,不需要在inventory中重复定义:
- 编辑
~/.ssh/config文件,添加如下配置:
# 跳板机配置 Host jumphost HostName 跳板机实际IP/域名 User 跳板机用户名 PubkeyAuthentication no PasswordAuthentication yes StrictHostKeyChecking no UserKnownHostsFile /dev/null # 目标主机段配置 Host 192.168.0.* User toor ProxyJump jumphost PubkeyAuthentication no PasswordAuthentication yes StrictHostKeyChecking no UserKnownHostsFile /dev/null
如果你的OpenSSH版本低于7.3不支持ProxyJump,将ProxyJump jumphost替换为ProxyCommand ssh -W %h:%p jumphost即可。
2. 移除inventory配置中ansible_ssh_common_args、ansible_user两个变量,重新运行Ansible命令即可。
内容的提问来源于stack exchange,提问作者Marco Ferrara

