Ansible delegate_to执行失败:SSH公钥权限拒绝无法连接主机
遇到这个Permission denied (publickey)的错误,核心是Ansible无法通过公钥认证登录到目标虚拟机node-2(对应192.168.50.11),我帮你梳理几个关键的排查和解决步骤:
1. 先手动验证SSH连通性
首先跳过Ansible,直接在运行Playbook的主机上手动测试SSH连接,确认基础的连通性没问题:
ssh XXX@192.168.50.11
如果手动连接也失败,那先解决这个基础问题:
- 用
ssh-copy-id XXX@192.168.50.11把本地用户的公钥自动复制到目标主机的~/.ssh/authorized_keys里; - 手动复制的话,要确保目标主机的
~/.ssh目录权限是700,authorized_keys文件权限是600,权限不对会导致公钥认证失效。
2. 匹配Vagrant虚拟机的SSH密钥
因为你的虚拟机是Vagrant部署的,Vagrant会生成专属的SSH密钥,可能你没用到正确的密钥。可以先查看虚拟机的SSH配置:
vagrant ssh-config node-2
输出里会有IdentityFile字段,对应Vagrant生成的私钥路径。然后在运行Ansible时指定这个密钥:
ansible-playbook your_rolling_update.yml --private-key=/path/to/vagrant/private/key
或者把这个密钥路径配置到你的清单文件里,比如:
[loadbalancer] node-2 ansible_host=192.168.50.11 ansible_user=XXX ansible_ssh_private_key_file=/path/to/vagrant/key
3. 检查清单文件的主机配置
确保你的inventory清单里,loadbalancer组的node-2配置了正确的连接用户和密钥信息。如果Ansible默认使用的用户和目标主机的用户不一致,或者密钥不是默认的~/.ssh/id_rsa,必须在清单里明确指定,避免Ansible用错误的参数去连接。
4. 排查Playbook里的组引用逻辑
错误里的item=groups.loadbalancer看起来可能是你在Playbook里遍历组的语法有问题。在Ansible的YAML里,引用组应该用groups['loadbalancer']的格式(虽然点语法有时候生效,但在循环里容易出问题),比如正确的循环写法:
- name: 遍历负载均衡器组执行任务 hosts: loadbalancer tasks: - debug: msg: "当前主机: {{ item }}" loop: "{{ groups['loadbalancer'] }}"
确保组的引用正确,避免因为解析错误导致连接到错误的主机。
5. 测试单主机Ansible连通性
在解决完上面的点后,先用ansible ping命令测试单个主机的连通性,确认Ansible能正常连接:
ansible node-2 -m ping -u XXX --private-key=/path/to/your/key
如果这个命令返回pong,说明连通性没问题,再运行你的滚动升级Playbook就应该能成功了。
内容的提问来源于stack exchange,提问作者E. Jaep

