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 apply
或terraform 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 - 删除除一个以外的所有资源的主要内容,如果未能解决你的问题,请参考以下文章
使用 OLE,从 OpenOffice/LibreOffice Calc 文档中删除除第一个以外的所有工作表,而不使用工作表名称