如何在terraform中使列表参数可选



我有以下配置

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)
} 
]...)
}

最新更新