Terraform中使用Locals合并变量失败,寻求实现指定网络子网结构的解决方案
解决Terraform变量合并问题:将子网名称映射为完整对象
没问题,我来帮你搞定这个变量合并的需求!核心思路是利用Terraform的for表达式遍历你的networks变量,同时通过子网名称去subnets变量里查找对应的完整配置,顺便修正字段类型(比如字符串转布尔/数字)。
具体实现代码
你可以通过定义一个local来完成合并,代码如下:
locals { merged_networks = { # 遍历每个网络,保留原网络名称作为键 for network_name, network_data in var.networks : network_name => { # 处理原网络的所有字段,完成类型转换 for k, v in network_data : k => ( k == "auto_create_subnetworks" ? (v == "true" ? true : false) : k == "mtu" ? tonumber(v) : v ) # 替换subnets字段:将名称列表转为完整子网对象列表 subnets = [ for subnet_name in network_data.subnets : var.subnets[subnet_name] ] } } }
代码解释
- 外层
for表达式:遍历var.networks中的每一个网络,用原网络名称作为新对象的键,确保网络结构和原变量一致。 - 字段类型转换:通过三元运算符对
auto_create_subnetworks(字符串转布尔值)和mtu(字符串转数字)进行类型修正,其他字段直接保留原值。 - 子网映射:重新定义
subnets字段,遍历原网络的子网名称列表,从var.subnets中取出对应的完整子网对象,组成新的子网列表。
注意事项
你预期结果里的subnets列表写法(subnet-01 = { ... })在Terraform中是不合法的——列表是无键的有序集合,正确的结构是列表元素直接为子网对象。上面的代码生成的结构完全符合Terraform语法规范,同时能满足VPC模块接收子网列表对象的需求。
内容的提问来源于stack exchange,提问作者Jeff Mendez
相关产品推荐
相关产品推荐

