假设Ansible结构:
.
├── group_vars
│ └── all
└── site.yml
all
包含my_test_variable: 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_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
这个问题是关于ansible的错误。更新后,它按照记录的方式工作。
我应该删除这个问题吗?
答案 0 :(得分:4)
来自Ansible的官方指南:
除了将变量直接存储在INI文件中之外,主机和组变量还可以存储在相对于库存文件的单个文件中。
由于Vagrant在./.vagrant/provisioners/ansible/inventory/
中生成其库存文件,您需要在group_vars
上添加一个符号链接到此目录中。
假设您与group_vars
和Vagrantfile
位于同一目录中.vagrant
:
cd ./.vagrant/provisioners/ansible/inventory; ln -sf ../../../../group_vars; cd -
答案 1 :(得分:3)
结构或代码没有任何问题。不工作的原因是ansible的错误。
我找不到与此问题完全匹配的错误报告,但我相信我自己报告的此问题Ansible incorrectly constructing paths when running a playbook in a subdirectory和this 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 }}