【问题标题】:Ansible: using nested groups with varsAnsible:使用带有变量的嵌套组
【发布时间】:2017-01-24 00:53:19
【问题描述】:

我有一种情况,我们有 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。我将默认/共享设置添加到group_vars/bots.yaml。当我运行剧本时,它似乎只会加载bots group_vars。理想情况下,我希望它加载bots,然后用bots-fancy 覆盖它。最后是主机文件中的值。

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

【问题讨论】:

    标签: ansible ansible-inventory


    【解决方案1】:

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

    主持人:

    [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 中定义特定值,您应该会达到您的预期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2023-01-10
      相关资源
      最近更新 更多