我正在尝试将Ansible角色变量拆分为多个文件-按照this answer,应该可以创建一个vars/main
目录,并且该目录中的所有.yml文件应自动已加载。
但是,就我而言,这似乎没有发生。
我的目录结构:
vars
└── main
├── gce_settings.yml
├── vsphere_settings.yml
└── vsphere_zone.yml
但是,当我尝试使用vsphere_settings.yml中定义的变量时,Ansible抱怨该变量未定义:
{"msg": "The task includes an option with an undefined variable. The error was: 'vsphere_user' is undefined
如果我将变量声明移到vars/main.yml
中,一切都会按预期进行。但是,当然,我希望将变量分成多个文件。
我在Ansible官方文档中找不到对该“功能”的任何引用,而且我不知道如何解决它。谁能指出我正确的方向?
我的ansible版本:
ansible 2.8.5
在Ubuntu 16.04上
在您问:是的之前,我确实确保尝试加载main.yml
时不存在vars/main/*.yml
...
答案 0 :(得分:2)
TL; DR版本:这是一个错误,由vars/main
中存在空的.yml文件引起。已经有公关了。看到
here。
实际结果(如注释中所述)实际上取决于文件的处理顺序(默认情况下,看起来我的Ansible按字母顺序对其进行处理-但这可能取决于版本或底层操作系统) :
ERROR! failed to combine variables, expected dicts but got a 'NoneType' and a 'AnsibleMapping'
更多详细信息:由于我不知道如何在Ansible本身中进行故障排除,因此我去了代码,开始添加print
语句以查看发生了什么。
在我的情况下,我在vars/main
目录中有一些空的.yml文件(我打算稍后填充的文件。嗯...看起来像代码遇到这样的空文件时,销毁到目前为止已建立的整个词典。
或者我错过了一些非常重要的东西,或者这是一个bug ...要重现的步骤:
vars/main
目录,并用一些.yml文件填充 ansible# tree roles
roles
+-- test
+-- tasks
¦ +-- main.yml
+-- vars
+-- main
+-- correct_vars.yml
4 directories, 2 files
ansible# cat roles/test/vars/main/correct_vars.yml myname: bogd
ansible# ansible-playbook -i inventory.yml test.yml
...
ok: [localhost] => {
"myname": "bogd" }
...
ansible# echo > roles/test/vars/main/emptyfile.yml
ansible# ansible-playbook -i inventory.yml test.yml
... ok: [localhost] => {
"myname": "VARIABLE IS NOT DEFINED!" }
...
后来编辑:是的,这是一个错误……请参见here。
答案 1 :(得分:2)
下面的例子
$ cat play.yml
- hosts: localhost
roles:
- role1
$ cat roles/role1/tasks/main.yml
- debug:
var: var1
$ cat roles/role1/vars/main/var1.yml
var1: test_var1
给予
"var1": "test_var1"