Ansible:使用带有变量的嵌套组
Ansible: using nested groups with vars
我有一个情况,我们有 3 层盒子,在每一层中我们应用不同的变量设置(比如缓存目录在哪里),但是有一堆默认值。我还需要在 每个节点 的基础上进行覆盖,这通常是通过主机本身的库存变量来完成的。我不确定组织主持人的最佳方式是什么,以便 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
。我将 default/shared 设置添加到 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
的组变量将按以下顺序填充:
depth 0:组all
,all.yml
(此处遗漏,忽略)
深度 1:组 bots
、bots.yml
深度 2:组 bots-b
、bots-b.yml
您可以在源代码中查看详细信息和处理顺序here。
因此,如果您在 bots.yml
中定义默认值并在 bots-b.yml
中定义特定值,您应该会达到您的预期。
我有一个情况,我们有 3 层盒子,在每一层中我们应用不同的变量设置(比如缓存目录在哪里),但是有一堆默认值。我还需要在 每个节点 的基础上进行覆盖,这通常是通过主机本身的库存变量来完成的。我不确定组织主持人的最佳方式是什么,以便 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
。我将 default/shared 设置添加到 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
的组变量将按以下顺序填充:
depth 0:组all
,all.yml
(此处遗漏,忽略)
深度 1:组 bots
、bots.yml
深度 2:组 bots-b
、bots-b.yml
您可以在源代码中查看详细信息和处理顺序here。
因此,如果您在 bots.yml
中定义默认值并在 bots-b.yml
中定义特定值,您应该会达到您的预期。