首页 > 解决方案 > Ansible 清单可以包含另一个清单吗?

问题描述

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

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

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

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

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

标签: ansibleincludeyamlansible-inventory

解决方案


首先,您问题中的示例清单不尊重 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选项和目标选择是相同的ansible,并且ansible-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:
    

推荐阅读