У меня есть проект Terraform 0.11 с 30-40 различными ресурсами. Я хотел бы удалить их все, кроме нескольких, которые логически связаны друг с другом.
Я искал что-то близкое к terraform destroy --except=resource-id, но этого, конечно же, не существует.
Есть ли способ добиться этого без слишком большого количества сценариев (у администраторов Terraform разные ОС)? Возможно, использование модулей облегчит этот процесс?
@ydaetskcoR Это имеет смысл. Я бы принял этот ответ, если бы вы могли его написать
Такое ощущение, что это может быть дубликат, позвольте мне покопаться, иначе я напишу это как ответ здесь.
а как же эйпс? скажем, например, вы занесли их в белый список и не хотите их уничтожать, потому что вам нужен контроль изменений в другом месте, вы настраиваете Terraform на создание и помечаете с помощью prevent_destroy, все, что prevent_destroy здесь делает, это сбой вашей команды уничтожения terraform. Вы можете создать eip вне терраформы и просто управлять ассоциацией, но оба чувствуют, что с этим можно справиться лучше.





В настоящее время в команде 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
Штат (*.tfstate) используется Terraform для сопоставления ресурсов реального мира с вашей конфигурацией, отслеживания метаданных.
terraform state rm очищает запись (ресурс) только из файла состояния (*.tfstate). Это не уничтожает реальный ресурс.
Поскольку вы не запускаете terraform apply или terraform refresh, после terraform state rm terraform вообще не знает, что исключенный ресурс был создан.
Когда вы запускаете terraform destroy, у него нет подробностей о состоянии этого исключенного ресурса, и он не уничтожит его. Это уничтожит остальных.
Кстати, позже у вас еще есть возможность импортировать ресурс обратно с помощью команды terraform import, если хотите.
Теперь это лишает состояния ресурса, который не был удален, поэтому Terraform больше не будет им управлять, что на самом деле не то, чего хотел OP. Вы мог импортируете его снова после удаления всего остального, но в целом частичное применение и уничтожение - плохая идея.
Это достойный обходной путь для моей ситуации. Не идеально, как говорит ydaetskcor, но достаточно хорошо.
работает нормально
У меня немного другая работа. Ресурсы, которые я не хочу удалять с помощью «terraform destroy», я создаю как «null_resource» с помощью поставщика с CLI. Вы также можете использовать свои переменные в 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"]
}
}
Теперь, если вы уничтожите ресурсы, используя терраформирование, уничтожьте. Любой null_resource останется нетронутым.
Ориентация на каждый ресурс (пропуская ресурсы данных), кроме того, который вам нужен, вероятно, единственный способ:
#! /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 destroy -target RESOURCE_TYPE.NAME -target RESOURCE_TYPE2.NAME
Можете ли вы прокомментировать, что не так в моем ответе?
Список ресурсов:
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
Ответ заключается в том, чтобы не структурировать свою кодовую базу таким образом. Вещи в одном и том же каталоге должны быть созданы или уничтожены одновременно. Часть, применяющая изменения, является аварийным люком, а не чем-то, на что можно положиться.