如何使用Terraform的for in语法展平嵌套map获取GitLab组ID
问题原因
你的写法存在两个核心问题:
- 语法错误:Terraform 构造map的
for表达式语法为{for k, v in 源集合: 键 => 值},你每层循环都额外套了一层冗余大括号,不符合语法规范,因此触发缺失分隔符的报错。 - 扩展性缺陷:硬编码了每一层子组容器的键名(
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
相关产品推荐
相关产品推荐

