1

I'm facing issues during creation of multiple VMs in Azure with Terraform. Each time it is failing because it is picking the same network-interface-id. So how can I change my Terraform code to make this use the different network interfaces?

Here is my Terraform file:

variable "node_count" {default = 2} 

resource "azurerm_network_interface" "terraform-CnetFace" {
  name = "cacctni-${format("%02d", count.index+1)}"
  location = "East US 2"
  resource_group_name = "${azurerm_resource_group.terraform-test.name}"

  ip_configuration {
      name = "cIpconfig-${format("%02d", count.index+1)}"
      subnet_id = "${azurerm_subnet.terraform-test.id}"
      private_ip_address_allocation = "dynamic"
  }
  count = "${var.node_count}"
}

variable "confignode_count" {default = 2} 

resource "azurerm_virtual_machine" "terraform-test" {
  name   = "confignode-${format("%02d", count.index+1)}"
  location = "East US 2"
  resource_group_name = "${azurerm_resource_group.terraform-test.name}"
  network_interface_ids = ["${azurerm_network_interface.terraform-CnetFace.id}"]
  vm_size = "Standard_A0"
  availability_set_id = "${azurerm_availability_set.terraform-test.id}"

  storage_image_reference {
      publisher = "Canonical"
      offer = "UbuntuServer"
      sku = "14.04.2-LTS"
      version = "latest"
  }

  storage_os_disk {
      name = "configosdisk-${format("%02d", count.index+1)}"
      vhd_uri = "${azurerm_storage_account.terraform-test.primary_blob_endpoint}${azurerm_storage_container.terraform-test.name}/configosdisk-${format("%02d", count.index+1)}.vhd"
      caching = "ReadWrite"
      create_option = "FromImage"
  }

  storage_data_disk {
  name          = "configdatadisk-${format("%02d", count.index+1)}"
  vhd_uri       = "${azurerm_storage_account.terraform-test.primary_blob_endpoint}${azurerm_storage_container.terraform-test.name}/configdatadisk-${format("%02d", count.index+1)}.vhd"
  disk_size_gb  = "512"
  create_option = "empty"
  lun           = 0
  }

  os_profile {
      computer_name = "confignode-${format("%02d", count.index+1)}"
      admin_username = "ubuntu"
      admin_password = "Qawzsx12345"
  }

  os_profile_linux_config {
      disable_password_authentication = false
  }

  tags {
      environment = "Production"
  }
  provisioner "local-exec" {
      command = "sleep 30"
  }

  #Loop for Count
  count = "${var.confignode_count}"
}

1 Answer 1

5

If you're trying to link two resources as you loop through them then you need to use "splats" to retrieve the list of resources created in a loop and select the right one. This is explained briefly in the interpolation syntax docs and the resources docs.

In your case you probably want something like:

variable "count" {default = 2} 

resource "azurerm_network_interface" "terraform-CnetFace" {
  count = "${var.count}"
  ...
}

resource "azurerm_virtual_machine" "terraform-test" {
  count = "${var.count}"
  ...
  network_interface_ids = ["${element(azurerm_network_interface.terraform-CnetFace.*.id, count.index)}"]
  ...
}

This exposes the outputs for each of the looped network interfaces created and then loops through them grabbing the id from the output and passing it to the appropriate azurerm_virtual_machine.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.