如何在Terraform中根据条件向映射添加键值对
解决Terraform locals中动态条件生成映射键的问题
要实现根据route_table的值动态决定是否在子网配置映射中包含rtbl_id键,可以利用Terraform的merge函数结合条件表达式来实现,具体修改如下:
locals { snet_mappings = { for key in keys(module.subnet.snet-ids) : key => merge( # 基础配置:始终包含子网ID和NSG ID { snet_id = module.subnet.snet-ids[key] nsg_id = module.nsg.nsg-ids[var.snet_config[key]["nsg"]] }, # 条件添加路由表ID:仅当route_table不为空时才包含该字段 var.snet_config[key]["route_table"] != "" ? { rtbl_id = module.route-table.rtbl-ids[var.snet_config[key]["route_table"]] } : {} ) } }
原理说明
- 先构建包含
snet_id和nsg_id的基础对象,这是所有子网都必须包含的配置项。 - 通过条件表达式判断
route_table的值:- 若值不为空字符串,则生成包含
rtbl_id的对象; - 若为空,则生成空对象
{},不会添加任何新键。
- 若值不为空字符串,则生成包含
- 最后用
merge函数合并基础对象和条件生成的对象,从而动态控制rtbl_id字段的存在。
扩展适配
如果需要兼容route_table字段不存在的场景(而非仅为空字符串),可以改用lookup函数做更健壮的判断:
lookup(var.snet_config[key], "route_table", "") != "" ? { rtbl_id = module.route-table.rtbl-ids[var.snet_config[key]["route_table"]] } : {}
内容的提问来源于stack exchange,提问作者AndyB
相关产品推荐
相关产品推荐

