Ansible 提示 fatal: [host]: FAILED! 权限拒绝错误如何排查?

文章导读
Ansible 出现权限拒绝错误时,优先检查 SSH 密钥认证和 sudo 配置,大多数情况下是管理节点与目标主机之间的认证信息未正确配置。
📋 目录
  1. 快速诊断命令
  2. 错误原理简析
  3. 详细排查与配置
  4. SSH 完全不可用时的应急方案
  5. 验证连接与权限
  6. 常见陷阱与注意事项
A A

Ansible 出现权限拒绝错误时,优先检查 SSH 密钥认证和 sudo 配置,大多数情况下是管理节点与目标主机之间的认证信息未正确配置。

核心结论:这类错误通常不是 Ansible 本身的问题,而是底层 SSH 连接或目标主机权限配置导致的。按顺序排查 SSH 认证、sudo 权限、主机密钥检查三项即可解决大部分情况。

  • 确认管理节点是否已生成 SSH 密钥并添加到目标主机
  • 检查目标主机用户的 sudo 权限配置是否正确
  • 用 ansible ping 模块测试连接是否恢复正常

快速诊断命令

如果时间紧急,可以直接执行以下命令快速定位问题:

ssh -v <username>@<host_ip>
ansible <host_pattern> -m ping -v
sudo visudo

第一条命令查看 SSH 连接详细日志,第二条测试 Ansible 连接,第三条检查 sudo 配置。注意将占位符替换为实际值。

错误原理简析

Ansible 本身不管理用户认证,它依赖 SSH 协议连接目标主机。当看到"Permission denied"或"sudo: a password is required"这类错误时,本质是两层问题:第一层是 SSH 连接时的身份认证失败,第二层是连接成功后执行命令时的权限不足。

SSH 认证失败通常是因为管理节点没有目标主机的公钥信息,或者目标主机的 authorized_keys 文件没有正确配置。sudo 权限问题则是因为 Ansible 执行的任务需要提权,但当前用户没有配置免密码 sudo。

详细排查与配置

第一步:检查 SSH 密钥配置

在管理节点执行:

ls -la ~/.ssh/id_rsa
ls -la ~/.ssh/id_rsa.pub

如果密钥文件不存在,生成新密钥:

ssh-keygen -t rsa

然后将公钥复制到目标主机:

ssh-copy-id <username>@<host_ip>

复制过程中会提示输入目标主机用户密码,输入完成后公钥会添加到目标主机的~/.ssh/authorized_keys 文件中。

第二步:配置 sudo 免密码权限

如果错误信息包含"sudo: a password is required",需要在目标主机上配置免密码 sudo。登录目标主机后执行:

sudo visudo

在打开的编辑器中添加以下行(将 username 替换为实际用户名):

username ALL=(ALL) NOPASSWD: ALL

保存退出后,该用户执行 sudo 命令不再需要输入密码。

Ansible 提示 fatal: [host]: FAILED! 权限拒绝错误如何排查?

安全提示:赋予 NOPASSWD: ALL 权限较高,生产环境建议限制具体命令,例如:username ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/yum。

第三步:调整 Ansible 配置

如果遇到 Host Key 检查相关的错误,可以修改 Ansible 配置文件。若/etc/ansible/ansible.cfg 不存在,先创建:

mkdir -p /etc/ansible
touch /etc/ansible/ansible.cfg

编辑/etc/ansible/ansible.cfg,找到以下行并取消注释:

host_key_checking = False

风险警告:关闭主机密钥检查会降低安全性,可能遭受中间人攻击,仅建议在测试环境使用。生产环境建议通过 ssh-keygen -R 清理已知主机记录。

SSH 完全不可用时的应急方案

若 SSH 服务异常或权限配置错误导致无法远程连接,需通过带外管理方式登录目标主机修复:

  • 云服务器:使用云厂商控制台提供的 VNC 或远程连接功能登录。
  • 物理机:通过 IPMI、iDRAC 或直连显示器键盘操作。
  • 修复重点:检查/etc/ssh/sshd_config 配置,确认 PermitRootLogin 及 PasswordAuthentication 设置,重启 sshd 服务。

验证连接与权限

完成上述配置后,执行以下命令验证:

ansible <host_pattern> -m ping

如果返回"SUCCESS"和"pong",说明连接已恢复正常。也可以执行更复杂的测试:

ansible <host_pattern> -m command -a 'whoami'

查看返回的用户名是否符合预期。如果需要测试 sudo 权限,可以执行:

ansible <host_pattern> -m command -a 'whoami' `--become`

应该返回"root"。

常见陷阱与注意事项

SSH 密钥权限问题:~/.ssh 目录权限应该是 700,authorized_keys 文件权限应该是 600,权限过宽会导致 SSH 拒绝使用密钥认证。

目标主机 SSH 服务配置:有些系统默认禁止 root 用户直接登录,需要检查/etc/ssh/sshd_config 中的 PermitRootLogin 设置。

Ansible 版本差异:不同版本的 Ansible 模块参数可能不同,如果看到"Unsupported parameters"错误,需要核对当前 Ansible 版本支持的参数列表。

网络连通性:有时候错误看起来像权限问题,实际是网络不通导致连接超时,先用 ping 或 telnet 确认端口可达性。