
Sans bloc resource {}, Terraform ne crée rien. C'est l'unité de
base de tout projet : chaque resource {} demande à Terraform de
créer, mettre à jour ou détruire un objet précis, une VM, un volume,
un bucket, une règle DNS.
Mais l'essentiel n'est pas seulement la syntaxe du bloc : c'est la façon
dont les ressources se référencent mutuellement. Quand une libvirt_domain
utilise libvirt_volume.disk.path, Terraform détecte automatiquement
une dépendance et crée le volume avant la VM. Ce mécanisme de dépendances
implicites, déduit des références dans le code, pas déclaré
explicitement, est ce qui rend Terraform déclaratif et fiable.
Le comprendre évite les erreurs d'ordre de création et les depends_on
inutiles.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Syntaxe d'un bloc
resource {}: type, nom local, attributs - Référencer une ressource depuis une autre :
type.nom.attribut - Dépendances implicites : Terraform les détecte via les références
depends_on: forcer une dépendance quand il n'y a pas de référenceterraform state show: inspecter ce que Terraform a créé
Prérequis
Section intitulée « Prérequis »- Terraform ≥ 1.11 installé (installer Terraform)
- Providers déclarés (les providers Terraform)
L'idée derrière les ressources
Section intitulée « L'idée derrière les ressources »Pensez à une structure de données classique :
# Déclarer une structurevm = { "name": "lab-vm", "memory": 512, "disk": "lab-vm.qcow2"}
# Référencer depuis ailleursvm_info = f"created {vm['name']} with {vm['memory']}MB"En Terraform, un bloc resource {} fait exactement cela : vous déclarez une structure (une VM, un volume, un réseau), lui donnez un nom local, puis le référencez depuis d'autres ressources.
Anatomie d'un bloc resource
Section intitulée « Anatomie d'un bloc resource »resource "libvirt_volume" "disk" { name = "lab04-vm.qcow2" pool = "default"}Trois éléments fixes :
| Élément | Valeur dans l'exemple | Rôle |
|---|---|---|
| Mot-clé | resource | Toujours resource |
| Type de ressource | "libvirt_volume" | Définit quel objet créer (fourni par le provider) |
| Nom local | "disk" | Alias HCL utilisé dans votre code pour référencer cette instance |
Le type de ressource suit toujours le format "provider_type" : libvirt_volume,
libvirt_domain, aws_instance, google_compute_instance…
Le nom local ("disk") est libre, il ne correspond à aucun nom sur la
plateforme. C'est vous qui le choisissez pour organiser votre code.
Premier exemple complet
Section intitulée « Premier exemple complet »Cet exemple crée deux ressources : un volume disque, puis une VM qui l'utilise.
# Ressource 1 : le disqueresource "libvirt_volume" "disk" { name = "${var.vm_name}.qcow2" pool = var.pool
target = { format = { type = "qcow2" } } create = { content = { url = var.image_path } }}
# Ressource 2 : la VM — utilise le chemin du disqueresource "libvirt_domain" "vm" { name = var.vm_name memory = var.memory memory_unit = "MiB" vcpu = 1
devices = { disks = [ { source = { file = { file = libvirt_volume.disk.path # ← référence à ressource 1 } } target = { dev = "vda", bus = "virtio" } } ] }
depends_on = [libvirt_volume.disk]}Résultat du terraform apply, les ressources sont créées dans le bon ordre :
libvirt_volume.disk: Creating...libvirt_volume.disk: Creation complete after 0s [id=/var/lib/libvirt/images/lab04-vm.qcow2]libvirt_domain.vm: Creating...libvirt_domain.vm: Creation complete after 0s [name=lab04-vm]
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Outputs:
disk_path = "/var/lib/libvirt/images/lab04-vm.qcow2"Référencer une ressource depuis une autre
Section intitulée « Référencer une ressource depuis une autre »Pour utiliser un attribut d'une ressource dans une autre, la syntaxe est :
type_de_ressource.nom_local.attributDans notre lab :
libvirt_volume.disk.path# ↑ ↑ ↑# type nom attribut exposé par le providerCette référence crée automatiquement une dépendance implicite : Terraform
sait qu'il doit créer libvirt_volume.disk avant libvirt_domain.vm
puisque la VM a besoin du chemin du disque.
Le graphe de dépendances généré par terraform graph le confirme :
"libvirt_domain.vm" -> "libvirt_volume.disk"La flèche pointe vers la dépendance : libvirt_domain.vm dépend de
libvirt_volume.disk.
Dépendances implicites vs explicites
Section intitulée « Dépendances implicites vs explicites »Implicite (via référence)
Section intitulée « Implicite (via référence) »C'est la façon normale de gérer les dépendances. Terraform la détecte
automatiquement à partir des références type.nom.attribut dans le code :
file = libvirt_volume.disk.path # Terraform voit la ref → dépendance impliciteExplicite avec depends_on
Section intitulée « Explicite avec depends_on »Quand il n'y a pas de référence directe mais qu'une ressource doit quand
même attendre une autre, utilisez depends_on :
resource "libvirt_domain" "vm" { # ...
depends_on = [libvirt_volume.disk]}depends_on s'écrit avec une liste de références de ressources (sans
guillemets, sans attribut).
Inspecter une ressource dans le state
Section intitulée « Inspecter une ressource dans le state »Après un apply, le state enregistre les attributs réels de chaque ressource :
terraform state listlibvirt_domain.vmlibvirt_volume.diskPour inspecter une ressource en détail :
terraform state show libvirt_volume.disk# libvirt_volume.disk:resource "libvirt_volume" "disk" { allocation = 185401344 capacity = 3758096384 id = "/var/lib/libvirt/images/lab04-vm.qcow2" key = "/var/lib/libvirt/images/lab04-vm.qcow2" name = "lab04-vm.qcow2" path = "/var/lib/libvirt/images/lab04-vm.qcow2" pool = "default" target = { format = { type = "qcow2" } path = "/var/lib/libvirt/images/lab04-vm.qcow2" }}Les attributs affichés par terraform state show sont ceux qui peuvent
être référencés dans type.nom.attribut. Ici, libvirt_volume.disk.path
renvoie /var/lib/libvirt/images/lab04-vm.qcow2.
Les attributs (known after apply)
Section intitulée « Les attributs (known after apply) »Dans le plan, certains attributs affichent (known after apply) :
+ path = (known after apply)Cela signifie que la valeur est assignée par la plateforme au moment de la création, Terraform ne peut pas la connaître à l'avance. Pour les références entre ressources, Terraform gère cette incertitude en créant d'abord la ressource source avant d'utiliser sa valeur.
Meta-arguments disponibles
Section intitulée « Meta-arguments disponibles »Les meta-arguments s'appliquent à tout bloc resource {} quelle que
soit la ressource. Ils modifient le comportement de Terraform plutôt que
la ressource elle-même :
| Meta-argument | Rôle |
|---|---|
depends_on | Dépendance explicite sans référence d'attribut |
count | Créer N copies de la ressource |
for_each | Créer une copie par élément d'une map ou d'un set |
provider | Choisir une instance de provider (alias) |
lifecycle | Contrôler le comportement create/update/destroy |
count et for_each sont couverts dans leurs guides dédiés.
lifecycle sera abordé dans le guide sur le cycle de vie des ressources.
Fichier de structure recommandé
Section intitulée « Fichier de structure recommandé »Les ressources vont dans main.tf. Pour les projets plus longs, on peut
les séparer par thème (network.tf, compute.tf…), tout fichier .tf
dans le même dossier fait partie du même module.
mon-projet/├── main.tf ← libvirt_volume.disk + libvirt_domain.vm├── variables.tf ← variables d'entrée├── outputs.tf ← disk_path, vm_id└── versions.tf ← terraform {} + required_providersDépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
Error: Reference to undeclared resource | Faute de frappe dans type.nom | Vérifier le type et le nom local exacts |
(known after apply) bloquant un plan | Attribut inconnu avant création | Normal, Terraform gère l'ordre automatiquement |
| Ressource créée dans le mauvais ordre | Dépendance manquante | Ajouter une référence ou depends_on |
Error: Resource already exists | Ressource présente hors Terraform | Utiliser terraform import |
À retenir
Section intitulée « À retenir »resource "type" "nom_local" {}, le type vient du provider, le nom local est libretype.nom.attributréférence un attribut d'une autre ressource- Les références créent des dépendances implicites, Terraform respecte l'ordre
depends_ongère les dépendances comportementales sans référence d'attributterraform state show type.nomaffiche les attributs réels d'une ressource après apply(known after apply)est normal, ces valeurs sont résolues au moment de la création- Tous les fichiers
.tfd'un même dossier forment un seul module