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
原因分析
结合你的配置和错误日志,主要可能有以下几个诱因:
- Vault Lookup的变量引用语法错误:在
credentials文件中,你在lookup参数里嵌套使用了{{ }},但Jinja2不会解析外层{{ }}内部的嵌套变量,导致传递给Vault的是{{vault_user}}这类字符串,而非实际变量值(即便你说debug验证过密码正确,也可能是debug场景没有完全模拟playbook的变量加载逻辑)。 - 异步任务的sudo密码传递异常:playbook中使用了
async:45,异步任务在处理sudo权限时,可能存在密码传递的链路问题,导致密码没有正确传递给远程主机的sudo进程。 - 变量优先级冲突隐患:主机配置文件、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
相关产品推荐
相关产品推荐

