17
votes

Terraform - Supprimer toutes les ressources sauf une

J'ai un projet Terraform 0.11 avec 30 à 40 ressources différentes. Je voudrais tous les supprimer 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?


4 commentaires

La réponse est de ne pas structurer votre base de code de cette façon. Les objets dans le même répertoire doivent tous pouvoir être créés ou détruits en même temps. La partie appliquant des modifications est une trappe d'échappement, pas quelque chose sur lequel s'appuyer.


@ydaetskcoR Cela a du sens. J'accepterais cette réponse, si vous pouvez l'écrire


J'ai l'impression que c'est peut-être un doublon, laissez-moi fouiller, sinon je l'écrirai comme réponse ici.


qu'en est-il des eips? disons par exemple que vous les avez mis sur la liste blanche et que vous ne voulez pas les détruire parce que vous avez besoin d'un contrôle de modification ailleurs, vous définissez Terraform pour créer et marquer avec prevent_destroy, tout ce que prevent_destroy fait ici est d'échouer votre commande terraform destroy. Vous pouvez créer l'eip en dehors de la terraform et simplement gérer l'association, mais les deux ont l'impression que cela pourrait être mieux géré


3 Réponses :


32
votes

Il n'existe actuellement aucune fonctionnalité dans la commande terraform destroy . Si vous voulez vraiment faire cela 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 excluded resource(s)
terraform destroy 

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

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

terraform state rm nettoie un enregistrement (ressource) du fichier d'état (* .tfstate) uniquement. Cela ne détruit pas la vraie ressource.

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

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

D'ailleurs, plus tard, vous avez toujours la possibilité de saisir la ressource avec terraform import commande terraform import si vous le souhaitez.


2 commentaires

Cela rend désormais orphelin l'état de la ressource qui n'a pas été supprimée, donc Terraform ne la gérera plus, ce qui n'est pas vraiment ce que l'OP voulait. Vous pouvez l' importer à nouveau après avoir supprimé tout le reste, mais en général, appliquer et détruire partiellement est une mauvaise idée.


C'est une solution de contournement décente pour ma situation. Pas idéal, comme le dit ydaetskcor, mais assez bien.



0
votes

J'ai un travail un peu différent. Les ressources que je ne veux pas supprimer avec "terraform destroy", je les crée en tant que "null_resource" en utilisant un provisioner 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 à l'aide de terraform destroy. Toute null_resource restera intacte.


0 commentaires

1
votes

Cibler chaque ressource (tout en sautant les ressources de données) sauf celle que vous voulez est probablement le seul moyen 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")


0 commentaires