Проблемы с созданием нескольких виртуальных машин с Terraform для Azure - PullRequest
0 голосов
/ 24 марта 2020

У меня проблемы с созданием нескольких виртуальных машин в Azure с использованием Terraform. При создании сетевых интерфейсов я сталкиваюсь с ошибкой, связанной с созданием идентификатора IP-адреса publi c:

Error message

Я предполагаю, что использую функция подсчета неверна или требует совершенно другого подхода.

Код:

provider "azurerm" {
  version = "~>2.0"
  features {}

  subscription_id = "XXXX"
  client_id       = "XXXX"
  client_secret   = "XXXX"
  tenant_id       = "XXXX"
}

resource "azurerm_resource_group" "rg" {
    name        = "${var.prefix}test_project"
    location    = var.location
    tags        = var.tags
}

resource "azurerm_virtual_network" "vnet" {
    name                = "${var.prefix}Vnet"
    address_space       = ["10.0.0.0/16"]
    location            = var.location
    resource_group_name = azurerm_resource_group.rg.name
    tags                = var.tags
}

resource "azurerm_subnet" "subnet" {
    name                 = "${var.prefix}Subnet"
    resource_group_name  = azurerm_resource_group.rg.name
    virtual_network_name = azurerm_virtual_network.vnet.name
    address_prefix       = "10.0.1.0/24"
}

resource "azurerm_public_ip" "publicip" {
    name                    = "${var.prefix}PublicIP${count.index}"
    location                = var.location
    resource_group_name     = azurerm_resource_group.rg.name
    allocation_method       = "Dynamic"
    tags                    = var.tags
    count                   = 2
}

resource "azurerm_network_security_group" "nsg" {
    name                = "${var.prefix}NetworkSecurityGroup"
    location            = var.location
    resource_group_name = azurerm_resource_group.rg.name
    tags                = var.tags

    security_rule {
        name                       = "SSH"
        priority                   = 1001
        direction                  = "Inbound"
        access                     = "Allow"
        protocol                   = "Tcp"
        source_port_range          = "*"
        destination_port_range     = "22"
        source_address_prefix      = "*"
        destination_address_prefix = "*"
    }
}

resource "azurerm_network_interface" "nic" {
    name                        = "${var.prefix}NIC${count.index}"
    location                    = var.location
    resource_group_name         = azurerm_resource_group.rg.name
    tags                        = var.tags
    count                       = 2

    ip_configuration {
        name                          = "${var.prefix}NICConfig${count.index}"
        subnet_id                     = azurerm_subnet.subnet.id
        private_ip_address_allocation = "Dynamic"
        public_ip_address_id          = ["${element(azurerm_public_ip.publicip.id, count.index)}"]
    }
}

resource "azurerm_network_interface_security_group_association" "example" {
    count = length(azurerm_network_interface.nic)
    network_interface_id      = "${azurerm_network_interface.nic[count.index]}"
    network_security_group_id = azurerm_network_security_group.nsg.id
}

resource "azurerm_linux_virtual_machine" "vm" {
    count                   = 2
    name                    = "${var.prefix}VM${count.index}"
    location                = var.location
    resource_group_name     = azurerm_resource_group.rg.name
    network_interface_ids   = azurerm_network_interface.nic[count.index]
    size                    = "Standard_DS1_v2"
    tags                    = var.tags

    os_disk {
        name                    = "${var.prefix}OsDisk${count.index}"
        caching                 = "ReadWrite"
        storage_account_type    = "Premium_LRS"
    }

    source_image_reference {
        publisher = "Canonical"
        offer     = "UbuntuServer"
        sku       = lookup(var.sku, var.location)
        version   = "latest"
    }

    computer_name  = "${var.computer_name}-${count.index}"
    admin_username = var.admin_username
    admin_password = var.admin_password
    disable_password_authentication = false
}

Может кто-нибудь помочь мне решить эту проблему ??

1 Ответ

0 голосов
/ 24 марта 2020

Я уверен, что все, что вам нужно сделать, это изменить

        public_ip_address_id          = ["${element(azurerm_public_ip.publicip.id, count.index)}"]

на

        public_ip_address_id          = ["${azurerm_public_ip.publicip[count.index].id}"]

В общем, ссылки типа azurerm_public_ip.publicip.id работают для отдельных ресурсов (то есть тех, которые не используйте счет). Таким образом, использование element предполагает использование единственного ресурса. Как только count используется, ресурсы начинают вести себя как списки и должны рассматриваться как таковые.

...