Terragrunt中for_each元参数方案:保留指定Databricks集群
解决Terraform/Terragrunt集群模块for_each类型不一致问题
问题根源
你原来的代码存在两个核心问题:
- 逻辑不符合需求:当
run_cluster_module为true时,会遍历所有集群,而非仅保留clusterX - 类型不匹配:
local.clusters是包含特定结构对象的map(map(object({...}))),而{}是默认的map(any)类型,Terraform会判定两者类型不一致,抛出错误
修复方案
直接构建一个仅包含clusterX的过滤后map,若clusterX不存在则返回空map,确保其类型与原clusters完全一致:
修改main.tf中的locals块
locals { #... 其他本地变量 clusters = { clusterA = { name = "clusterA" #... 其他集群配置 }, clusterB = { name = "clusterB" #... 其他集群配置 }, clusterX = { name = "clusterX" #... 其他集群配置 } } # 过滤出仅clusterX的配置,不存在则为空map filtered_clusters = tomap({ for cluster_key, cluster_config in local.clusters : cluster_key => cluster_config if cluster_key == "clusterX" }) }
修改集群模块的for_each配置
module "cluster" { for_each = local.filtered_clusters # 传递集群配置到模块,示例: name = each.value.name #... 其他模块属性(对应原集群配置的字段) }
说明
filtered_clusters会完全继承原clusters的类型(map(object({...}))),即使为空时也与原类型一致,彻底解决类型不匹配问题- 当
clusterX存在时,模块仅会创建该集群;不存在时,模块不会执行(因为for_each是空map)
内容的提问来源于stack exchange,提问作者André
相关产品推荐
相关产品推荐

