我有以下配置
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.config_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",
]
}
但是,我希望参数cat
是可选的。但是如果我给出一个没有cat
参数的vm,那么什么也不会发生。我希望它也适用于以下配置
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
- vm_name: "efg"
template:
cate: Orange
image: "ubuntu18"
cpu_cores: 1
memory: 1024
可以看到,在第三个虚拟机efg
中没有定义cat
参数。在这种情况下,我想获得与上面相同的库存文件,因为第三个vm没有使用cat,即
{
"black" = [
"xyz",
]
"blue" = [
"abc",
"xyz",
]
"geen" = [
"abc",
]
"red" = [
"abc",
"xyz",
]
"yellow" = [
"xyz",
]
}
您可以将lookup
添加到代码中以检查cat
。如果cat
不存在,则得到空列表:
locals {
cfg_vars = yamldecode(file("test1.yaml"))
list_color = distinct(flatten(
[for vm in local.cfg_vars["abc"][*]: lookup(vm, "cat", [])]
))
inventory_map = merge([for color in local.list_color: {
for vm in local.cfg_vars["abc"]:
color => vm.vm_name... if contains(lookup(vm, "cat", []), color)
}
]...)
}