Vagrant 找不到组\u vars/all中定义的Ansible变量
假设Ansible结构:Vagrant 找不到组\u vars/all中定义的Ansible变量,vagrant,ansible,ansible-playbook,Vagrant,Ansible,Ansible Playbook,假设Ansible结构: . ├── group_vars │ └── all └── site.yml 其中all包含my\u test\u变量:yes,而site.yml是: - hosts: all tasks: - name: Variable test debug: msg={{ my_test_variable }} 我使用Vagrant在本地运行它,因此命令如下所示: $ansible playbook site.yml-i/path to vag
.
├── group_vars
│ └── all
└── site.yml
其中all
包含my\u test\u变量:yes
,而site.yml
是:
- hosts: all
tasks:
- name: Variable test
debug: msg={{ my_test_variable }}
我使用Vagrant在本地运行它,因此命令如下所示:
$ansible playbook site.yml-i/path to vagrant/.vagrant/provisioners/ansible/inventory/vagrant\u ansible\u inventory--private key=/path to vagrant/.vagrant/machines/default/virtualbox/private\u key-u vagrant
流浪汉生成的反向文件:
# Generated by Vagrant
default ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222
以及输出:
PLAY: ***************************************************************************
TASK [setup] ********************************************************************
ok: [default]
TASK [Variable test] ************************************************************
fatal: [default]: FAILED! => {"msg": "ERROR! the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'my_test_variable' is undefined", "failed": true}
PLAY RECAP **********************************************************************
default : ok=1 changed=0 unreachable=0 failed=1
我知道这个流浪者清单不在任何组中,因为没有任何组,但所有组都继承自all,对吗
为什么不起作用?我错过了什么
我对Ansible很陌生。阅读大量的文档,几个例子,甚至一些问题,比如-,不完全是我的问题-,接近但也不在那个里
编辑 我遵循的是推荐的项目结构,在文章中,他们提到了全局变量/all: 站点范围的默认值应定义为“组变量/所有”设置 即使没有关于如何加载这些默认值的直接参考,我假设我不必显式地添加它们(就像@thiago borges在回答中建议的那样)。还是我 原因是我打算让组变量继承自all,例如:
.
├── group_vars
│ └── all
│ └── production
│ └── staging
└── site.yml
当我为每个文件执行ansible playbook时,会加载不同的文件,而无需在播放文件中明确设置它们,例如:
ansible playbook-i生产站点.yml
编辑2 这个问题是ansible上的一个bug。在一次更新之后,它按照文档记录的方式工作
那么我应该删除这个问题吗?在你的site.yml上,尝试设置var_文件配置
- hosts: all
vars_files:
- group_vars/all
tasks:
- name: Variable test
debug: msg={{ my_test_variable }}
来自Ansible的官方指南: 除了直接在INI文件中存储变量外,主机和组变量还可以存储在相对于清单文件的单个文件中 由于Vagrant在
/.Vagrant/provisioners/ansible/inventory/
中生成其库存文件,因此您需要将组变量上的符号链接放入此目录
假设您在与Vagrantfile
和相同的目录下有group\u vars
:
cd ./.vagrant/provisioners/ansible/inventory; ln -sf ../../../../group_vars; cd -
结构或代码本身没有问题。不工作的原因是ansible上的一个bug
虽然我找不到与这个问题完全匹配的bug报告,但我相信这个问题和我自己报告的可能有关联
目前运行的ansible版本为a1948dd1c151f01ce93d0b76745469a7065ef45e,工作正常:
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [default]
TASK [Variable test] ***********************************************************
ok: [default] => {
"changed": false,
"msg": true
}
PLAY RECAP *********************************************************************
default : ok=2 changed=0 unreachable=0 failed=0
是的,它确实有效,但这是我不想做的:手动包含变量文件。我将编辑我的问题解释。这很奇怪。它应该像你期望的那样工作——对我来说也是如此。在这种情况下,您是否有另一个与库存文件相关的组变量/all
文件?该文件将相对于playbook和inventory文件进行搜索,但当它同时存在于两个位置时,我遇到了一些奇怪的优先/合并行为。我会将其记录在一个答案中(链接到任何错误报告,如果可用),并将其标记为答案。我忘记返回此票据,但问题是ansible上有一个bug。