You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Terraform for_each创建Azure VM时仅为单网卡分配公网IP的方法

解决方案

核心逻辑是使用Terraform的条件表达式,只有匹配到指定VM的时候才传入公网IP ID,否则传入null跳过该参数配置即可实现需求。

方案1:直接指定特定VM(适配你当前代码,给vm1分配公网IP)

直接修改azurerm_network_interface资源的public_ip_address_id参数即可,修改后的完整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"
    # 只有key为vm1的实例才绑定公网IP
    public_ip_address_id          = each.key == "vm1" ? azurerm_public_ip.ext_ip.id : null
  }
}

如果你需要固定取列表中的第一台VM分配公网IP,也可以通过取map的首个key来匹配,写法如下:

public_ip_address_id = each.key == keys(var.vms)[0] ? azurerm_public_ip.ext_ip.id : null

方案2:灵活可配置方式(推荐)

可以在VM的变量定义里新增assign_public_ip标识字段,后续需要调整哪台VM绑定公网IP只需要修改tfvars配置即可,无需修改主逻辑代码:

修改后的terraform.tfvars

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

修改后的main.tf对应参数

public_ip_address_id = each.value.assign_public_ip ? azurerm_public_ip.ext_ip.id : null

内容的提问来源于stack exchange,提问作者DDD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:24:03