2016-11-11 7 views
0

У меня проблемы с созданием нескольких виртуальных машин в Azure с Terraform. Каждый раз, когда он выходит из строя, поскольку он выбирает один и тот же идентификатор сетевого интерфейса. Итак, как я могу изменить свой код Terraform, чтобы использовать его в разных сетевых интерфейсах?Нужно создавать многоуровневые vms в лазуре через терраформу

Вот мой Terraform файл:

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

ответ

2

Если вы пытаетесь связать два ресурса, как вы петлю через них, то вам нужно использовать «Splats», чтобы получить список ресурсов, созданных в цикле и выберите правильный. Это кратко объясняется в interpolation syntax docs и resources docs.

В вашем случае вы, вероятно, хотите что-то вроде:

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)}"] 
    ... 
} 

Это выставляет выходы для каждого из закольцованных сетевых интерфейсов, созданных и затем перебирает их захвата id из вывода и передачи его на соответствующий azurerm_virtual_machine ,

+0

Thanks ydaetskcoR. !!! Это сработало для меня. – 10305059