如何通过Terraform基于Azure共享镜像库自定义镜像跨资源组部署虚拟机

基于共享镜像库自定义镜像通过Terraform部署到全新资源组的实现方法
前置准备
- 确认Terraform AzureRM Provider版本不低于2.40.0,该版本原生支持共享镜像作为虚拟机源的配置,低版本无法识别相关参数
- 提前收集共享镜像的完整路径信息:订阅ID、共享镜像库所在原资源组名称、共享镜像库名、自定义镜像定义名、计划使用的具体镜像版本号
- 确认Terraform绑定的身份对共享镜像资源有只读权限,无需为目标新建资源组单独配置镜像访问授权
核心配置调整
对比已掌握的常规公共镜像虚拟机部署脚本,仅需修改两处配置即可实现目标,无需重构脚本框架:
- 在脚本中新增独立的资源组定义,指定全新资源组的名称、部署区域,Terraform会自动完成该资源组的创建,无需提前在Azure控制台手动操作
- 替换原虚拟机配置中公共镜像的镜像源参数,直接引用共享镜像的完整资源ID,替换参考代码:
# 原有公共镜像配置(以Ubuntu为例) # storage_image_reference { # publisher = "Canonical" # offer = "0001-com-ubuntu-server-jammy" # sku = "22_04-lts" # version = "latest" # } # 替换为共享镜像配置 storage_image_reference { id = "/subscriptions/<替换为你的订阅ID>/resourceGroups/<替换为共享镜像所在原资源组名>/providers/Microsoft.Compute/galleries/<替换为你的共享镜像库名称>/images/<替换为你的自定义镜像定义名称>/versions/<替换为你要使用的镜像版本号>" }
- 把虚拟机依赖的所有配套资源(虚拟网络、子网、公网IP、网卡、OS磁盘)全部关联到前面定义的全新资源组ID下,保证整个部署链路在新资源组内闭环,不跨资源组混用现有资源
踩坑注意事项
- 镜像ID必须精确到具体的镜像版本层级,不能只填到镜像定义层级,否则Terraform会报资源不存在的错误
- 确认目标虚拟机的部署区域存在对应镜像版本的副本,跨区域部署时需要先在共享镜像配置中为目标区域添加镜像副本
- 部署完成后,自定义镜像本身依然保留在原有的共享镜像库资源组中,新资源组内仅存放本次创建的虚拟机及配套运行资源,不会重复存储镜像文件产生额外成本
内容的提问来源于stack exchange,提问作者Pirvu Georgian
相关产品推荐
相关产品推荐

