
Vous lancez terraform destroy et tout disparaît en une commande, mais dans quel ordre ? Si la VM utilise un réseau, peut-elle disparaître après le réseau ? Et si vous ne voulez supprimer qu'une seule ressource sur trois ?
Terraform calcule automatiquement l'ordre de destruction en inversant le graphe de dépendances. Mais certaines situations nécessitent un contrôle plus fin : supprimer une seule VM pour la recréer, retirer une ressource du code sans tout casser, ou nettoyer un state partiel après une erreur.
Ce que vous allez apprendre :
- Comment Terraform détruit dans l'ordre inverse des dépendances
- Supprimer une seule ressource avec
destroy -target - Vérifier l'état restant avec
terraform state list - La différence entre
destroy, supprimer du code +apply, etstate rm
Prérequis : avoir suivi les guides Première infrastructure et Réseau virtuel.
L'ordre inverse des dépendances
Section intitulée « L'ordre inverse des dépendances »Si votre configuration crée :
- Un réseau (
libvirt_network) - Un disque (
libvirt_volume) - Une VM (
libvirt_domain), qui dépend du réseau et du disque
Alors terraform destroy détruit dans cet ordre :
- La VM
- Le disque
- Le réseau
Terraform calcule cet ordre automatiquement en analysant les références entre ressources (libvirt_network.lab_net.name, libvirt_volume.disk.path, etc.).
Préparer et appliquer le lab
Section intitulée « Préparer et appliquer le lab »-
Créez le répertoire du lab :
Fenêtre de terminal mkdir -p ~/terraform-destroy-proprecd ~/terraform-destroy-propre -
Créez
versions.tf:terraform {required_version = ">= 1.11.0"required_providers {libvirt = {source = "dmacvicar/libvirt"version = "~> 0.8"}}}provider "libvirt" {uri = "qemu:///system"} -
Créez
main.tfavec 3 ressources :resource "libvirt_network" "lab_net" {name = "lab15-net"autostart = falseforward = { mode = "nat" }ips = [{address = "10.99.15.1"netmask = "255.255.255.0"dhcp = { ranges = [{ start = "10.99.15.100", end = "10.99.15.200" }] }}]}resource "libvirt_volume" "disk" {name = "lab15-vm.qcow2"pool = "default"target = { format = { type = "qcow2" } }create = { content = { url = pathexpand("~/images/ubuntu-24.04-cloudimg.img") } }}resource "libvirt_domain" "vm" {name = "lab15-vm"type = "kvm"memory = 512memory_unit = "MiB"vcpu = 1os = { type = "hvm", type_arch = "x86_64", type_machine = "q35" }devices = {disks = [{source = { file = { file = libvirt_volume.disk.path } }target = { dev = "vda", bus = "virtio" }}]interfaces = [{model = { type = "virtio" }source = { network = { network = libvirt_network.lab_net.name } }}]}}output "created_resources" {value = {network = libvirt_network.lab_net.namevm = libvirt_domain.vm.namedisk = libvirt_volume.disk.name}description = "Ressources créées dans ce lab"} -
Appliquez :
Fenêtre de terminal terraform initterraform apply -auto-approveSortie attendue :
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
Destroy ciblé avec -target
Section intitulée « Destroy ciblé avec -target »La plupart du temps, terraform destroy supprime tout en une fois. Mais parfois vous voulez supprimer une seule ressource, par exemple pour recréer uniquement la VM sans toucher au réseau.
terraform destroy -target=libvirt_domain.vm -auto-approveSortie :
Destroy complete! Resources: 1 destroyed.Vérifiez l'état après destroy ciblé :
terraform state listlibvirt_network.lab_netlibvirt_volume.diskLa VM a disparu, mais le réseau et le disque subsistent dans le state. Vous pouvez recréer uniquement la VM :
terraform apply -target=libvirt_domain.vm -auto-approveDestroy complet
Section intitulée « Destroy complet »Une fois les expériences terminées, détruisez toutes les ressources restantes :
terraform destroy -auto-approveSortie observée (après le destroy ciblé précédent) :
libvirt_network.lab_net: Destroying...libvirt_volume.disk: Destroying...libvirt_network.lab_net: Destruction complete after 0slibvirt_volume.disk: Destruction complete after 1s
Destroy complete! Resources: 2 destroyed.Terraform détruit uniquement ce qui reste dans son state. Il ne fait pas de double emploi.
Vérifier que l'état est propre
Section intitulée « Vérifier que l'état est propre »Après un terraform destroy, le state existe toujours mais est vide :
terraform state list# (aucune sortie — état vide)Côté libvirt :
virsh list --all # Aucune VM lab15virsh net-list # Aucun réseau lab15Que se passe-t-il si on supprime une ressource du code ?
Section intitulée « Que se passe-t-il si on supprime une ressource du code ? »Il existe une autre façon de "détruire" une ressource : la retirer de votre main.tf puis faire un terraform apply. Terraform détecte que la ressource est dans son état mais plus dans le code, et la supprime.
main.tf avant : réseau + disque + VMmain.tf après : disque + VMterraform apply : Terraform détruit le réseauC'est le comportement normal quand vous faites évoluer votre infrastructure : vous enlevez ce dont vous n'avez plus besoin.
Terraform destroy vs arrêter une VM manuellement
Section intitulée « Terraform destroy vs arrêter une VM manuellement »| Action | Ce qui se passe |
|---|---|
terraform destroy | Terraform supprime + met à jour le state |
virsh destroy lab15-vm | La VM s'arrête mais reste dans le state Terraform |
Supprimer la ressource de main.tf + apply | Terraform supprime + met à jour le state |
Si vous supprimez une ressource manuellement (sans Terraform), le prochain terraform plan détectera la divergence et proposera de recréer la ressource manquante.
À retenir
Section intitulée « À retenir »- Terraform détruit dans l'ordre inverse des dépendances, automatiquement.
destroy -target=<nom>supprime uniquement la ressource ciblée et ses dépendants.- Après un destroy ciblé, un
state listconfirme ce qui reste à gérer. - Supprimer une ressource du code puis faire un
applya le même effet qu'undestroy -target. terraform state rmne supprime pas la ressource réelle, seulement son entrée dans le state.