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
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
}