【问题标题】:Terraform - Delete all resources except oneTerraform - 删除除一个以外的所有资源
【发布时间】:2019-08-11 09:49:03
【问题描述】:

我有一个 Terraform 0.11 项目,其中包含 30-40 种不同的资源。除了少数之外,我想删除所有这些——而且这少数在逻辑上是相互关联的。

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

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

【问题讨论】:

  • 答案是不要以这种方式构建您的代码库。同一目录中的东西应该都可以同时创建或销毁。应用更改的部分是一个逃生口,而不是可以依赖的东西。
  • @ydaetskcoR 这是有道理的。如果你能写出来,我会接受这个答案
  • 感觉可能是重复的,让我挖一下,否则我会在这里写出来作为答案。
  • 那么 eips 呢?例如,您将这些列入白名单并且不想销毁它们,因为您需要在其他地方进行更改控制,您将 Terraform 设置为创建并标记机智 prevent_destroy,所有 prevent_destroy 在这里所做的就是使您的 terraform destroy 命令失败。您可以在 terraform 之外创建 eip 并只管理关联,但两者都觉得可以更好地处理

标签: terraform terraform-provider-aws infrastructure


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 现在这会孤立未删除的资源状态,因此 Terraform 将不再管理它,这并不是 OP 真正想要的。您可以在删除其他所有内容后再次导入它,但通常部分应用和销毁是一个坏主意。
  • 对于我的情况,这是一个不错的解决方法。正如 ydaetskcor 所说,并不理想,但已经足够了。
  • 它工作正常
【解决方案2】:

定位每个资源(同时跳过数据资源)除了你想要的可能是 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")

【讨论】:

    【解决方案3】:

    我有一些不同的工作。我不想用“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 都将保持不变。

    【讨论】:

      【解决方案4】:
      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
        

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 你能评论我的回答有什么问题吗?
        猜你喜欢
        • 1970-01-01
        • 2022-07-28
        • 1970-01-01
        • 2017-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-05
        • 1970-01-01
        相关资源
        最近更新 更多