You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible delegate_to执行失败:SSH公钥权限拒绝无法连接主机

解决Ansible滚动升级时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:52:50