如何在Terraform中将list类型参数cat设置为可选参数
解决Terraform中可选
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
原始分组代码
用以下Terraform代码可将VM按cat字段的颜色分组:
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(如下方的efg)时,原始代码会因找不到cat字段报错,需修改代码兼容该场景,同时保持分组结果和之前一致。
带可选cat参数的配置示例:
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
修改后的兼容代码
通过lookup函数处理可选字段,当cat不存在时返回空列表,既避免报错又自动过滤无颜色的VM:
locals { cfg_vars = yamldecode(file("test1.yaml")) # 遍历所有VM,用lookup获取cat,不存在则返回空列表,再扁平化得到所有颜色 list_color = 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"]: # 同样用lookup处理每个VM的cat字段,空列表时contains返回false,自动跳过该VM color => vm.vm_name... if contains(lookup(vm, "cat", []), color) } ]...) }
预期运行结果
修改后执行代码,local.inventory_map会和原始结果一致:
{ "black" = [ "xyz", ] "blue" = [ "abc", "xyz", ] "geen" = [ "abc", ] "red" = [ "abc", "xyz", ] "yellow" = [ "xyz", ] }
内容的提问来源于stack exchange,提问作者drmaa
相关产品推荐
相关产品推荐

