使用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
相关产品推荐
相关产品推荐

