Ansible中/etc/ansible/hosts变量未定义错误排查
解决Ansible Inventory变量访问失败的问题
咱们先拆解下你遇到的问题,核心是主机变量的访问方式错误,还有对hostvars的用法理解有误,下面一步步给你修正:
1. 确认你的Inventory格式(是正确的)
你的/etc/ansible/hosts格式没问题,主机变量DB_SERVER和DB_USER已经正确绑定到my1-node上了:
# My nodes [my-group] my1-node ansible_user=imran DB_SERVER=10.136.10.49 DB_USER=mydbusr
2. Playbook里的错误点
你的原Playbook有两个关键问题:
- 第二个
debug任务里的hostvars['DB_USER']用法完全错误:hostvars是通过主机名来索引的,不是变量名,正确逻辑是先指定主机,再取对应变量。 - 其实对于当前执行任务的主机,完全不需要用
hostvars,直接调用变量名就能拿到inventory里定义的主机变量。
3. 修正后的Playbook
下面是两种可行的写法:
写法一:直接访问当前主机的变量(推荐)
这是最简洁的方式,因为任务是在目标主机上执行,直接调用变量名即可获取inventory里定义的主机变量:
--- - hosts: all tasks: - debug: msg: - "Database server {{ DB_SERVER }}" - "Database Username {{ DB_USER }}"
写法二:用hostvars指定主机访问变量(适用于跨主机调用)
如果你需要从其他主机获取变量,才需要用到hostvars,比如明确指定从my1-node拿变量:
--- - hosts: all tasks: - debug: msg: - "Database server {{ DB_SERVER }}" - "Database Username {{ hostvars['my1-node']['DB_USER'] }}"
或者用inventory_hostname动态获取当前主机名,适配多主机场景:
--- - hosts: all tasks: - debug: msg: - "Database server {{ DB_SERVER }}" - "Database Username {{ hostvars[inventory_hostname]['DB_USER'] }}"
4. 为什么命令行-e参数能正常工作?
因为-e传入的是全局/额外变量,这类变量在所有主机的上下文里都能直接访问,和inventory里定义的主机变量作用域不同,所以你之前用命令行传参时能正常输出。
内容的提问来源于stack exchange,提问作者ImranRazaKhan
相关产品推荐
相关产品推荐

