使用Terraform通过Azure Compute Gallery镜像创建Windows VM报错求助
问题描述
使用Terraform的azurerm_windows_virtual_machine资源,通过source_image_id引用Azure Compute Gallery镜像创建Windows虚拟机时,触发如下错误:
Error: creating Windows Virtual Machine: (Name "second-vm-test" / Resource Group "playground-rg"): compute.VirtualMachinesClient#CreateOrUpdate: Failure sending request: StatusCode=400 -- Original Error: Code="InvalidParameter" Message="Parameter 'osProfile' is not allowed." Target="osProfile"
使用普通Azure镜像(通过source_image_reference属性)时脚本运行正常,且手动通过该Gallery镜像创建虚拟机无异常。核心矛盾在于:预构建的Gallery镜像已包含操作系统配置,但Terraform默认要求填写admin_username、admin_password等osProfile相关字段,导致参数冲突。
解决方案
1. 明确镜像类型
Azure Compute Gallery中的镜像分为两类:
- 通用化镜像:可自定义osProfile参数(如用户名密码)
- 专用化镜像:自带预设的操作系统配置(如已创建的本地账户),此时Azure不允许传入额外的osProfile参数
你的场景属于使用专用化镜像,因此需要移除Terraform配置中与osProfile相关的强制字段。
2. 修改Terraform配置
删除以下字段:
admin_usernameadmin_passwordcomputer_name(若镜像已预设主机名)
修改后的资源配置示例:
resource "azurerm_windows_virtual_machine" "win_vm" { name = "second-vm-test" resource_group_name = "playground-rg" location = "eastus" size = "Standard_F2s_v2" source_image_id = "<Compute Gallary Image Resource ID>" license_type = "Windows_Server" provision_vm_agent = true network_interface_ids = [azurerm_network_interface.win_nic.id] os_disk { caching = "ReadWrite" storage_account_type = "Standard_LRS" } tags = { "OS" = "windows" "Resource group" = "playground-rg" "ResourceName" = "second-vm-test" "Size" = "Standard_F2s_v2" "created_by" = "Soumil" "created_with" = "terraform" "environment" = "test" } }
3. 验证执行
运行terraform plan确认配置已移除osProfile相关参数,随后执行terraform apply即可完成虚拟机创建。
内容的提问来源于stack exchange,提问作者Soumil Khandelwal

