web-dev-qa-db-fra.com

Terraform - Supprimer toutes les ressources sauf une

J'ai un projet Terraform 0.11 avec 30 à 40 ressources différentes. Je voudrais les supprimer tous sauf quelques-uns - et ces quelques-uns sont logiquement liés les uns aux autres.

Je cherchais quelque chose de proche de terraform destroy --except=resource-id mais cela n'existe bien sûr pas.

Existe-t-il un moyen d'y parvenir sans trop de scripts (les administrateurs Terraform ont différents systèmes d'exploitation)? L'utilisation de modules faciliterait-elle peut-être ce processus?

10
rath

Il n'y a pas de fonctionnalité existante dans terraform destroy commande actuellement. Si vous voulez vraiment le faire et que vous savez ce que vous faites, voici la solution de contournement.

# 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 resource(s)
terraform destroy 

Alors, pourquoi ces commandes fonctionnent-elles pour votre idée?

L'état (* .tfstate) est utilisé par Terraform pour mapper les ressources du monde réel à votre configuration, garder une trace des métadonnées.

terraform state rm nettoie un élément (ressource) du fichier d'état (* .tfstate) uniquement. Il ne supprime pas la vraie ressource.

Puisque vous ne lancez pas terraform apply ou terraform refresh, après terraform state rm, terraform ne sait pas du tout que la ressource exclue a été créée.

Lorsque vous exécutez terraform destroy, il ne contient aucun détail sur l'état de cette ressource et ne la détruira pas. Cela détruira le reste.

14
BMW

Cibler chaque ressource (tout en ignorant les ressources de données), sauf celle que vous souhaitez, est probablement le seul moyen pour 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")
1
Olli K

J'ai un peu de travail différent autour. Les ressources que je ne veux pas supprimer avec "terraform destroy" que je crée en tant que "null_resource" à l'aide d'un provisionneur avec CLI. Vous pouvez également utiliser vos variables dans terraform.

par exemple (créer un groupe de ressources, mais il est persistant en raison de 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"]
      }
    }

Maintenant, si vous détruisez les ressources en utilisant terraform destroy. Tout null_resource restera intact.

0
Pwd9000