Terraform Azure:遍历VM创建虚拟桌面应用报错求助
问题修复方案
核心错误原因
你使用的azurerm_virtual_machine是单实例数据源,不支持通过name="*"匹配多台虚拟机,因此data.azurerm_virtual_machine.vms返回的不是VM对象列表,而是无效的字符串值,遍历自然会触发"无法访问原始类型值(字符串)的属性"错误。
修复后的完整代码
# 改用复数数据源获取资源组下所有虚拟机 data "azurerm_virtual_machines" "vms" { resource_group_name = azurerm_resource_group.Clients.name } # 为每台VM的网卡单独获取IP信息 data "azurerm_network_interface" "vm_nics" { for_each = data.azurerm_virtual_machines.vms name = split("/", each.value.network_interface_ids[0])[length(split("/", each.value.network_interface_ids[0])) - 1] resource_group_name = azurerm_resource_group.Clients.name } locals { vms = [ for vm_name, vm in data.azurerm_virtual_machines.vms : { name = vm_name ip = data.azurerm_network_interface.vm_nics[vm_name].private_ip_address } ] } # 为每台VM创建虚拟桌面应用 resource "azurerm_virtual_desktop_application" "Test" { for_each = { for vm in local.vms : vm.name => vm } name = each.value.name application_group_id = azurerm_virtual_desktop_application_group.APPLICATIONGROUP.id friendly_name = each.value.name path = "C:\\Program Files" show_in_portal = true icon_path = "C:\\" icon_index = 0 }
关键修复点
- 替换单实例数据源
azurerm_virtual_machine为复数数据源azurerm_virtual_machines,它能返回资源组下所有VM的完整集合 - 通过
azurerm_network_interface数据源单独获取每台VM网卡的私有IP(azurerm_virtual_machines仅返回网卡ID,无法直接读取IP) - 修正
friendly_name中的笔误ech.value为each.value - 移除不必要的字符串插值,直接使用
each.value.name赋值
内容的提问来源于stack exchange,提问作者Stefan Stahuber
相关产品推荐
相关产品推荐

