如何通过Terraform基于Azure现有VM创建共享镜像并指定源VM?
解决Terraform捕获Azure现有VM到共享镜像库的问题
你当前的代码仅定义了共享镜像库和镜像元数据,但缺少从现有VM捕获生成自定义镜像以及将自定义镜像导入共享镜像库版本这两个核心步骤。Terraform中,azurerm_shared_image只是镜像的逻辑定义,无法直接关联VM;要实现Azure门户的「捕获」操作,需要通过azurerm_image捕获VM生成自定义镜像,再用azurerm_shared_image_version将其导入共享镜像库。
完整实现代码
# 获取目标虚拟机 data "azurerm_virtual_machine" "example" { name = "example" resource_group_name = "rg-example" } # 获取资源组信息(若已创建可直接引用) data "azurerm_resource_group" "example" { name = "rg-example" } # 1. 捕获现有VM生成自定义镜像(对应门户的「捕获」操作) resource "azurerm_image" "vm_capture" { name = "captured-vm-image" resource_group_name = data.azurerm_resource_group.example.name location = data.azurerm_resource_group.example.location # 指定要捕获的源VM ID source_virtual_machine_id = data.azurerm_virtual_machine.example.id # 专用镜像:保留VM原有配置和数据,无需提前通用化;若要生成通用镜像,设为false并先在VM上执行通用化操作 specialized = true } # 2. 创建共享镜像库 resource "azurerm_shared_image_gallery" "example" { name = "example_image_gallery" resource_group_name = data.azurerm_resource_group.example.name location = data.azurerm_resource_group.example.location description = "Shared images and things." } # 3. 创建共享镜像定义(自定义镜像无需identifier块,该块用于市场镜像) resource "azurerm_shared_image" "example" { name = "my-image" gallery_name = azurerm_shared_image_gallery.example.name resource_group_name = data.azurerm_resource_group.example.name location = data.azurerm_resource_group.example.location os_type = "Linux" specialized = true # 与捕获的镜像类型保持一致 } # 4. 创建共享镜像版本,将捕获的镜像导入库中 resource "azurerm_shared_image_version" "example" { name = "1.0.0" # 遵循语义化版本规则 gallery_name = azurerm_shared_image_gallery.example.name image_name = azurerm_shared_image.example.name resource_group_name = data.azurerm_resource_group.example.name location = data.azurerm_resource_group.example.location # 引用捕获生成的自定义镜像ID source_image_id = azurerm_image.vm_capture.id target_region { name = data.azurerm_resource_group.example.location regional_replica_count = 1 } }
关键说明
azurerm_image是实现「捕获」的核心:通过source_virtual_machine_id直接关联目标VM,生成包含VM自定义软件的镜像。- 无需
identifier块:该块仅用于描述Azure市场镜像的发布者/产品/SKU信息,自定义镜像不需要配置。 - 镜像类型选择:若要生成可批量部署的通用镜像,需先在VM上执行Linux的
waagent -deprovision+user或Windows的sysprep操作,再将specialized设为false。 - 前置条件:捕获前需确保VM处于**停止(已解除分配)**状态,可通过Terraform的
null_resource调用Azure CLI提前停止VM。
内容的提问来源于stack exchange,提问作者Christian Townsend
相关产品推荐
相关产品推荐

