使用带密码短语的SSH私钥运行Ansible Playbook的密码验证问题
解决Ansible连接EC2自动扩缩组实例的SSH密码短语问题
我来帮你拆解下这个问题——你遇到的反复要求输入密钥密码短语、验证失败的情况,大概率和SSH密钥缓存、Ansible连接配置或者EC2实例的SSH设置有关,咱们一步步来排查解决:
1. 先搞定本地SSH Agent的密钥缓存
如果你的私钥设置了密码短语,Ansible默认会依赖SSH Agent来缓存密钥,避免每次重复输入。先检查Agent状态:
- 运行
ssh-add -l,如果输出里没有你的id_rsa,说明密钥没加载 - 先启动Agent(如果没运行的话):
eval "$(ssh-agent -s)" - 再加载密钥:
ssh-add /Users/XXX/.ssh/id_rsa,输入一次密码短语后,Agent会帮你缓存,之后Ansible就能自动调用这个密钥,不用反复输入了
2. 确认Ansible的连接配置是否正确
有时候Ansible会找不到正确的私钥,或者用错了登录用户:
- 打开你的inventory文件(比如
hosts),给EC2主机加上这两个配置:
注意[ec2_hosts] <实例IP> ansible_ssh_private_key_file=/Users/XXX/.ssh/id_rsa ansible_user=ec2-useransible_user要对应你的AMI镜像:Ubuntu用ubuntu,Amazon Linux用ec2-user,如果Packer里自定义了用户,要改成对应的名字 - 或者在playbook的
vars块里全局设置这两个变量,避免每个主机单独配置
3. 检查EC2实例的SSH服务配置
手动先连一次实例,确认基础连接没问题:
- 执行
ssh -i /Users/XXX/.ssh/id_rsa ec2-user@<实例公网IP>,如果这里也反复要密码短语,回到第一步搞定Agent;如果能正常连,再检查实例的SSH配置:- 登录实例后,打开
/etc/ssh/sshd_config,确认PasswordAuthentication设置为no(如果是yes,Ansible会优先尝试密码登录,而非密钥,导致提示输密码) - 修改后重启SSH服务:
sudo systemctl restart sshd(Amazon Linux可能用sudo service sshd restart) - 同时检查实例的
~/.ssh/authorized_keys文件,确认你的公钥存在,而且没有被自动扩缩组的user data脚本覆盖
- 登录实例后,打开
4. 关于--ask-pass参数的后续问题
你加--ask-pass能完成部分任务,说明Ansible用密码登录成功了,但后续任务失败可能是因为:
- 任务里用到了
sudo(比如become: yes),这时候需要输入sudo密码,可以加上--ask-become-pass参数,或者在inventory里配置ansible_become_pass(建议用Ansible Vault加密,不要明文写) - 后续任务需要用密钥访问其他资源(比如拉取Git仓库),这时候实例上的密钥配置有问题,需要确保实例能正确访问目标资源
5. 用Verbose日志排查细节
如果上面的步骤都没解决,打开Ansible的详细日志,看看具体哪里出错:
- 执行
ansible-playbook load.yml -vvv,从日志里可以明确是密钥验证失败、密码验证失败,还是其他连接问题,再针对性解决
最后,别忘了检查你的私钥文件权限:chmod 600 /Users/XXX/.ssh/id_rsa,公钥文件chmod 644 /Users/XXX/.ssh/id_rsa.pub,权限不对SSH也会拒绝连接。
内容的提问来源于stack exchange,提问作者Am1rr3zA




