Terraform-删除除一个以外的所有资源

时间:2019-03-20 16:02:16

标签: terraform terraform-provider-aws infrastructure

我有一个Terraform 0.11项目,其中包含30-40种不同的资源。我想删除所有的人,但其中的一些人-在逻辑上是相互关联的。

我一直在寻找接近terraform destroy --except=resource-id的东西,但是那当然不存在。

有没有一种方法可以在没有太多脚本的情况下实现(Terraform管理员具有各种操作系统)?使用模块也许会使该过程更容易?

3 个答案:

答案 0 :(得分:2)

terraform destroy命令当前不存在功能。如果您确实想这样做,并且知道自己在做什么,这里是解决方法。

# list all resources
terraform state list

# remove that resource you don't want to destroy
# you can add more to be excluded if required
terraform state rm <resource_to_be_deleted> 

# destroy the whole stack except above resource(s)
terraform destroy 

那么这些命令为什么能满足您的想法?

The state(* .tfstate)被Terraform用于将实际资源映射到您的配置,并跟踪元数据。

terraform state rm从状态(* .tfstate)中删除一项(资源)。

由于您没有运行terraform applyterraform refresh,因此terraform state rm之后,terraform根本不知道所创建的排除资源。

运行terraform destroy时,它没有该资源状态,也不会破坏它。它将摧毁其余的东西。

答案 1 :(得分:1)

我有一些不同的解决方法。我不想使用带有CLI的预配器创建为“ null_resource”的“ terraform destroy”删除资源。您仍然可以在terraform中使用变量。

例如(创建一个资源组,但是由于null_resource而保持不变)

resource "null_resource" "backend-config" {
        provisioner "local-exec" {
        command     = <<EOT
    az group create --location ${var.Location} --name ${var.Resource_group_name} --tags 'LineOfBusiness=${var.Lob}' 'Region=${var.Region}' 'Purpose="Terraform-Primary-Resource-Group-${var.Lob}'
    EOT
        interpreter = ["Powershell", "-Command"]
      }
    }

现在,如果您使用Terraform destroy销毁资源。 任何null_resource都将保持不变。

答案 2 :(得分:1)

针对每个资源(跳过数据资源)定位(您想要的资源除外)可能是atm的唯一方法:

#! /bin/bash

while read -r resource; do
    terraform destroy -target="$resource"
done < <(terraform state list | grep -vE "^data\." | grep -vE "dont_remove|also_important")