
Votre terraform apply s’est terminé : la VM est créée. Mais quelle
est son adresse IP ? Quel est le chemin du disque ? Comment transmettre
ces valeurs à un script Ansible qui doit s’exécuter juste après ?
Les outputs sont le mécanisme de Terraform pour exposer les
valeurs après l’apply. Un bloc output {} définit ce qui est affiché
en fin d’apply, récupérable avec terraform output, et transmissible
à d’autres modules via module.nom.output. Sans outputs, les valeurs
créées par Terraform restent enfouies dans le state — inaccessibles
aux outils avals. terraform output -json permet d’intégrer ces valeurs
dans des pipelines CI/CD ou des scripts shell. Les outputs sensibles
(mots de passe, tokens) sont masqués dans les logs mais restent accessibles
de façon programmatique.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Déclarer un output : bloc
output {}, value, description - Afficher les outputs :
terraform outputaprès apply - Formater en JSON :
terraform output -jsonpour les scripts - Outputs sensibles : masquer les secrets dans l’affichage
- Outputs et modules : passer des valeurs entre modules avec
module.nom.output
Prérequis
Section intitulée « Prérequis »- Terraform ≥ 1.11 installé (installer Terraform)
- Connaître les variables (variables Terraform)
L’idée derrière les outputs
Section intitulée « L’idée derrière les outputs »Pensez à une fonction qui retourne une valeur :
def create_vm(name, memory): vm_id = api_call.create(...) return vm_id # ← Expose une valeur
# Ailleursvm_id = create_vm("prod-vm", 2048)use_this_vm(vm_id)Sans return, vous n’avez aucune façon de récupérer vm_id. Les outputs Terraform font exactement cela : ils exposent les valeurs créées par vos ressources pour qu’elles soient utilisables par d’autres outils ou modules.
Déclarer un output
Section intitulée « Déclarer un output »Placez vos outputs dans outputs.tf :
output "vm_name" { description = "Nom de la VM créée" value = libvirt_domain.vm.name}
output "vm_memory" { description = "RAM allouée en MiB" value = libvirt_domain.vm.memory}
output "disk_path" { description = "Chemin du disque qcow2 sur l'hôte" value = libvirt_volume.disk.path}
output "vm_label" { description = "Label combiné pool / vm_name via locals" value = local.vm_label}Attributs d’un bloc output :
| Attribut | Rôle | Obligatoire |
|---|---|---|
value | Expression à exposer (resource.attribut, var.*, local.*) | Oui |
description | Documenter l’output | Non, mais recommandé |
sensitive | Masquer dans l’affichage | Non |
Afficher les outputs après apply
Section intitulée « Afficher les outputs après apply »Après terraform apply, les outputs apparaissent directement :
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Outputs:
disk_path = "/var/lib/libvirt/images/lab02-vm.qcow2"vm_label = "lab02/lab02-vm"vm_memory = 512vm_name = "lab02-vm"Pour les relire à tout moment sans relancer un apply :
terraform outputRésultat :
disk_path = "/var/lib/libvirt/images/lab02-vm.qcow2"vm_label = "lab02/lab02-vm"vm_memory = 512vm_name = "lab02-vm"Pour un seul output :
terraform output vm_name# "lab02-vm"Utiliser un output dans un script
Section intitulée « Utiliser un output dans un script »Le format JSON (-json) facilite l’intégration dans les pipelines CI/CD :
terraform output -json{ "disk_path": { "sensitive": false, "type": "string", "value": "/var/lib/libvirt/images/lab02-vm.qcow2" }, "vm_label": { "sensitive": false, "type": "string", "value": "lab02/lab02-vm" }, "vm_memory": { "sensitive": false, "type": "number", "value": 512 }, "vm_name": { "sensitive": false, "type": "string", "value": "lab02-vm" }}Extraire une valeur avec jq :
VM=$(terraform output -json | jq -r '.vm_name.value')echo "VM créée : $VM"# VM créée : lab02-vmOu directement :
VM=$(terraform output -raw vm_name)echo "VM créée : $VM"-raw renvoie la valeur brute (sans guillemets), utile pour les assignations shell.
Outputs sensibles
Section intitulée « Outputs sensibles »Pour masquer un output dans tous les affichages :
output "db_password" { description = "Mot de passe de la base" value = random_password.db.result sensitive = true}L’affichage montre :
db_password = <sensitive>Le -json l’indique aussi, mais sans masquer la valeur :
{ "db_password": { "sensitive": true, "type": "string", "value": "motdepasse-demo" }}Outputs entre modules
Section intitulée « Outputs entre modules »Quand vous utilisez un module, ses outputs deviennent accessibles avec module.nom_du_module.nom_output :
output "ip_address" { value = libvirt_domain.vm.network_interface[0].addresses[0]}
# root module : main.tfmodule "web" { source = "./modules/vm" # ...}
module "monitoring" { source = "./modules/monitoring" target_ip = module.web.ip_address}Ce qu’on ne peut pas faire avec un output
Section intitulée « Ce qu’on ne peut pas faire avec un output »- Passer une valeur à une variable du même module : utilisez
localspour ça (locals Terraform) - Déclencher une action : un output est passif, il ne fait qu’exposer
- Référencer un output d’un autre fichier du même module : tous les fichiers
.tfpartagent le même namespace, pas besoin d’outputs internes
À retenir
Section intitulée « À retenir »output {}dansoutputs.tfexpose une valeur après applyterraform outputrelit les outputs depuis le state sans applyterraform output -jsonet-rawfacilitent l’intégration dans les scriptssensitive = truemasque l’affichage mais pas le state- Entre modules, on accède aux outputs via
module.nom.output