Ansible通过堡垒机SSH连接:能否在ansible_ssh_common_args中使用用户名密码?
在Ansible中通过堡垒机使用用户名密码连接的方案
答案是可以,但不建议直接在ansible_ssh_common_args里硬编码明文密码,下面是可行的实现方式以及更安全的替代方案:
1. 借助sshpass实现堡垒机密码认证
SSH本身不支持命令行直接传递密码,需要依赖sshpass工具完成非交互式密码输入。步骤如下:
- 先在控制节点(运行Ansible的机器)安装
sshpass:# Ubuntu/Debian系统 sudo apt install sshpass # CentOS/RHEL系统 sudo yum install sshpass - 在inventory文件中配置代理命令,结合变量传递密码:
[target_hosts] web_server ansible_host=10.0.0.5 ansible_user=web_admin [target_hosts:vars] # 堡垒机配置变量 jump_user=jump_admin jump_host=192.168.1.200 # 通过ProxyCommand指定堡垒机代理,用sshpass传入堡垒机密码 ansible_ssh_common_args='-o ProxyCommand="sshpass -p {{ jump_password }} ssh -W %h:%p -l {{ jump_user }} {{ jump_host }}"' # 目标主机的密码(若目标主机也用密码认证) ansible_ssh_pass={{ target_password }} - 运行Playbook时,若密码已用
ansible-vault加密,需添加解密参数:ansible-playbook -i inventory.yml playbook.yml --ask-vault-pass
2. 更安全的替代方案(优先推荐)
如果之前密钥方式失败,建议先排查问题而非直接切换到密码:
- 检查堡垒机的
/etc/ssh/sshd_config是否开启AllowAgentForwarding yes,修改后重启sshd服务 - 确保控制节点私钥已添加到ssh-agent:
ssh-add ~/.ssh/your_private_key - 确认堡垒机
~/.ssh/authorized_keys已添加控制节点公钥,目标主机~/.ssh/authorized_keys已添加堡垒机公钥 - 此时可直接用密钥转发配置代理,无需密码:
ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -l {{ jump_user }} {{ jump_host }}"'
注意事项
- 绝对不要在配置文件中明文存储密码,使用
ansible-vault encrypt加密密码变量文件,或通过环境变量传递 sshpass会在进程列表中短暂暴露密码,敏感环境下谨慎使用
内容的提问来源于stack exchange,提问作者Jerin
相关产品推荐
相关产品推荐

