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

Terraform嵌套循环:在所有资源组中创建虚拟网络

问题:在所有资源组中创建所有定义的虚拟网络

需求

要在所有已定义的resource_groups中,创建每一个已定义的virtual_networks,即每个资源组都要包含所有虚拟网络实例。

变量定义

inputs = {
  virtual_networks = {
    "test-net1": {
      address_space = ["10.0.0.0/24"]
    }

    "test-net2": {
      address_space = ["10.0.1.0/24"]
    }
  }
  resource_groups = {
    "group1": {
      location  = "West Europe"
    }
    "group2": {
      location  = "East Europe"
    }
  }
}

当前实现的局限

现有resource块仅能遍历资源组,且只能创建第一个虚拟网络,代码如下:

resource "azurerm_virtual_network" "virtual_network" {
  for_each = var.resource_groups

  name                = <FIRST KEY OF var.virtual_networks>
  resource_group_name = each.key
  location            = each.value["location"]
  address_space       = <ADDRESS_SPACE VALUE OF FIRST NETWORK FROM var.virtual_networks>
}

尝试过的方法及问题

曾尝试通过local变量合并资源组和虚拟网络,但生成的结构无法直接用于resource块的遍历:

locals = {
  resource_groups = {
    for key, resource_groups in var.resource_groups : "${key}" => 
    merge(
      var.virtual_networks,
      resource_groups
    )
  }
}

该local变量输出结果:

group1 = {
  location             = "West Europe"
  test-net1            = {
    address_space = [
      "10.0.0.0/24",
    ]
  }
  test-net2 = {
    address_space = [
      "10.0.1.0/24",
    ]
  }
}
group2  = {
  location             = "East Europe"
  test-net1            = {
    address_space = [
      "10.0.0.0/24",
    ]
  }
  test-net2 = {
    address_space = [
      "10.0.1.0/24",
    ]
  }
}

这个结构按资源组分组,无法直接遍历每个「资源组-虚拟网络」的组合。

正确解决方案

需要构建一个包含资源组与虚拟网络笛卡尔积的local变量,每个元素对应一个要创建的虚拟网络实例:

locals {
  vnet_per_rg = flatten([
    for rg_name, rg_data in var.resource_groups : [
      for vnet_name, vnet_data in var.virtual_networks : {
        key             = "${rg_name}-${vnet_name}"
        rg_name         = rg_name
        rg_location     = rg_data.location
        vnet_name       = vnet_name
        vnet_addresses  = vnet_data.address_space
      }
    ]
  ])
  # 转换为映射,方便for_each使用
  vnet_per_rg_map = {
    for item in local.vnet_per_rg : item.key => item
  }
}

然后在resource块中遍历这个映射:

resource "azurerm_virtual_network" "virtual_network" {
  for_each = local.vnet_per_rg_map

  name                = each.value.vnet_name
  resource_group_name = each.value.rg_name
  location            = each.value.rg_location
  address_space       = each.value.vnet_addresses
}

这样就能在每个资源组中创建所有定义的虚拟网络,最终会生成4个虚拟网络实例:group1-test-net1、group1-test-net2、group2-test-net1、group2-test-net2。

内容的提问来源于stack exchange,提问作者Portal Mario

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:25:25