我有一个情况,我们有3层盒子,在每一层中,我们应用不同的变量设置(例如cache dir所在的位置),但是有很多默认值。我还需要基于每个节点进行覆盖,这通常是通过主机本身上的清单变量完成的。我不确定组织主机的最佳方法是什么,以便precedence works对我有利。
这是我尝试过的不同方法。在每种情况下,我在清单文件中都有这样的条目:
[bots-fancy]
fancy-1
[bots-super-fancy]
super-1
[bots-magical]
magic-1
magic-2 provider=aws
最初,我每个人都有一长串变量定义。我也有不同的
group_var/bots/[bots-magical | bots-super-fancy | bots-fancy].yaml
文件。这很快变得站不住脚。尝试1:使用剧本变量
在剧本中,我有以下内容:
---
hosts:
- bots
vars_files:
- "group_vars/bots/defaults.yml"
- "group_vars/bots/{{ groups_names[0] }}.yml"
roles:
- somethign
这行得通(尽管确实很脆弱),但它不允许我按每个主机进行覆盖。我有时不得不在节点上设置不同的东西,但在整个组中却没有。
尝试2:对每个使用
group_vars
我加了
[bots:children]
bots-fancy
bots-super-fancy
bots-magical
到主机文件。从剧本中删除任何
vars_files
,并为每个组创建group_vars
。我将默认/共享设置添加到了group_vars/bots.yaml
。当我运行剧本时,它只会加载看起来似乎是bots
group_vars的文件。理想情况下,我希望它加载bots
,然后用bots-fancy
覆盖它。最后是主机文件中的值。我不确定组织这些小组的最佳方法,因此任何输入都将非常有帮助!
最佳答案
不知道你是什么问题。您应该可以:
主持人:
[bots-a]
bot1
[bots-b]
bot2
[bots:children]
bots-a
bots-b
目录:
./group_vars/bots.yml
./group_vars/bots-a.yml
./group_vars/bots-b.yml
Ansible中有一个组深度的概念(至少在最近的版本中)。在此示例中,主机
bot2
的组变量将按以下顺序填充:深度0:组
all
,all.yml
(此处遗漏,忽略)深度1:组
bots
,bots.yml
深度2:组
bots-b
,bots-b.yml
您可以在源代码中查看详细信息和处理顺序here。
因此,如果您在
bots.yml
中定义默认值,并在bots-b.yml
中定义特定值,则应该达到预期的效果。关于ansible - Ansible:将嵌套组与vars一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41818280/