Ansible group_vars 文件以匹配多个组

des*_*key 3 ansible ansible-inventory

这可能是一个奇怪的问题,我确信我已经看到了这个问题,但忽略了将其添加为书签。

我的主机存在于多个组中:

[group1]
host1

[group2]
host2

[group3]
host1
host3
Run Code Online (Sandbox Code Playgroud)

我想为这些主机设置组变量文件(这是简单明显的部分):

group_vars/group1.yml
group_vars/group2.yml
group_vars/group3.yml
Run Code Online (Sandbox Code Playgroud)

,并且还使用以下模式为存在的主机分组变量:

group1:&group3
Run Code Online (Sandbox Code Playgroud)

这可以用 group_vars 文件完成吗?例子:

group_vars/group1:&group3.yml
Run Code Online (Sandbox Code Playgroud)

我确信我已经看到过这种样式的文件名,但我不知道如何让它工作。

Zei*_*tor 5

(编辑:这个答案仍然大部分有效,但下面有更新)

文档摘录

笔记:

组加载遵循父/子关系。然后按照字母顺序合并相同“父/子”级别的组。用户可以通过 ansible_group_priority 取代最后一个,所有组的默认值为 1。这个变量 ansible_group_priority 只能在清单源中设置,不能在 group_vars/ 中设置,因为该变量用于加载 group_vars/。

因此,基于此,您几乎可以做的就是:

  • 让 group3 作为 group1 和 group2 的父组。为 group3 定义的变量将自动用于 group1 和 group2:

    [group1]
    host1
    
    [group2]
    host2
    
    [group3:children]
    group1
    group2
    
    Run Code Online (Sandbox Code Playgroud)
  • 在任何地方定义 vars 并依赖它们的加载顺序或在您的库存源中使用ansible_group_priority.

现在,如果您考虑根据您在游戏中定位的组使用不同的 vars 值,请忘记它:无论您的目标是什么,ansible 都会加载库存/剧本中所有组的所有变量。

我建议您深入阅读有关放置变量的位置解释


(更新)

自从我上面的回答以来,情况发生了一些变化。尽管结论并没有真正改变,并且您仍然无法根据hosts您的游戏中的目标决定获取哪个变量值,但 ansible 引入了一些灵活性,让您定义 anansible_group_priority以在库存解析时覆盖默认的 ASCII 顺序。

请注意,此变量只能在清单源中设置,而不能在group_vars文件中设置

现在在文档的新部分对此进行了解释:如何合并变量。相关摘录:

顺序/优先级是(从最低到最高):

  • 所有组(因为它是所有其他组的“父”)
  • 家长组
  • 儿童组
  • 主持人

默认情况下,Ansible 以 ASCII 顺序合并同一父/子级别的组,最后加载的组会覆盖之前的组。例如,a_group 将与 b_group 合并,匹配的 b_group 变量将覆盖 a_group 中的变量。

您可以通过设置组变量 ansible_group_priority 来更改相同级别组的合并顺序(在解决父/子顺序后)来更改此行为。数字越大,合并越晚,优先级越高。如果未设置,此变量默认为 1。