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

为何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格式),命名错误会导致变量无法加载。
    解决:

    1. 确认group_vars和host_vars目录存在于inventory文件夹下
    2. 检查group_vars/rh9.yml文件是否存在,且里面正确定义了ansible_user: cloud-user等变量
    3. 确保文件名与组名/主机名完全一致,无拼写错误
  • Ansible配置文件的隐性覆盖
    即使你没有手动修改配置,默认的ansible.cfg文件(比如~/.ansible.cfg或/etc/ansible/ansible.cfg)中可能设置了remote_user参数,该参数的优先级高于inventory中的ansible_user变量。
    解决:

    1. 运行以下命令检查配置:
      ansible-config view | grep remote_user
      
    2. 如果输出存在remote_user = jgp这类配置,注释掉该行并保存文件
    3. 或者临时在命令行指定用户验证:
      ansible all -m ping --user cloud-user
      
  • 环境变量覆盖了inventory变量
    系统环境变量ANSIBLE_REMOTE_USER会优先于inventory中的ansible_user生效,如果该变量被设置为当前用户jgp,就会出现上述问题。
    解决:

    1. 检查环境变量:
      echo $ANSIBLE_REMOTE_USER
      
    2. 如果输出为jgp,取消该环境变量:
      unset ANSIBLE_REMOTE_USER
      
    3. 之后重新执行Ansible命令测试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:54:56