在group_vars /中定义的Ansible变量未找到

alf*_*ito 11 vagrant ansible ansible-playbook

假设Ansible结构:

.
??? group_vars
?   ??? all
??? site.yml
Run Code Online (Sandbox Code Playgroud)

其中all包括my_test_variable: yes,和site.yml是:

- hosts: all

  tasks:
    - name: Variable test
      debug: msg={{ my_test_variable }}
Run Code Online (Sandbox Code Playgroud)

我正在使用Vagrant在本地运行它,所以命令看起来像:

$ ansible-playbook site.yml -i /path-to-vagrant/.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory --private-key=/path-to-vagrant/.vagrant/machines/default/virtualbox/private_key -u vagrant

Vagrant生成的反转文件:

# Generated by Vagrant

default ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222
Run Code Online (Sandbox Code Playgroud)

并输出:

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 
Run Code Online (Sandbox Code Playgroud)

我知道这个流浪汉的库存不在任何一个组内 - 因为没有 - 但所有的组都继承了所有,对吧?

为什么不起作用?我错过了什么?


我对Ansible很新.阅读了很多文档,几个例子,甚至一些SO问题,比如Ansible,如果不手动加载它就不会选择group_vars - 这不是我的问题 - 而且无法识别组变量 - 关闭但不是.


编辑

我正在遵循Ansible文档中推荐的项目结构,在变量doc条目中他们提到了global_vars/all:

站点范围的默认值应定义为"group_vars/all"设置.

即使没有关于如何加载这些默认值的直接参考,我认为我不必明确添加它们(如@ thiago-borges的回答中所建议的那样).或者我呢?

这样做的原因是我打算从所有人那里继承集团变量,比如:

.
??? group_vars
?   ??? all
?   ??? production
?   ??? staging
??? site.yml
Run Code Online (Sandbox Code Playgroud)

当我为每个执行ansible-playbook时,加载不同的文件而不必在播放文件中明确设置它们,例如:

ansible-playbook -i production site.yml


编辑2

问题是关于ansible的错误.更新后,它按照记录的方式工作.

我应该删除这个问题吗?

use*_*453 5

从Ansible的官方指南中:

除了直接将变量存储在INI文件中之外,主机变量和组变量还可以存储在相对于清单文件的单个文件中。

由于Vagrant会在其中生成其清单文件,因此./.vagrant/provisioners/ansible/inventory/需要在您的group_vars目录中放置一个符号链接。

假设您group_varsVagrantfile和在同一目录中.vagrant

cd ./.vagrant/provisioners/ansible/inventory; ln -sf ../../../../group_vars; cd -
Run Code Online (Sandbox Code Playgroud)


alf*_*ito 4

结构或代码本身没有任何问题。无法工作的原因是 ansible 上的错误。

虽然我找不到与这个问题完全匹配的错误报告,但我相信这个问题Ansible 在子目录中运行 playbook 时错​​误地构建路径,并且我自己报告的另一个问题可能与之相关。

目前运行 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 
Run Code Online (Sandbox Code Playgroud)