Проблемы с Terraform / HCL в Azure

Я новичок в HCL и Terraform, и у меня возникли проблемы с привязкой группы безопасности и пула внутренних адресов к сетевому интерфейсу. Я создаю 2 сетевых интерфейса в одном блоке сетевого интерфейса:

#Create network interface for 2 VMs
resource "azurerm_network_interface" "FrontNetworkInterface" {
    count = 2
    name = "niFront${count.index}"
    location = azurerm_resource_group.PWSDevResourceGroup.location
    resource_group_name = azurerm_resource_group.PWSDevResourceGroup.name

    ip_configuration {
        name = "ipconfFrontVM"
        subnet_id = azurerm_subnet.PWSDevSubnet.id
        private_ip_address_allocation = "dynamic"
    }
}

Я пробовал связывать разными способами, которые приводили к различным ошибкам:

ПОПЫТКА 1:

#Connect security group to the network interface
resource "azurerm_network_interface_security_group_association" "PWSDevSecurityGroupAssoc" {
    network_interface_id = azurerm_network_interface.FrontNetworkInterface.id
    network_security_group_id = azurerm_network_security_group.PWSDevSecurityGroup.id
}

#Connect 2 backend ips to the load balancer
resource "azurerm_network_interface_backend_address_pool_association" "BackendIPAssoc" {
    network_interface_id = azurerm_network_interface.FrontNetworkInterface.id
    ip_configuration_name = "bipa"
    backend_address_pool_id = azurerm_lb_backend_address_pool.BackendIpPool.id
}

ОШИБКИ:

Ошибка: отсутствует ключ экземпляра ресурса в строке 85 front.tf, в ресурсе azurerm_network_interface_security_group_association PWSDevSecurityGroupAssoc: 85: network_interface_id = azurerm_network_interface.FrontNetworkInterface.id Должен быть. Например, для корреляции с индексами ссылающегося ресурса используйте: azurerm_network_interface.FrontNetworkInterface [count.index]

Ошибка: отсутствует ключ экземпляра ресурса в строке 91 front.tf, в ресурсе azurerm_network_interface_backend_address_pool_association BackendIPAssoc: 91: network_interface_id = azurerm_network_interface.FrontNetworkInterface.id, поскольку для экземпляров azurerm_network_interface.FrontNetwork должны быть установлены атрибуты countNetwork, специфичные для azurerm_network_interface.FrontNetwork Например, для корреляции с индексами ссылающегося ресурса используйте: azurerm_network_interface.FrontNetworkInterface [count.index]

ATTEMPT 2/3/4 (Использование [count.index], [count.index] .id или [element (azurerm_network_interface.FrontNetworkInterface. *. Id, count.index)], как описано в предыдущей ошибке):

#Connect security group to the network interface
resource "azurerm_network_interface_security_group_association" "PWSDevSecurityGroupAssoc" {
    network_interface_id = azurerm_network_interface.FrontNetworkInterface[count.index]
    network_security_group_id = azurerm_network_security_group.PWSDevSecurityGroup.id
}

#Connect 2 backend ips to the load balancer
resource "azurerm_network_interface_backend_address_pool_association" "BackendIPAssoc" {
    network_interface_id = azurerm_network_interface.FrontNetworkInterface[count.index]
    ip_configuration_name = "bipa"
    backend_address_pool_id = azurerm_lb_backend_address_pool.BackendIpPool.id
}

ОШИБКА (тот же результат для [count.index] .id и [element (azurerm_network_interface.FrontNetworkInterface. *. Id, count.index)]):

Ошибка: ссылка на счетчик в контексте без подсчета в строке 85 front.tf в ресурсе azurerm_network_interface_security_group_association PWSDevSecurityGroupAssoc: 85: network_interface_id = azurerm_network_interface.FrontNetworkInterface [count.index]. и только когда установлен аргумент count.

Ошибка: ссылка на счетчик в неподсчитываемом контексте front.tf, строка 91, в ресурсе azurerm_network_interface_backend_address_pool_association BackendIPAssoc: network_interface_id = azurerm_network_interface.FrontNetworkInterface [count.index] Объект счетчика может использоваться только в блоках, модуле ресурсов и данных. установлен аргумент count.

