我有一个Terraform 0.11项目,其中包含30-40种不同的资源。我想删除所有的人,但其中的一些人-在逻辑上是相互关联的。
我一直在寻找接近terraform destroy --except=resource-id
的东西,但是那当然不存在。
有没有一种方法可以在没有太多脚本的情况下实现(Terraform管理员具有各种操作系统)?使用模块也许会使该过程更容易?
答案 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 apply
或terraform 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")