为何Ansible临时命令不使用inventory中的ansible_user变量?
构建内容创作的基础inventory,主机和组变量按文件夹结构存放。运行ansible-inventory --graph --vars时,显示ansible_user值已正确设置:
[jgp@ansible-ws1 automation-content]$ ansible-inventory --graph --vars @all: |--@ungrouped: |--@rh9: | |--jgp-rh9-test-1 | | |--{all = {'vars': {'ansible_user': 'cloud-user', 'ansible_ssh_extra_args': '-o StrictHostKeyChecking=no'}}} | | |--{ansible_host = 10.124.19.136} |--{all = {'vars': {'ansible_user': 'cloud-user', 'ansible_ssh_extra_args': '-o StrictHostKeyChecking=no'}}} [jgp@ansible-ws1 automation-content]$
但执行临时命令时,Ansible未使用ansible_user的值,而是尝试以当前用户jgp连接,报错:
[jgp@ansible-ws1 automation-content]$ ansible all -m ping jgp-rh9-test-1 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: jgp@10.124.19.136: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).", "unreachable": true } [jgp@ansible-ws1 automation-content]$
手动使用cloud-user加SSH密钥对连接正常:
[jgp@ansible-ws1 automation-content]$ ssh cloud-user@10.124.19.136 -o StrictHostKeyChecking=no Last login: Thu May 1 10:33:31 2025 from 10.124.0.101 [cloud-user@jgp-rh9-test-1 ~]$
Inventory路径未正确指定
当使用文件夹结构的inventory时,如果不通过-i参数指定路径,Ansible可能会加载默认的inventory文件(比如当前目录的hosts或系统默认路径),而非你配置的带组/主机变量的文件夹结构。
解决:执行命令时显式指定inventory文件夹路径,例如:ansible all -i ./你的inventory文件夹路径 -m ping变量文件结构或命名不符合规范
按文件夹存放变量时,组变量必须放在group_vars目录下,主机变量放在host_vars目录下,且文件名要与组名/主机名完全匹配(大小写敏感)。比如rh9组的变量文件应为group_vars/rh9.yml(或.yaml/.json格式),命名错误会导致变量无法加载。
解决:- 确认
group_vars和host_vars目录存在于inventory文件夹下 - 检查
group_vars/rh9.yml文件是否存在,且里面正确定义了ansible_user: cloud-user等变量 - 确保文件名与组名/主机名完全一致,无拼写错误
- 确认
Ansible配置文件的隐性覆盖
即使你没有手动修改配置,默认的ansible.cfg文件(比如~/.ansible.cfg或/etc/ansible/ansible.cfg)中可能设置了remote_user参数,该参数的优先级高于inventory中的ansible_user变量。
解决:- 运行以下命令检查配置:
ansible-config view | grep remote_user - 如果输出存在
remote_user = jgp这类配置,注释掉该行并保存文件 - 或者临时在命令行指定用户验证:
ansible all -m ping --user cloud-user
- 运行以下命令检查配置:
环境变量覆盖了inventory变量
系统环境变量ANSIBLE_REMOTE_USER会优先于inventory中的ansible_user生效,如果该变量被设置为当前用户jgp,就会出现上述问题。
解决:- 检查环境变量:
echo $ANSIBLE_REMOTE_USER - 如果输出为
jgp,取消该环境变量:unset ANSIBLE_REMOTE_USER - 之后重新执行Ansible命令测试
- 检查环境变量:
内容的提问来源于stack exchange,提问作者0xSheepdog

