Terraform基于JSON响应嵌套循环创建多资源的实现咨询
Terraform 资源模板实现
首先按以下配置编写locals逻辑,即可生成符合要求的资源name属性:
- 定义基础变量与转换逻辑
locals { # 区域数组 regions = [ {name = "region1"}, {name = "region2"}, {name = "region3"}, {name = "region4"}, {name = "region5"}, {name = "region6"} ] # 区域集群映射,也可通过jsondecode读取外部JSON文件 region_cluster_map = { "region1" : ["cluster1"], "region2" : [], "region3" : ["cluster1"], "region4" : ["cluster1","cluster2"] } # 扁平化生成符合要求的资源名称列表 flattened_resources = flatten([ # 仅保留JSON中存在的区域,不需要可删除if过滤条件 for r in local.regions : [ length(lookup(local.region_cluster_map, r.name, [])) == 0 ? r.name : [ for c in lookup(local.region_cluster_map, r.name, []) : "${r.name}/${c}" ] ] if contains(keys(local.region_cluster_map), r.name) ]) }
- 资源定义
resource "type" "name" { count = length(local.flattened_resources) name = local.flattened_resources[count.index] }
生成的name属性将完全匹配要求的格式:
- region1/cluster1
- region2
- region3/cluster1
- region4/cluster1
- region4/cluster2
自定义Final数组逻辑实现
你描述的逻辑完全可以实现,直接在locals中新增如下定义即可:
locals { # 复用上方定义的regions、region_cluster_map变量 Final = flatten([ for r, cs in local.region_cluster_map : [ for oc in local.regions : [ for c in cs : merge(oc, {cluster = "${r}-${c}"}) ] if oc.name == r ] ]) }
逻辑说明:
- 遍历区域集群映射的区域r和对应集群列表cs
- 匹配regions数组中名称等于r的元素oc
- 遍历集群列表cs,用merge函数给oc新增cluster属性,值为
${r}-${c} - 最后通过flatten展开为一维数组,即得到你需要的Final数组
内容的提问来源于stack exchange,提问作者Himani
相关产品推荐
相关产品推荐

