如何根据用户在 VM 创建配置中选择的列表项创建 Ansible 清单文件。列表项可以是任何单词(我们暂时不去验证列表项)。例如。以下是两个虚拟机的代码,
cat
子列表指定 Ansible 清单组标签。
abc:
- vm_name: "abc"
template:
cate: Apple
image: "ubuntu18"
cpu_cores: 1
memory: 1024
cat:
- red
- geen
- blue
- vm_name: "xyz"
template:
cate: Orange
image: "ubuntu18"
cpu_cores: 1
memory: 1024
cat:
- red
- blue
- yellow
- black
到目前为止,我可以使用以下代码获取列表
locals {
cfg_vars = yamldecode(file("test1.yaml"))
list_color = flatten(local.cfg_vars["abc"][*]["cat"])
}
我也不确定如何检查和比较它们的群体,例如在上述情况下,逻辑应该给我清单文件中的组 as
[red]
%{ for group in red ~}
${ group }
%{ endfor ~}
[green]
%{ for group in green ~}
${ group }
%{ endfor ~}
.
.
.
如果用户选择以上 VM 配置的预期输出。
[red]
abc
xyz
[green]
abc
[blue]
abc
xyz
[yellow]
xyz
[black]
xyz
一种方法是创建地图,例如
inventory_map
,如下:
locals {
cfg_vars = yamldecode(file("test1.yaml"))
list_color = distinct(flatten(local.cfg_vars["abc"][*]["cat"]))
inventory_map = merge([for color in local.list_color: {
for vm in local.cfg_vars["abc"]:
color => vm.vm_name... if contains(vm.cat, color)
}
]...)
}
产生
local.inventory_map
:
{
"black" = [
"xyz",
]
"blue" = [
"abc",
"xyz",
]
"geen" = [
"abc",
]
"red" = [
"abc",
"xyz",
]
"yellow" = [
"xyz",
]
}
有了
local.inventory_map
,您可以创建一个templatefile来生成所需的txt文件。