You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:22:41