根据 @larsk 的最新答案中的输入进行构建constructed
库存插件。原答案如下
如果您对集群组/子组保持相同的命名约定,则可以使用构建的插件进行更多的干燥,从而无需在组中引入额外的变量。
请注意,在库存目录中使用文件名约定也允许库存源的自然加载顺序,而无需修改ansible.cfg
给定以下最小inventories/cluster/cluster.yml
静态库存来源:
---
all:
children:
cluster_one:
children:
cluster_one_controller:
hosts:
host1:
host2:
host3:
cluster_one_compute:
hosts:
host4:
host5:
host6:
cluster_two:
children:
cluster_two_controller:
hosts:
host11:
host12:
host13:
以及相应的inventories/cluster/cluster_constructed.yml
基于现有组名检测的动态库存源:
---
plugin: constructed
strict: false
groups:
controller: group_names | select('match', '^.*_controller$') | length > 0
compute: group_names | select('match', '^.*_compute$') | length > 0
我们使用复合库存目录得到了预期的结果
$ ansible-inventory -i inventories/cluster --list
{
"_meta": {
"hostvars": {}
},
"all": {
"children": [
"cluster_one",
"cluster_two",
"compute",
"controller",
"ungrouped"
]
},
"cluster_one": {
"children": [
"cluster_one_compute",
"cluster_one_controller"
]
},
"cluster_one_compute": {
"hosts": [
"host4",
"host5",
"host6"
]
},
"cluster_one_controller": {
"hosts": [
"host1",
"host2",
"host3"
]
},
"cluster_two": {
"children": [
"cluster_two_controller"
]
},
"cluster_two_controller": {
"hosts": [
"host11",
"host12",
"host13"
]
},
"compute": {
"hosts": [
"host4",
"host5",
"host6"
]
},
"controller": {
"hosts": [
"host1",
"host11",
"host12",
"host13",
"host2",
"host3"
]
}
}
原答案
我对这让你感到难过@larks 深感抱歉。不幸的是,正如您刚刚经历的那样:
- 该组的内容不取决于您定义它的位置,并且最终将合并所有主机/子定义。
- 任何地方定义为子级的组将包含其他地方定义的所有主机。
我能想到的唯一一个最接近您的初始要求并尽可能尊重 DRY 原则的静态 yaml 库存定义是:
---
all:
children:
cluster_one:
children:
cluster_one_controller:
hosts:
host1:
host2:
host3:
cluster_one_compute:
hosts:
host4:
host5:
host6:
cluster_two:
children:
cluster_two_controller:
hosts:
host11:
host12:
host13:
controller:
children:
cluster_one_controller:
cluster_two_controller:
compute:
children:
controller_one_compute:
这将允许您选择以下任何模式(非详尽列表):
- 一个完整的集群,例如
cluster_one
- 集群的所有控制器,例如
cluster_two_controller
or cluster_two:&controller
- 跨集群的所有计算节点,例如
compute
- ...
希望这能帮助你照亮你的一天(或夜晚......)