You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform能否解析多层级不同键嵌套Map并提取对象数组?

问题描述

我有一个嵌套结构的Map如下:

root = {
      nat = {
        pr = {
          dev = [{
            value: "10.10.10.10",
            description: "test1"
          },
          ],
        },
        pr2 = {
          dev = [{
            value: "10.10.10.11",
            description: "test2"
          }],
          prod = [],
        }
      },
      cc = {
        pr = {
          jej = [{
            value: "10.10.10.10",
            description: "test"
          }]
        }
      },
      smt = {
        st = [{
          value = "10.10.10.10",
          description = "test"
        }],
        s2 = [{
          value = "10.10.10.10",
          description = "tt"
        }]
      }
    }

这个Map未来可能新增嵌套层级,现在要把它放到Terraform模块中,输入类似root.nat的路径后,需要输出该路径下所有对象数组的合并结果。比如输入root.nat时,期望输出:

[{
value = "10.10.10.10",
description = "test1"
},
{
value = "10.10.10.11",
description = "test2"
},
]

目前的问题是无法预知输入路径对应的嵌套层级数量,也没法通过固定的for循环遍历未知字段,想问这个需求是否可行?


可行,通过递归函数实现

Terraform支持通过递归本地值处理未知层级的嵌套结构,核心思路是遍历目标路径下的所有元素,判断元素类型:如果是数组则直接收集,如果是Map则递归遍历其值,最后用flatten合并所有收集到的数组。

实现步骤

  1. 解析输入路径,获取对应的目标节点
  2. 定义递归函数,自动遍历所有嵌套层级,收集数组元素
  3. 用flatten展开嵌套数组,得到一维的合并结果

代码示例

variable "root" {
  type = any
  default = {
    nat = {
      pr = {
        dev = [{
          value       = "10.10.10.10"
          description = "test1"
        }]
      },
      pr2 = {
        dev  = [{
          value       = "10.10.10.11"
          description = "test2"
        }]
        prod = []
      }
    },
    cc = {
      pr = {
        jej = [{
          value       = "10.10.10.10"
          description = "test"
        }]
      }
    },
    smt = {
      st = [{
        value       = "10.10.10.10"
        description = "test"
      }],
      s2 = [{
        value       = "10.10.10.10"
        description = "tt"
      }]
    }
  }
}

variable "target_path" {
  type = string
  default = "root.nat"
}

locals {
  # 解析路径,逐层获取目标节点(支持任意层级路径)
  get_target_node = func(path_parts, current_node) {
    if length(path_parts) == 0 {
      return current_node
    }
    return local.get_target_node(slice(path_parts, 1, length(path_parts)), lookup(current_node, path_parts[0], {}))
  }

  target_node = local.get_target_node(split(".", var.target_path), var.root)

  # 递归收集所有数组元素
  collect_arrays = func(node) {
    if type(node) == list(any) {
      return node
    }
    elif type(node) == map(any) {
      return flatten([for v in values(node) : local.collect_arrays(v)])
    }
    return []
  }

  # 最终合并结果
  merged_result = local.collect_arrays(local.target_node)
}

output "merged_output" {
  value = local.merged_result
}

关键说明

  • 路径解析:get_target_node函数支持任意层级的路径输入(比如root.nat.pr),通过递归逐层查找目标节点,无需固定层级逻辑。
  • 递归收集:collect_arrays函数会自动处理新增的嵌套层级,只要是Map就继续递归遍历,遇到数组直接收集,非数组/Map的元素会被忽略。
  • 版本要求:需要Terraform 0.14及以上版本,该版本开始支持本地值的递归函数特性。

内容的提问来源于stack exchange,提问作者DISCO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:25:18