Ansible 2.8角色-使用vars / main目录

时间:2019-10-05 10:24:07

标签: variables ansible roles ansible-2.x ansible-issue

我正在尝试将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 ...

2 个答案:

答案 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文件填充
  • 添加一个空的.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"