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

Azure中使用for_each部署VM时network_interface_ids索引错误求助

问题根源

你的错误核心是VM资源的each.key是虚拟机名称(如Testvm01),但NIC资源的索引key是网卡名称(如Testvm01-nic),两者不匹配,导致用VM名称去查找NIC资源时找不到对应元素。

解决方案

推荐两种简洁的修复方式,选其一即可:

方式一:统一VM和NIC的关联key

调整本地变量,让VM和NIC使用相同的标识key,再基于这个key推导VM名称和NIC名称,确保索引时一一对应:

# 用统一key关联VM和NIC的属性
locals {
  vm_instances = {
    vm1 = {
      name     = var.vm_win_name
      nic_name = var.vm_win_nic_name
      location = var.location
    }
    vm2 = {
      name     = var.vm_win_name-test
      nic_name = var.vm_win_nic_name-test
      location = var.location
    }
  }
}

# NIC资源基于统一key循环
resource "azurerm_network_interface" "nic_win_jumpbox" {
  for_each = local.vm_instances

  name                = each.value.nic_name
  location            = each.value.location
  resource_group_name = azurerm_resource_group.resource_groups[var.mgmt_resource_group_name].name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = data.azurerm_subnet.subnet_ids[2].id
    private_ip_address_allocation = "Dynamic"
  }
}

# VM资源同样用统一key循环,直接通过key关联对应NIC
resource "azurerm_windows_virtual_machine" "win_jumpbox" {
  for_each = local.vm_instances

  name                = each.value.name
  location            = each.value.location
  resource_group_name = azurerm_resource_group.resource_groups[var.mgmt_resource_group_name].name
  network_interface_ids = [azurerm_network_interface.nic_win_jumpbox[each.key].id]

  source_image_reference {
    publisher = "MicrosoftWindowsServer"
    offer     = "WindowsServer"
    sku       = "2022-datacenter-azure-edition-hotpatch"
    version   = "latest"
  }

  size                = var.vm_size
  admin_username      = "azureadmin"
  admin_password      = "Testvm1234&"
  enable_automatic_updates = false
  patch_mode          = "AutomaticByPlatform"
  tags                = local.resource_groups_tags

  os_disk {
    name                 = each.value.name
    caching              = "ReadWrite"
    storage_account_type = "StandardSSD_LRS"
  }
}

方式二:直接推导VM对应的NIC名称

如果不想改动现有local结构,可以在VM资源中,通过VM名称直接推导对应的NIC名称,再用这个名称索引NIC资源:

resource "azurerm_windows_virtual_machine" "win_jumpbox" {
  for_each = local.virtual_machines

  name                = each.key
  location            = each.value
  resource_group_name = azurerm_resource_group.resource_groups[var.mgmt_resource_group_name].name
  # 根据VM名称拼接NIC名称,匹配NIC资源的key
  network_interface_ids = [azurerm_network_interface.nic_win_jumpbox["${each.key}-nic"].id]

  # 其余配置保持不变...
}
额外优化建议
  • 避免创建多个同模式的独立变量(如vm_win_name和vm_win_name-test),改用列表或映射类型变量,更便于批量管理:
    variable "vm_instances" {
      type = list(object({
        name     = string
        nic_name = string
      }))
      default = [
        { name = "Testvm01", nic_name = "Testvm01-nic" },
        { name = "Testvm02", nic_name = "Testvm02-nic" }
      ]
    }
    
  • 敏感信息(如admin_password)不要硬编码,建议用Terraform变量或Azure Key Vault存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:20:18