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合并所有收集到的数组。
实现步骤
- 解析输入路径,获取对应的目标节点
- 定义递归函数,自动遍历所有嵌套层级,收集数组元素
- 用
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
相关产品推荐
相关产品推荐

