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
问题是关于ansible的错误.更新后,它按照记录的方式工作.
我应该删除这个问题吗?
从Ansible的官方指南中:
除了直接将变量存储在INI文件中之外,主机变量和组变量还可以存储在相对于清单文件的单个文件中。
由于Vagrant会在其中生成其清单文件,因此./.vagrant/provisioners/ansible/inventory/需要在您的group_vars目录中放置一个符号链接。
假设您group_vars与Vagrantfile和在同一目录中.vagrant:
cd ./.vagrant/provisioners/ansible/inventory; ln -sf ../../../../group_vars; cd -
Run Code Online (Sandbox Code Playgroud)
结构或代码本身没有任何问题。无法工作的原因是 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)