Terraform使用vSphere新模板创建VM时避免重建已有VM的方案问询
问题根因
你当前所有通过该Terraform代码部署的虚拟机,配置项均直接关联了实时拉取的模板数据源data.vsphere_virtual_machine.template的返回值。当你更新Packer模板并覆盖原有同名模板后,数据源获取到的模板ID、硬件属性等参数会发生变化,Terraform检测到已创建的虚拟机配置与当前代码定义不一致,就会触发销毁重建逻辑。
解决方案
下面提供3种可直接落地的处理方案,可根据你的使用场景选择:
方案1:模板版本化管理(最推荐,长期维护首选)
不要用同一个名称覆盖旧模板,每次Packer构建新镜像时给模板加上版本号后缀,比如centos7-template-v20240501、centos7-template-v20240610。
- 存量虚拟机仍然关联旧版本模板的ID,不会受到新模板的任何影响
- 需要部署新虚拟机时,只需要把变量
var.vm-template-name的值修改为新版本模板的名称即可,只会新建使用新模板的虚拟机,不会改动存量资源
方案2:添加lifecycle规则忽略模板属性变更
如果暂时不想调整模板命名规则,可以在vsphere_virtual_machine资源块中添加生命周期规则,忽略所有和模板相关的属性变更,Terraform就不会再因为模板更新触发存量虚拟机的重建。
修改后的资源块示例如下:
resource "vsphere_virtual_machine" "vm" { count = var.vm-count # 原有配置完全保留,新增以下lifecycle块 lifecycle { ignore_changes = [ clone[0].template_uuid, guest_id, scsi_type, firmware, disk[0].size, disk[0].eagerly_scrub, disk[0].thin_provisioned, disk[1].eagerly_scrub, disk[1].thin_provisioned, network_interface[0].adapter_type ] } # 原有其他配置不变:name、resource_pool_id、CPU、内存、网络、磁盘、clone配置等 name = upper(var.vm-name) resource_pool_id = data.vsphere_compute_cluster.cluster.resource_pool_id datastore_id = data.vsphere_datastore.datastore.id # ... 剩余原有配置全部保留 }
该方案生效后,存量虚拟机的配置不会再跟随模板更新变动,新创建的虚拟机仍然会使用当前模板的配置进行部署,完全符合你的需求。
方案3:存量虚拟机脱离Terraform管理
如果你不需要再通过Terraform维护已部署的存量虚拟机,可以执行terraform state rm vsphere_virtual_machine.vm[索引]命令把对应虚拟机从Terraform状态文件中移除,后续模板更新、新虚拟机部署都不会再影响这些脱离管理的存量虚拟机。
内容的提问来源于stack exchange,提问作者sfgroups
相关产品推荐
相关产品推荐

