Ansible:使用带有vars的嵌套组

时间:2017-01-24 00:53:19

标签: ansible ansible-inventory

我的情况是我们有3层盒子,每层我们应用不同的变量设置(比如缓存目录所在的位置),但是有一堆默认值。我还需要在每个节点的基础上覆盖,这通常通过主机本身的库存变量来完成。我不确定组织主机的最佳方式是什么,以便https://trac.ffmpeg.org/ticket/4744对我有利。

以下是我尝试过的不同内容。在每种情况下,我在库存文件中都有这样的条目:

[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:使用playbook变量 在剧本中我有这样的事情:

---
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

到hosts文件。从剧本中删除了所有vars_files,并为每个组创建了group_vars。我将默认/共享设置添加到group_vars/bots.yaml。当我运行剧本时,它只会加载bots group_vars。理想情况下,我希望它加载bots,然后使用bots-fancy覆盖它。然后最后来自hosts文件的值。

我不确定构建这些组的最佳方法,因此任何输入都会非常有用!

1 个答案:

答案 0 :(得分:5)

不确定你的问题是什么。你应该没问题:

主机:

[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:小组allall.yml(此处遗漏,忽略)
深度1:组botsbots.yml
深度2:小组bots-bbots-b.yml

您可以在源代码中查看详细信息和处理顺序here

因此,如果您在bots.yml中定义默认值并在bots-b.yml中定义特定值,那么您应该达到预期目标。