我有一个Terraform 0.11项目,包含30-40个不同的资源。我想删除其中除了几个逻辑相关的资源之外的所有资源。
我正在寻找类似于terraform destroy --except=resource-id
的功能,但当然这样的命令并不存在。
是否有办法在不过多编写脚本的情况下实现这一点(Terraform管理员使用各种操作系统)?也许使用模块可以使该过程更加容易?
我有一个Terraform 0.11项目,包含30-40个不同的资源。我想删除其中除了几个逻辑相关的资源之外的所有资源。
我正在寻找类似于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
状态(*.tfstate)用于将实际世界的资源映射到您的配置中,跟踪元数据。
terraform state rm
仅从状态文件(*.tfstate)中清除记录(资源),不会销毁实际资源。
由于您没有运行 terraform apply
或 terraform refresh
,在执行 terraform state rm
后,terraform 不会知道排除的资源被创建了。
当您运行 terraform destroy
时,它不会详细了解该排除资源的状态并且不会销毁它。 它将销毁其余部分。
顺便说一下,如果需要,您以后仍有机会使用 terraform import
命令将该资源重新导入。
import
是什么意思?terraform import <resource_to_be_reimported>
是什么? - Panda目前,针对除你想要的数据资源之外的每个资源进行定位可能是唯一的方式:
#! /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
terraform state rm "aws_myresource"
。它不会从云中删除资源,而只是从terraform视角中删除。terraform destroy
terraform state pull > state-to-edit.json
bkup.json
中的资源对象{}
添加到.resources []
块中来编辑state-to-edit.json
。您还需要将.serial
值增加1terraform state push ./state-to-edit.json
terraform plan
或terraform state list
验证您仍具有所需的资源并删除了所有其他资源。BMW的回答是最好的选择,如果你只需要摧毁资源,而不改变代码。也就是说,如果你打算在以后的某个时间重新启动这些资源。
如果你只想删除资源,正确的解决方案是删除你想要销毁的Terraform定义,然后进行正常的terraform apply
操作。就像你添加资源一样。
(我知道这是一个旧问题,但我很惊讶没有人提到替代方案。OP的用例似乎已经被其他答案涵盖了,所以这个答案是为了其他人在这里遇到问题时提供帮助。)
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 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 destroy -target 资源类型.名称 -target 资源类型2.名称