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

Posted

技术标签:

【中文标题】Terraform - 删除除一个以外的所有资源【英文标题】:Terraform - Delete all resources except one 【发布时间】: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 并只管理关联,但两者都觉得可以更好地处理 【参考方案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】:

    列出资源:

    terraform state list
    
      data.terraform_remote_state.rg
      azurerm_postgresql_database.postgresql_database
      azurerm_postgresql_server.postgresql_server
    

    移除资源

    terraform destroy -target azurerm_postgresql_database.postgresql_database -auto-approve
    

【讨论】:

【参考方案5】:

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

【讨论】:

你能评论我的回答有什么问题吗?

以上是关于Terraform - 删除除一个以外的所有资源的主要内容,如果未能解决你的问题,请参考以下文章

从单元格中删除除数字以外的所有内容

删除除svn以外的所有文件

UTF 8 String 删除除换行符以外的所有不可见字符

如何从 terraform 状态中删除资源?

使用 OLE,从 OpenOffice/LibreOffice Calc 文档中删除除第一个以外的所有工作表,而不使用工作表名称

从Ruby中的URL中删除除网站名称以外的所有内容[复制]