Vagrant 找不到组\u vars/all中定义的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

假设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 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。