Vijay Gupta
Vijay Gupta

Reputation: 47

Creating Multiple subnet in azure


Varible.tf

variable "vnet" {
  type        = map(any)
  description = "creating rg and vmet"
  default = {
    "rg1" = {
      vnet_name      = "vnet1"
      address        = ["10.0.0.0/16"]
      subnet_name    = ["snet1", "snet2"]
      subnet_address = ["10.1.0.0/24", "10.2.0.0/24"]
      location       = "south india"
    }
  }
}

main.tf

resource "azurerm_subnet" "mysubnet" {
  for_each             = var.vnet
  name                 = each.value["subnet_name"]
  address_prefixes     = each.value["subnet_address"]
  address_prefixes     = each.value["subnet_address"]
  virtual_network_name = each.value["vnet_name"]
  resource_group_name  = each.key

}

Error:

Error: Incorrect attribute value type
    on main.tf line 25, in resource "azurerm_subnet" "mysubnet":
      name                 = each.value["subnet_name"]
      each.value["subnet_name"] is tuple with 2 elements

Inappropriate value for attribute "name": string required.

How to iterate to create multiple subnet ?

Upvotes: 1

Views: 477

Answers (1)

Marcin
Marcin

Reputation: 238199

You have to flatten your variable first. For example:

locals {
  vnet_flat = merge([
     for group_name, details in var.vnet: 
      {for idx in range(length(details.subnet_name)):
          "${group_name}-${idx}" => {
              group_name = group_name
              vnet_name = details.vnet_name
              address = details.address
              subnet_name = details.subnet_name[idx]
              subnet_address = details.subnet_address[idx]
              location = details.location
          }
      }
  ]...)
}

resource "azurerm_subnet" "mysubnet" {
  for_each             = local.vnet_flat
  name                 = each.value.subnet_name
  address_prefixes     = [each.value.subnet_address]
  virtual_network_name = each.value.vnet_name
  resource_group_name  = each.value.group_name
}

The ... is for Expanding Function Arguments.

Upvotes: 1

Related Questions