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

时间:2015-07-10 14:46:08

标签: vagrant ansible ansible-playbook

假设Ansible结构:

.
├── group_vars
│   └── all
└── site.yml

all包含my_test_variable: yessite.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_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

输出:

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 

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

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

我是Ansible的新手。阅读了很多文档,几个例子甚至一些SO问题,比如Ansible doesn't pick up group_vars without loading it manually - 不是我的问题 - 而Cannot get ansible to recognize group variables - 关闭但不存在。

修改

我遵循Ansible's doc推荐的项目结构,variables doc entry他们提到 global_vars / all

  

网站范围默认值应定义为“group_vars / all”设置。

尽管没有直接参考如何加载这些默认值,但我认为我不必明确添加它们(如@ thiago-borges的答案所示)。或者我呢?

原因是我打算让小组变量继承自所有,例如:

.
├── group_vars
│   └── all
│   └── production
│   └── staging
└── site.yml

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

ansible-playbook -i production site.yml

编辑2

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

我应该删除这个问题吗?

3 个答案:

答案 0 :(得分:4)

来自Ansible的官方指南:

  

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

由于Vagrant在./.vagrant/provisioners/ansible/inventory/中生成其库存文件,您需要在group_vars上添加一个符号链接到此目录中。

假设您与group_varsVagrantfile位于同一目录中.vagrant

cd ./.vagrant/provisioners/ansible/inventory; ln -sf ../../../../group_vars; cd -

答案 1 :(得分:3)

结构或代码没有任何问题。不工作的原因是ansible的错误。

我找不到与此问题完全匹配的错误报告,但我相信我自己报告的此问题Ansible incorrectly constructing paths when running a playbook in a subdirectorythis other issue可能是相关的。

目前从修订版a1948dd1c151f01ce93d0b76745469a7065ef45e运行ansible,它运行正常:

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 

答案 2 :(得分:1)

在您的site.yml上,尝试设置var_files配置。

- hosts: all
  vars_files:
    - group_vars/all
  tasks:
    - name: Variable test
      debug: msg={{ my_test_variable }}
相关问题