运行ansible-playbook提示'foo' is undefined报错原因咨询
Ansible 执行playbook报
'foo' is undefined错误原因及修复 核心报错原因
你的变量配置和命令传参存在3个不符合Ansible规则的问题,导致foo变量从未被Ansible加载:
- 第一,
group_vars目录下的变量文件命名不符合自动加载规则。Ansible自动加载group_vars下文件的逻辑是:文件名必须与inventory中的主机组名完全匹配,你的inventory里只有名为all的主机组,却把变量文件命名为test.vars,Ansible不会主动识别加载这个文件。 - 第二,
group_vars下的变量文件后缀不符合规范。支持自动加载的变量文件只有两类:无后缀的key=value格式文件、后缀为.yml/.yaml的YAML格式文件,你加了.vars后缀,就算文件名和组名匹配也不会被自动识别。 - 第三,
--extra-vars传参语法错误。通过--extra-vars读取外部文件的正确格式是@文件绝对/相对路径,@必须放在参数值的最开头,你写的group_vars/@test.vars相当于传入了无效的字符串参数,Ansible根本没有读取到test.vars里的内容。
修复方案
方案1:使用group_vars自动加载(推荐)
不需要额外加--extra-vars参数,按Ansible约定调整文件即可:
- 将原
group_vars/test.vars重命名为group_vars/all(对应inventory里的all主机组),文件内容保持foo=bar即可;如果偏好YAML格式,就重命名为group_vars/all.yml,内容调整为标准YAML格式:foo: bar - 直接执行playbook即可:
ansible-playbook -i inventory test.yml
方案2:通过extra-vars手动传入变量文件
如果不想依赖group_vars自动加载规则,修正传参语法即可:
- 变量文件
test.vars的位置、内容都不需要调整,执行命令时把@放到路径最前面:# 如果文件在group_vars目录下,路径写对即可,文件名后缀不影响手动传参 ansible-playbook -i inventory --extra-vars @group_vars/test.vars test.yml
注意:如果手动传参,Ansible不会校验文件是否放在group_vars目录下,只要
@后写的文件路径正确、文件内容格式合法就能正常读取变量。
内容的提问来源于stack exchange,提问作者jnosa
相关产品推荐
相关产品推荐

