如何在Terraform的for_each中动态选映射并跳过指定条目
Terraform for_each 动态映射选择与条目过滤整合方案
直接将映射选择逻辑与过滤规则整合到同一个for表达式即可,最终实现代码如下:
for_each = { for k, v in (var.subnet_size == "large" ? var.subnet_map_large : var.subnet_map_small) : k => v if k != "AppGatewaySubnet" && v.Add_NSG }
逻辑拆解
- 动态映射选择:通过三元运算符
var.subnet_size == "large" ? var.subnet_map_large : var.subnet_map_small先确定要迭代的目标映射集合。 - 双重过滤规则:在
for表达式的if分句中同时实现两个跳过逻辑:- 排除键为
"AppGatewaySubnet"的条目:k != "AppGatewaySubnet" - 排除
Add_NSG属性为false的条目:v.Add_NSG(布尔值可直接作为判断条件,等价于v.Add_NSG == true)
- 排除键为
变量结构要求
确保subnet_map_large和subnet_map_small变量的结构包含Add_NSG布尔属性,示例定义如下:
variable "subnet_map_large" { type = map(object({ cidr_block = string # 子网的其他必要属性,可根据实际需求调整 Add_NSG = bool })) } variable "subnet_map_small" { type = map(object({ cidr_block = string Add_NSG = bool })) }
兼容你找到的compact写法(可选)
如果偏好使用compact函数的过滤方式,也可以写成如下形式(但需要重复映射选择逻辑,不如第一种方案简洁):
for_each = { for k in compact([ for k, v in (var.subnet_size == "large" ? var.subnet_map_large : var.subnet_map_small) : (k != "AppGatewaySubnet" && v.Add_NSG) ? k : "" ]) : k => (var.subnet_size == "large" ? var.subnet_map_large : var.subnet_map_small)[k] }
内容的提问来源于stack exchange,提问作者Wolfgang
相关产品推荐
相关产品推荐

