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

Terraform - Delete all resources except one

我有一个包含 30-40 种不同资源的 Terraform 0.11 项目。除了少数几个,我想删除所有这些 - 而这几个在逻辑上彼此相关。

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

有没有办法在不编写太多脚本的情况下实现这一点(Terraform 管理员有各种操作系统)?使用模块是否会使该过程更容易?

目前 terraform destroy 命令中没有 --except 功能。如果你真的想这样做,并且你知道自己在做什么,这里是解决方法。

# 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 excluded resource(s)
terraform destroy 

那么为什么这些命令对您的想法有效?

The state Terraform 使用 (*.tfstate) 将现实世界的资源映射到您的配置,跟踪元数据。

terraform state rm 仅从状态文件 (*.tfstate) 中清除记录(资源)。它不会破坏真正的资源。

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

当您 运行 terraform destroy 时,它没有关于被排除资源状态的详细信息,也不会销毁它。它会摧毁其余的。

顺便说一句,如果您愿意,稍后您仍然可以使用 terraform import 命令将资源导入回来。

我有一些不同的解决方法。我不想使用 "terraform destroy" 删除的资源我使用带有 CLI 的供应器创建为 "null_resource"。您仍然可以在 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 都将保持不变。

针对除您想要的资源之外的每个资源(同时跳过数据资源)可能是唯一的方法 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")

terraform destroy -target RESOURCE_TYPE.NAME -target RESOURCE_TYPE2.NAME

  1. 列出资源:

    terraform state list
    
      data.terraform_remote_state.rg
      azurerm_postgresql_database.postgresql_database
      azurerm_postgresql_server.postgresql_server
    
  2. 删除资源

    terraform destroy -target azurerm_postgresql_database.postgresql_database -auto-approve