Search code examples
azureterraformterraform-provider-azurehclazure-availability-set

how to create a Terraform for_each loop for number of virtual machines in Azure availability set


We could create multiple azure vms in a availability set using "count" loop.

How can we create the same using "for_each" loop where the hostname and network interfaceid will be dynamic and looped over. (in terrraform > 0.12.6)

resource "azurerm_virtual_machine" "test" {

 # user provides inputs only for the number of vms to be created in the Azure avaialibility set

 count                 = var.count 
 name                  = "acctvm${count.index}"
 location              = azurerm_resource_group.test.location
 availability_set_id   = azurerm_availability_set.avset.id
 resource_group_name   = azurerm_resource_group.test.name
 network_interface_ids = [element(azurerm_network_interface.test.*.id, count.index)]
 vm_size               = "Standard_DS1_v2"
 tags                  = var.tags

Solution

  • You can specify the VM properties required in an object list, and then use a for_each loop like so:

    variable "VirtualMachines" {
      type = list(object({
        hostname= string
        interfaceid = string 
      }))
      default = [
        {
            hostname= "VM01",
            interfaceid = "01"
        },
         {
            hostname= "VM02",
            interfaceid = "02"
        }
      ]
    }
        
    resource "azurerm_virtual_machine" "test" {
    
      for_each = {for vm in var.VirtualMachines: vm.hostname => vm}
    
      name =  each.value.hostname
      location = azurerm_resource_group.test.location
      availability_set_id = azurerm_availability_set.avset.id
      resource_group_name = azurerm_resource_group.test.name
      network_interface_ids = [each.value.interfaceid]
      vm_size = "Standard_DS1_v2"
      tags = var.tags
    }