【问题标题】:how to create two vnets and some subnets in each one of those VNETs using terraform如何使用 terraform 在每个 VNET 中创建两个 vnet 和一些子网
【发布时间】:2021-11-17 10:27:17
【问题描述】:

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

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

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

如何使用 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
}

【问题讨论】:

    标签: azure terraform terraform-provider-azure


    【解决方案1】:

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

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2022-07-06
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多