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

Ansible执行提示sudo密码错误,但实际密码正确的问题求助

排查Ansible "Incorrect sudo password" 错误(已验证Vault密码正确)

问题背景

你在执行Ansible playbook时遇到了sudo密码错误的提示,但已经通过debug和curl确认Hashi Vault返回的密码是正确的。核心错误信息如下:

fatal: [192.168.1.200]: FAILED! => {"msg": "Incorrect sudo password"}

目标主机/var/log/secure日志也明确显示密码验证失败:

unix_chkpwd[30174]: password check failed for user (ec2-user)
sudo: pam_unix(sudo:auth): authentication failure; logname=ec2-user uid=1000 euid=0 tty=/dev/pts/4 ruser=ec2-user rhost= user=ec2-user

原因分析

结合你的配置和错误日志,主要可能有以下几个诱因:

  1. Vault Lookup的变量引用语法错误:在credentials文件中,你在lookup参数里嵌套使用了{{ }},但Jinja2不会解析外层{{ }}内部的嵌套变量,导致传递给Vault的是{{vault_user}}这类字符串,而非实际变量值(即便你说debug验证过密码正确,也可能是debug场景没有完全模拟playbook的变量加载逻辑)。
  2. 异步任务的sudo密码传递异常:playbook中使用了async:45,异步任务在处理sudo权限时,可能存在密码传递的链路问题,导致密码没有正确传递给远程主机的sudo进程。
  3. 变量优先级冲突隐患:主机配置文件、playbook、credentials文件重复设置remote_user,虽不直接引发错误,但可能干扰变量加载的优先级逻辑。

解决方法

1. 修复Vault Lookup的变量引用语法

将credentials文件中的ansible_become_pass修改为字符串拼接格式,避免嵌套{{ }}:

ansible_become_pass: "{{ lookup('hashi_vault', 
  'secret=secret/test/ec2_password '
  'auth_method=userpass '
  'username=' ~ vault_user ~ ' '
  'password=' ~ vault_password ~ ' '
  'url=' ~ vault_url ~ ':' ~ vault_port ~ ' '
  'validate_certs=false'
) }}"

或者用Jinja2的format方法更简洁地拼接参数:

ansible_become_pass: "{{ lookup('hashi_vault', 
  'secret=secret/test/ec2_password auth_method=userpass username=%s password=%s url=%s:%s validate_certs=false' | format(vault_user, vault_password, vault_url, vault_port)
) }}"

这样能确保变量被正确解析并传递给Vault lookup。

2. 验证变量是否正确加载

执行以下debug命令,确认ansible_become_pass是否被正确设置为Vault中的密码:

ansible -l 192.168.1.200 -m debug -a "var=ansible_become_pass" \
  --private-key=/home/rehna/.ssh/testKeyPair.pem \
  --vault-password-file /etc/ansible/ansible.vault \
  -e @credentials

如果输出的密码和Vault中的一致,说明变量加载正常;如果不一致,检查vault_user、vault_password等变量是否在ansible.vault中正确加密存储。

3. 测试同步任务排除异步干扰

暂时移除playbook中的async:45配置,测试同步执行任务是否成功:

- name: show bar
  systemd:
    state: restarted
    name: sssd.service
  become: yes
  become_method: sudo

如果同步任务成功,说明异步任务的密码传递存在问题,可以尝试调整异步配置(比如添加poll:0或指定become_flags),或改用同步方式执行需要sudo的任务。

4. 验证目标主机的sudo配置

手动登录目标主机,用ec2-user执行以下命令并输入Vault中的密码,确认sudo权限正常:

sudo systemctl restart sssd.service

如果手动执行失败,说明目标主机的sudo配置或用户密码存在问题,需要检查/etc/sudoers文件,确保ec2-user有执行该命令的权限,且密码匹配。

额外建议

  • 避免重复设置remote_user:主机配置、playbook、credentials文件重复定义可能引发变量优先级问题,建议只在一个地方统一配置。
  • 生产环境启用Vault证书验证:当前关闭了validate_certs=false,虽能快速测试,但生产环境建议配置正确的CA证书,规避安全风险。

内容的提问来源于stack exchange,提问作者rehna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:47:28