Кроме того, я получаю эту ошибку в своем блоке azurerm_virtual_machine:

строка 162 в ресурсе azurerm_virtual_machine FrontEndVirtualMachines: 162: admin_ssh_key {Блоки типа admin_ssh_key здесь не ожидаются.

Я слежу за тем, что показано здесь:

https://docs.microsoft.com/en-us/azure/developer/terraform/create-linux-virtual-machine-with-infrastructure

Как видите, предусмотрен блок admin_ssh_key. Я пробовал использовать версию 2.0, используемую в сценариях; однако я испытал тот же результат.

Спасибо за вашу помощь!! :)


person Dan    schedule 16.09.2020    source источник


Ответы (2)


При ссылке на ресурс, созданный с помощью count, вам все равно нужно добавить .id. См. Следующий пример. Для получения дополнительной информации см. Эту ссылку.

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

resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "East US"
}

resource "azurerm_virtual_network" "example" {
  name                = "vnet"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  address_space       = ["10.0.0.0/16"]
  dns_servers         = ["10.0.0.4", "10.0.0.5"]
}

resource "azurerm_subnet" "example" {
  name                 = "example"
  resource_group_name  = azurerm_resource_group.example.name
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefixes     = ["10.0.1.0/24"]
}

resource "azurerm_network_interface" "example" {
  count               = 2
  name                = format("int%s", count.index)
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  ip_configuration {
    name                          = "ip"
    subnet_id                     = azurerm_subnet.example.id
    private_ip_address_allocation = "dynamic"
  }
}

resource "azurerm_network_security_group" "example" {
  name                = "acceptanceTestSecurityGroup1"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  security_rule {
    name                       = "test123"
    priority                   = 100
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "*"
    destination_port_range     = "*"
    source_address_prefix      = "*"
    destination_address_prefix = "*"
  }
}

resource "azurerm_network_interface_security_group_association" "secgroup" {
  count                     = length(azurerm_network_interface.example)
  network_interface_id      = azurerm_network_interface.example[count.index].id
  network_security_group_id = azurerm_network_security_group.example.id
}
person Christian Pearce    schedule 17.09.2020
comment
Огромное спасибо! Это очень очевидно; однако мои глаза этого не видели! :) Любые мысли по второй проблеме в блоке azurerm_virtual_machine: строка 162, в ресурсе azurerm_virtual_machine FrontEndVirtualMachines: 162: admin_ssh_key {Здесь не ожидается блоков типа admin_ssh_key. Я слежу за тем, что показано здесь: docs.microsoft.com/en-us/azure/developer/terraform/ Как видите, предусмотрен блок admin_ssh_key. Я пробовал использовать версию 2.0, используемую в сценариях; однако я испытал тот же результат. - person Dan; 17.09.2020
comment
открыть отдельный вопрос - person Christian Pearce; 17.09.2020

Признаюсь, я не прочитал всю историю, но похоже, что ваша попытка №2 / 3/4 была довольно близкой. Если вы используете [count.index], вам нужно указать count, иначе счетчик для индексации не будет. Так что если вы просто добавите count = 2 к этим двум ресурсным блокам, это должно сработать.

Еще лучше, либо использовать 2 в качестве переменной, либо использовать

count = len(azurerm_network_interface.FrontNetworkInterface)

чтобы гарантировать, что вы не получите несовпадающие числа, когда вы позже измените 2.

person lxop    schedule 16.09.2020
comment
Огромное спасибо! Это очень очевидно; однако мои глаза этого не видели! :) Любые мысли по второй проблеме в блоке azurerm_virtual_machine: строка 162, в ресурсе azurerm_virtual_machine FrontEndVirtualMachines: 162: admin_ssh_key {Здесь не ожидается блоков типа admin_ssh_key. Я слежу за тем, что показано здесь: docs.microsoft.com/en-us/azure/developer/terraform/ Как видите, предусмотрен блок admin_ssh_key. Я пробовал использовать версию 2.0, используемую в сценариях; однако я испытал тот же результат. - person Dan; 17.09.2020