如何使用 terraform 在每个 VNET 中创建两个 vnet 和一些子网

how to create two vnets and some subnets in each one of those VNETs using terraform

如何使用 terraform 动态创建两个 VNET 和在每个 VNET 中创建一些子网?

目前,我正在为 VNET 和子网创建四个单独的资源 2。

我只想在 tf 代码中为 VNET 使用一个资源块,为子网使用一个资源块,并让 terraform pick 说 VNET“测试”两个子网(test1-subnet、test2-subnet)和第二个 VNET 说“dev”两个独立的子网(dev1-子网、dev2-子网)。

如何使用 terraform for azure provider 来实现这个场景?

resource "azurerm_virtual_network" "example" {
  name                = "rest-network"
  address_space       = ["10.0.0.0/16"]
  location            = "eastus"
  resource_group_name  = "test-rg"
}

resource "azurerm_virtual_network" "example1" {
  name                = "test-network"
  address_space       = ["10.1.0.0/16"]
  location            = "eastus"
  resource_group_name  = "test-rg"
}

resource "azurerm_subnet" "example" {
  name                 = "rest-subnet"  
  resource_group_name  = "test-rg"
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefix       = "10.0.1.0/24"

  enforce_private_link_endpoint_network_policies = true
}

resource "azurerm_subnet" "example1" {
  name                 = "test-subnet"  
  resource_group_name  = "test-rg"
  virtual_network_name = azurerm_virtual_network.example1.name
  address_prefix       = "10.1.1.0/24"

  enforce_private_link_endpoint_network_policies = true
}

您必须参数化您的设置。一种方式,可能如下(您可能需要修改以满足您的特定需要的示例):

variable "vnets" {
    default = {
        test = {
          address_space = ["10.0.0.0/16"]
          resource_group_name  = "test-rg"          
          subnets = [{
              address_prefix       = "10.0.1.0/24"
          },
          {
              address_prefix       = "10.0.2.0/24"
          }             
          ]
        },
        dev = {
          address_space = ["10.1.0.0/16"]
          resource_group_name  = "dev-rg"          
          subnets = [{
              address_prefix       = "10.1.1.0/24"
          },
          {
              address_prefix       = "10.1.2.0/24"
          }             
          ]
        }
    }
}


locals {
    # flatten the var.vnets variable
    vnet_subnet_map = merge([
           for vnet_name, vnet_details in var.vnets:
            {
                for idx, subnet in vnet_details.subnets: 
                    "${vnet_name}-${idx}" => {
                        vnet_name = vnet_name
                        subnet_name = "${vnet_name}${idx}-subnet"
                        address_space = vnet_details.address_space
                        resource_group_name = vnet_details.resource_group_name
                        subnet_address_prefix = subnet.address_prefix
                    }
            }
        ]...) # do NOT remove the dots
}

然后创建两个 vnet 及其子网:

resource "azurerm_virtual_network" "vnet" {

  for_each            = var.vnets

  name                = "${each.key}-network"
  address_space       = each.value.address_space
  location            = "eastus"
  resource_group_name = each.value.resource_group_name
}



resource "azurerm_subnet" "subnet" {
  
  for_each             = local.vnet_subnet_map

  name                 = each.value.subnet_name
  resource_group_name  = each.value.resource_group_name
  virtual_network_name = azurerm_virtual_network.vnet[each.value.vnet_name].name
  address_prefix       = each.value.subnet_address_prefix

  enforce_private_link_endpoint_network_policies = true
}