
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.