仅将 public IP 添加到一个 NIC (Azure)

Add public IP to only one NIC (Azure)

我正在通过 for_each 创建多个 VM,但只有一个必须具有 public 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"
  }
}

使用以下方法,您可以准备条件 public 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)
 }
}