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

如何使用Terraform的for in语法展平嵌套map获取GitLab组ID

问题原因

你的写法存在两个核心问题:

  1. 语法错误:Terraform 构造map的for表达式语法为 {for k, v in 源集合: 键 => 值},你每层循环都额外套了一层冗余大括号,不符合语法规范,因此触发缺失分隔符的报错。
  2. 扩展性缺陷:硬编码了每一层子组容器的键名(sub_group_1/sub_group_2等),只要后续嵌套层级变化、子组键名修改,代码就会直接失效。
正确实现方案

使用Terraform支持的递归自定义函数处理,无需硬编码层级,适配任意深度的嵌套组结构:

locals {
  # 你原有的嵌套组定义
  groups = {
    group1 = {
      id = 1
      sub_group_1 = {
        group2 = {
          id = 2
        }
        group3 = {
          id = 3
          sub_group_2 = {
            group4 = {
              id = 4
              sub_group_3 = {
                group5 = {
                  id = 5
                  sub_group_4 = {
                    group6 = {
                      id = 6
                      sub_group_5 = {
                        group7 = {
                          id = 7
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }

  # 递归展平函数:输入嵌套组map,返回单层{组名:组ID}结构
  flatten_groups = function(input_map) {
    return merge([
      for group_name, group_attrs in input_map : merge(
        # 加入当前层的组名与ID映射
        { (group_name) = group_attrs.id },
        # 递归处理当前组下所有子组容器(排除id字段)
        merge([
          for attr_key, attr_value in group_attrs :
          attr_key != "id" ? local.flatten_groups(attr_value) : {}
        ]...)
      )
    ]...)
  }

  # 最终展平后的组映射
  flattened_groups = local.flatten_groups(local.groups)
}

# 输出验证
output "groups" {
  value = local.flattened_groups
}
效果验证

执行terraform apply后输出结果和你预期的完全一致:

groups = {
  "group1" = 1
  "group2" = 2
  "group3" = 3
  "group4" = 4
  "group5" = 5
  "group6" = 6
  "group7" = 7
}

后续配置gitlab_project资源时,直接用local.flattened_groups[用户传入的组名]即可获取对应组ID,无需手动查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:09:02