假设我在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
但我仍然无法弄清楚它是如何运作的。
答案 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分支中。