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

