Добавьте общедоступный IP-адрес только к одной сетевой карте (Azure)

#terraform #terraform-provider-azure

Вопрос:

Я создаю несколько виртуальных машин через for_each, но только у одной должен быть общедоступный IP-адрес. Как я могу это сделать? Понятно, как это можно сделать с помощью count, но каков способ для for_each?

main.tf

 
variable "vms" {}

resource "azurerm_network_interface" "nics" {
  for_each            = var.vms
  name                = each.value.nic
  location            = var.resource_location
  resource_group_name = azurerm_resource_group.rg.name

  ip_configuration {
    name                          = "nic-${each.value.name}"
    subnet_id                     = lookup(azurerm_subnet.subnets, each.value["subnet_id"], null)["id"]
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id          = azurerm_public_ip.ext_ip.id (BUT ONLY FOR THE FIRST VM IN LIST)
      }

}
 

terraform.tfvars

 vms = {
  vm1 = {
    disk_size = "30"
    name      = "vm1"
    nic       = "nic-1"
    sku       = "7_9"
    subnet_id = "snet1"
    username  = "centos"
    vm_size   = "Standard_B1ms"
  }
  vm2 = {
    disk_size = "35"
    name      = "vm2"
    nic       = "nic-2"
    sku       = "7_9"
    subnet_id = "snet2"
    username  = "centos"
    vm_size   = "Standard_B1ls"
  }
}
 

Ответ №1:

При следующем подходе вы можете подготовить карту условных общедоступных IP-адресов, а затем создать ресурс на основе этого.

variables.tf

 variable "vms" {
 type = map(object({
  #...
  public_ip  = optional(bool)
 }))
}
 

locals.tf

  pips = { for k, vm in var.vms : k => {
    # add required attributes to generate public ip resource
    } if vm.public_ip == true
  }
 

main.tf

  resource "azurerm_public_ip" "public_ip" {
    for_each = local.pips 

    # ...
  }

resource "azurerm_network_interface" "nics" {
   for_each = var.vms
  # ...

  ip_configuration {
  #...
  public_ip_address_id = try(azurerm_public_ip.public_ip[each.key].id,null)
 }
}

 

Комментарии:

1. У меня возникла идея с необязательным, но как это будет выглядеть с фактической ссылкой на ресурс azurerm_public_ip? Чтобы назначить IP-адрес, мне нужно получить его идентификатор от azurerm_public_ip.xxx.

2. Я отредактировал свой ответ — я думаю, что лучшим подходом было бы создать карту общедоступных IP-адресов для предварительного создания (в локальных сетях), а затем динамически ссылаться на них.

3. Спасибо! Второй подход работает! Первый показывает ошибку в синтаксисе после if.