Terraform中Azure VM扩展引用VM ID报错问题求助
解决Terraform中Azure VM扩展引用对应VM ID的属性不存在错误
问题场景
使用Terraform创建Azure Windows VM模块,VM通过for_each循环批量创建。在配置azurerm_virtual_machine_extension资源时,尝试引用对应VM的ID,执行代码时报错:
virtual_machine_id = azurerm_windows_virtual_machine.windowsvm[each.value.virtual_machines_name].id each.value is object with 4 attributes This object does not have an attribute named "virtual_machines_name"
错误原因
当前var.vm-ext变量的每个对象中,并未定义virtual_machines_name这个属性,导致Terraform无法找到该字段来关联对应的VM资源。
解决方案
1. 修正变量定义
确保var.vm-ext的变量结构包含用于关联VM的字段(比如vm_name,对应VM资源azurerm_windows_virtual_machine.windowsvm的for_each键或VM名称)。示例变量定义:
variable "vm-ext" { type = map(object({ name = string vm_name = string # 新增:关联的VM名称/for_each键 publisher = string type = string type_handler_version = string })) description = "Azure VM扩展配置" }
2. 修正VM扩展资源的引用
将virtual_machine_id中的属性名改为变量中实际存在的字段(比如上面的vm_name),同时确保azurerm_windows_virtual_machine.windowsvm的for_each键与vm_name匹配。修正后的扩展资源代码:
resource "azurerm_windows_virtual_machine" "windowsvm" { for_each = var.virtual_machines name = each.value.name resource_group_name = data.azurerm_resource_group.LBS_rg.name location = data.azurerm_resource_group.LBS_rg.location size = each.value.size admin_username = each.value.admin_username admin_password = each.value.admin_password # 补充VM资源的其他必填配置(比如network_interface_ids等,原代码缺失) } resource "azurerm_virtual_machine_extension" "vm-extensions" { for_each = var.vm-ext name = each.value.name virtual_machine_id = azurerm_windows_virtual_machine.windowsvm[each.value.vm_name].id publisher = each.value.publisher type = each.value.type type_handler_version = each.value.type_handler_version # 补充扩展资源的其他必填配置(比如settings等,原代码缺失) }
额外注意事项
- 确保
var.virtual_machines的for_each键与var.vm-ext中vm_name的值一致,否则会出现找不到VM的错误。 - 检查原代码中VM资源和扩展资源是否闭合了大括号(原代码中
azurerm_windows_virtual_machine未闭合,会导致语法错误)。
内容的提问来源于stack exchange,提问作者Sarah Potrick
相关产品推荐
相关产品推荐

