Ansible集团的优先权

时间:2016-06-30 10:43:21

标签: variables ansible redefinition

假设我在group_vars中有3个文件:

abc.yml
all.yml
xyz.yml

并在其中定义相同的变量:

- my_var: abc
- my_var: all
- my_var: xyz

Ansible documentation说:

  

在任何部分中,重新定义var将覆盖先前的实例。如果多个组具有相同的变量,则加载的最后一个组获胜。如果你在play的vars:section中定义了两次变量,那么第二个就会获胜。

是否意味着加载顺序是按字母顺序排列的,abc.yml的优先级最低,xyz.yml最高,或者取决于hosts中的组顺序?

加载顺序是什么?

有趣的是,改变hosts中组的顺序也会改变结果,但是会以不可预测的方式改变。

我尝试使用以下所有组合运行ansible-playbook my_var.yml -c local(仅返回变量值)

[all]
localhost

[xyz]
localhost

[abc]
localhost

但我仍然无法弄清楚它是如何运作的。

3 个答案:

答案 0 :(得分:1)

现在,有关此行为的ansible文档非常清楚...

https://docs.ansible.com/ansible/2.6/user_guide/intro_inventory.html#how-variables-are-merged

  

合并相同父级/子级的组时,将按字母顺序进行操作,最后加载的组将覆盖先前的组。例如,a_group将与b_group合并,而匹配的b_group变量将覆盖a_group中的变量。

     

从Ansible 2.4版开始,用户可以使用组变量ansible_group_priority更改同一级别的组的合并顺序(在解决父/子顺序之后)。数字越大,合并的时间越晚,优先级更高。如果未设置,则此变量默认为1。例如:

a_group:
    testvar: a
    ansible_group_priority: 10
b_group
    testvar: b
     

在此示例中,如果两个组的优先级相同,则结果通常为testvar == b,但是由于我们给a_group更高的优先级,结果将为testvar == a。

答案 1 :(得分:0)

我想说Ansible在这种情况下的行为是未指明的。

答案 2 :(得分:0)

看起来来自Ansible git存储库的以下问题可能已经解决了您描述的行为:Ansible group_vars from inventory don't support repeated hosts

查看关联提交中的code changes,看起来现在组应按深度排序,然后按名称排序(按字母顺序排列)。

值得注意的是,根据您运行的Ansible版本,此行为可能会有所不同,因为这些更改仅合并到Ansible存储库的stable-2.2分支中。