我有一个Terraform 0.11项目,具有30-40个不同的资源。我想删除除几个以外的所有这些 - 少数在逻辑上相关。
我正在寻找靠近terraform destroy --except=resource-id
的东西,但这当然不存在。
有没有办法在没有太多脚本的情况下实现这一目标(Terraform Admins有各种各样的OSS)?使用模块是否会使该过程更容易?
当前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
那么为什么这些命令适合您的想法?
Terraform使用状态(*.tfstate)将现实世界资源映射到您的配置,跟踪元数据。
terraform state rm
仅从状态文件(*.tfstate)清洁记录(资源)。它不会破坏真正的资源。
由于您不运行terraform apply
或terraform refresh
,在terraform state rm
之后,Terraform根本不知道排除的资源是完全创建的。
运行terraform destroy
时,它没有关于该资源状态的细节,并且不会销毁它。它将摧毁其余的。
顺便说一句,以后您仍然有机会使用terraform import
命令将资源导入。
针对每个资源(在跳过数据资源时),除了您想要的一个资源可能是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 state pull > bkup.json
- 列出您的所有资源:
terraform state list
- 'rm&quot您要保留的资源:
terraform state rm "aws_myresource"
。它不会删除云中的资源,而只能从Terraform的角度删除。 - 销毁您的堆栈:除了您的" rm quot"之外,它将从云中删除所有资源。就在。
terraform destroy
- 您现在有一个空状态(0资源)。保存它以便能够编辑:
terraform state pull > state-to-edit.json
- 通过在
.resources[]
块中的bkup.json
添加资源对象{}
来编辑state-to-edit.json
。您还需要增加1个.serial
值 - 推动修改状态:
terraform state push ./state-to-edit.json
- 您可以使用
terraform plan
或terraform state list
验证您仍然拥有所需的资源&amp;删除了所有其他。
我周围有一些不同的工作。我不想用" 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销毁销毁资源。任何null_resource都将保持完整。
宝马的答案是最好的,如果您只需要销毁东西,而不要更改代码。也就是说,如果您打算在以后的某个时间恢复这些资源。
如果您只想删除资源,则适当的解决方案是删除要销毁的Terraform定义,然后进行正常的terraform apply
。就像您为添加的资源一样。
(我知道一个古老的问题,但是我很惊讶地看到任何人提到其他问题。
-
列表资源:
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
terraform destery -target resource_type.name -target resource_type2.name