纠错 fatal: [172.16.159.32]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: UOS Server 20 1070e\[email protected]: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true}
时间: 2025-03-12 14:22:02 浏览: 50
### 解决 Ansible SSH 连接失败问题
当遇到 `Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)` 的错误时,这通常表明 SSH 客户端无法通过公钥认证访问目标主机。以下是可能的原因以及解决方案:
#### 1. 验证 SSH 密钥配置
确保本地系统的私钥文件已正确设置,并且远程服务器上对应的公钥已被添加到用户的 `.ssh/authorized_keys` 文件中[^1]。
如果密钥未被正确配置,则需要重新生成并分发 SSH 密钥对:
```bash
ssh-keygen -t rsa -b 4096 -C "[email protected]"
```
将生成的公钥复制到目标服务器:
```bash
ssh-copy-id [email protected]
```
#### 2. 检查权限和所有权
确认目标服务器上的 `.ssh` 目录及其子文件具有正确的权限和所有权。具体来说:
- `.ssh` 目录应为 `700` 权限。
- `authorized_keys` 文件应为 `600` 权限。
可以通过以下命令修复权限:
```bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown $USER:$USER ~/.ssh -R
```
#### 3. 修改 Ansible 配置以支持密码验证
如果暂时不希望使用基于密钥的身份验证,可以尝试启用密码身份验证。编辑 `/etc/ansible/ansible.cfg` 或创建一个新的配置文件,在其中加入以下内容:
```ini
[defaults]
remote_user = your_username
ask_pass = True
```
运行 ansible 命令时会提示输入密码。
#### 4. 使用 `-u` 参数指定用户
有时默认用户可能导致连接失败。可以在执行 `ansible` 命令时显式指定用户名:
```bash
ansible all -m ping -u your_username --private-key=/path/to/private_key
```
#### 5. 调试 SSH 连接
为了进一步排查问题,可增加调试选项来获取更详细的日志信息:
```bash
ANSIBLE_DEBUG=True ansible all -m ping -vvvv
```
此操作有助于识别具体的失败原因,例如是否涉及代理跳转或其他网络限制。
---
### 示例代码片段
下面是一个简单的 playbook 示例,用于测试多个主机的连通性:
```yaml
---
- name: Test connectivity to servers
hosts: all
gather_facts: no
tasks:
- name: Ping remote server
ping:
```
保存上述 YAML 到文件(如 `test.yml`),并通过如下方式调用:
```bash
ansible-playbook test.yml -i inventory_file.ini --private-key=~/.ssh/id_rsa
```
---
阅读全文
相关推荐


















