Terraform销毁OCI计算实例报错:Saved plan is stale及相关问题咨询
问题解答
1. 修复"Saved plan is stale"销毁报错
这个错误的核心原因是你复用了创建实例时生成的旧计划文件tfplan。该计划仅对应创建操作时的状态,执行terraform apply tfplan后,Terraform的状态已经更新,旧计划与当前状态不匹配,因此被判定为过期失效。terraform state pull只是将远程状态同步到本地,无法更新已生成的计划文件。
解决方法有两种:
- 直接执行销毁命令:无需复用旧计划,切换到对应工作区后直接运行带变量的
terraform destroy:
terraform workspace select test terraform destroy \ -var compute_shape="VM.Standard.E4.Flex" \ -var compute_cpus="1" \ -var compute_memory_in_gbs="1" \ -var compute_name="test" \ -var compute_image_id="ocid1.image....." \ -var compartment_id="ocid1.compartment....." \ -var vnic_subnet_id="ocid1.subnet.oc1.iad....." \ -var vnic_assign_public_ip="true" -input=false -lock=true
- 生成销毁专用计划文件:如果必须用计划文件,重新生成针对销毁操作的计划,再执行应用:
terraform workspace select test terraform plan -destroy \ -var compute_shape="VM.Standard.E4.Flex" \ -var compute_cpus="1" \ -var compute_memory_in_gbs="1" \ -var compute_name="test" \ -var compute_image_id="ocid1.image....." \ -var compartment_id="ocid1.compartment....." \ -var vnic_subnet_id="ocid1.subnet.oc1.iad....." \ -var vnic_assign_public_ip="true" -no-color -out=tfplan-destroy -input=false -lock=true terraform apply tfplan-destroy
2. 同一目录下运行多计划并按ID/名称销毁资源
可以实现,推荐两种规范方式:
- 利用Terraform工作区(推荐):这是官方推荐的多环境隔离方案,同一目录下的不同工作区拥有独立的状态文件,资源完全隔离。你可以创建多个工作区(如test、dev、prod),每个工作区运行各自的部署计划;销毁时只需切换到目标工作区,执行
terraform destroy即可,无需担心资源混淆。 - 生成独立计划文件:不为每个环境创建工作区,而是生成不同名称的计划文件(如
tfplan-test、tfplan-prod),但销毁时必须针对对应环境重新生成销毁计划文件,不能复用旧的创建计划。这种方式状态文件共享,不如工作区隔离性好,容易出现资源管理混乱。 - 单独销毁特定资源:如果不需要销毁整个计划的资源,可通过
-target参数指定单个资源销毁,例如:
terraform destroy -target oci_core_instance.test
注意:-target会跳过依赖检查,可能导致状态不一致,仅临时应急使用。
内容的提问来源于stack exchange,提问作者Kalin Borisov
相关产品推荐
相关产品推荐

