使用Terraform挂载已有磁盘至Windows VM时遇Unsupported block type错误
问题解决:Terraform AzureRM挂载已有磁盘到Windows VM报错
错误原因
你使用的AzureRM Provider 3.x版本对azurerm_windows_virtual_machine的磁盘配置结构做了重大调整:
- 原
storage_os_disk块已不再适用于当前资源结构;且你要挂载的是数据盘而非系统盘,错误使用了系统盘配置块。
修正方案
情况1:挂载已有磁盘作为额外数据盘
将虚拟机配置中的storage_os_disk块替换为storage_data_disk块,调整参数适配数据盘挂载要求:
# Create virtual machine resource "azurerm_windows_virtual_machine" "main" { name = "${var.prefix}-vm" admin_username = "azureuser" admin_password = random_password.password.result location = "East Us" resource_group_name = "vm-terraform-demo" network_interface_ids = [azurerm_network_interface.my_terraform_nic.id] size = "Standard_DS1_v2" # 挂载已有数据盘 storage_data_disk { name = azurerm_managed_disk.test2.name managed_disk_id = azurerm_managed_disk.test2.id caching = "ReadWrite" create_option = "Attach" lun = 0 # LUN编号从0开始,确保不与其他磁盘冲突 disk_size_gb = azurerm_managed_disk.test2.disk_size_gb } source_image_reference { publisher = "MicrosoftWindowsServer" offer = "WindowsServer" sku = "2022-datacenter-azure-edition" version = "latest" } boot_diagnostics { storage_account_uri = azurerm_storage_account.my_storage_account.primary_blob_endpoint } }
情况2:将已有磁盘作为系统盘使用
如果你的需求是用已有磁盘作为VM的系统盘(而非额外数据盘),需移除source_image_reference块,改用os_disk块配置:
# Create virtual machine resource "azurerm_windows_virtual_machine" "main" { name = "${var.prefix}-vm" admin_username = "azureuser" admin_password = random_password.password.result location = "East Us" resource_group_name = "vm-terraform-demo" network_interface_ids = [azurerm_network_interface.my_terraform_nic.id] size = "Standard_DS1_v2" # 将已有磁盘作为系统盘 os_disk { name = azurerm_managed_disk.test2.name managed_disk_id = azurerm_managed_disk.test2.id caching = "ReadWrite" create_option = "Attach" } boot_diagnostics { storage_account_uri = azurerm_storage_account.my_storage_account.primary_blob_endpoint } }
关键注意事项
- LUN编号:数据盘的
lun需从0开始,且每个磁盘的LUN必须唯一,避免冲突。 - 磁盘状态:确保要挂载的
azurerm_managed_disk.test2未被其他VM占用,且与VM处于同一区域。 - Provider版本:AzureRM 3.x版本的虚拟机资源结构与2.x差异较大,系统盘需用
os_disk块,数据盘需用storage_data_disk块。
内容的提问来源于stack exchange,提问作者Michael Mok
相关产品推荐
相关产品推荐

