【问题标题】:Can an Ansible inventory include another?Ansible 清单可以包含另一个清单吗?
【发布时间】:2020-02-27 07:41:57
【问题描述】:

我们有一组在应用程序的不同实例之间共享的服务器,并且希望它们的列表是一个单独的文件,以及其他 -- 特定于实例的清单 -- 包括它。

(我知道,这可以通过动态库存来完成,但这些都是代码,我们希望我们的服务器列表保留数据,可以这么说。 )

对于 INI 库存,这是不可能的,但对于 YAML 库存,它非常接近。例如,this answer 展示了如何通过将 !include 的处理程序添加到 Python 的 YAML 解析器来完成此操作。然后可以写:

all:
  group1:
    host1:
    host2:
  sharedservers: !include shared-servers.yaml

如何将此功能添加到自己的 Ansible 存储库中 - 最好不实施全新的清单插件(尽管继承 Ansible 的现有插件也可以)?

【问题讨论】:

    标签: ansible include yaml ansible-inventory


    【解决方案1】:

    首先,您问题中的示例清单不尊重 yaml ansible 清单的架构,将被拒绝解析。

    现在回答您的问题,您可以简单地一次使用多个库存。这是一个简单的例子:

    我创建了 3 个 yaml 库存文件:

    • inventories/hosts.yml
      ---
      group1:
        hosts:
          host1:
          host2:
      
    • inventories/otherhosts.yml
      ---
      group2:
        hosts:
          hostA:
          hostB:
      
    • 最后是inventories/shared.yml
      ---
      sharedservers:
        hosts:
          host3:
          host4:
      

    从那里,很容易解决所有需要的主机。下面的示例使用ansible-inventory 以获得更好的输出,但-i 选项和目标选择与ansibleansible-playbook 相同

    • 寻址清单目录内所有清单文件中的所有主机:
      $ ansible-inventory -i inventories/ all --graph
      @all:
        |--@group1:
        |  |--host1
        |  |--host2
        |--@group2:
        |  |--hostA
        |  |--hostB
        |--@sharedservers:
        |  |--host3
        |  |--host4
        |--@ungrouped:
      
      在这种情况下,这相当于在单独的 -i 选项中调用每个 yaml 文件
      ansible-inventory -i inventories/hosts.yml \
        -i inventories/otherhosts.yml -i inventories/shared.yml \
        all --graph
      
    • 仅处理特定清单
      $ ansible-inventory -i inventories/hosts.yml \
        -i inventories/shared.yml all --graph
      @all:
        |--@group1:
        |  |--host1
        |  |--host2
        |--@sharedservers:
        |  |--host3
        |  |--host4
        |--@ungrouped:
      
      $ ansible-inventory -i inventories/otherhosts.yml \
        -i inventories/shared.yml all --graph
      @all:
        |--@group2:
        |  |--hostA
        |  |--hostB
        |--@sharedservers:
        |  |--host3
        |  |--host4
        |--@ungrouped:
      

    【讨论】:

      【解决方案2】:

      您可以利用 Ansible 中已有的功能:

      1. 使用库存目录,您可以指定所有库存文件所在的文件夹,它们将按字母顺序一一包含。

      2. 您可以使用多个广告资源来源:

        • 命令行中有多个-i选项
        • ANSIBLE_INVENTORY 环境变量并提供以逗号分隔的清单路径列表(目录或文件)
        • ansible.cfg 中的 inventory 选项与上述相同。

      请参阅docs

      我怀疑以上内容无法满足您的需求。修改你的包装脚本和项目的文件结构比破解你的方式进入 pyyaml 和 ansible 更好。 /intro_inventory.html?highlight=inventory directory#using-multiple-inventory-sources) 了解更多信息。

      【讨论】:

      • 选项 1 很有趣,但是同一个文件仍然不能与另一个库存(目录)共享​​>,除非是符号链接。剩下的——我们有很多清单——每个应用程序实例一个——每个人都习惯于一个实例 -> 一个文件范例。不幸的是,您提出的解决方法需要一段时间才能习惯。为什么 Ansible 不只实现多人想要的功能?...唉...
      • 您可以通过在ANSIBLE_INVENTORY 中指定主库存和共享库存来“共享”库存。
      • 搞砸了命令行 :( include 的概念如此简单,几十年前就为人所知 (#include <...>)...
      • 您可以创建自己的库存脚本/插件来满足您的需求。 docs.ansible.com/ansible/latest/plugins/inventory.html, docs.ansible.com/ansible/latest/dev_guide/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      相关资源
      最近更新 更多