Ansible集团的优先权

Nic*_*Roz 9 variables redefinition ansible

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

abc.yml
all.yml
xyz.yml
Run Code Online (Sandbox Code Playgroud)

并且在它们中定义了相同的变量:

- my_var: abc
- my_var: all
- my_var: xyz
Run Code Online (Sandbox Code Playgroud)

Ansible 文档说:

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

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

什么是装货单?


有趣的是,改变组中的组顺序hosts也是如此,但是以不可预测的方式.

我尝试运行ansible-playbook my_var.yml -c local(只返回变量值)的所有组合:

[all]
localhost

[xyz]
localhost

[abc]
localhost
Run Code Online (Sandbox Code Playgroud)

但我仍然无法弄清楚它是如何工作的.

小智 7

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
Run Code Online (Sandbox Code Playgroud)

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