Aller au contenu
Infrastructure as Code medium

Outputs Terraform : exposer les valeurs après apply

8 min de lecture

logo terraform

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.

  • Déclarer un output : bloc output {}, value, description
  • Afficher les outputs : terraform output après apply
  • Formater en JSON : terraform output -json pour les scripts
  • Outputs sensibles : masquer les secrets dans l'affichage
  • Outputs et modules : passer des valeurs entre modules avec module.nom.output

Pensez à une fonction qui retourne une valeur :

def create_vm(name, memory):
vm_id = api_call.create(...)
return vm_id # ← Expose une valeur
# Ailleurs
vm_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.

Placez vos outputs dans outputs.tf :

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 :

AttributRôleObligatoire
valueExpression à exposer (resource.attribut, var.*, local.*)Oui
descriptionDocumenter l'outputNon, mais recommandé
sensitiveMasquer dans l'affichageNon

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 = 512
vm_name = "lab02-vm"

Pour les relire à tout moment sans relancer un apply :

Fenêtre de terminal
terraform output

Résultat :

disk_path = "/var/lib/libvirt/images/lab02-vm.qcow2"
vm_label = "lab02/lab02-vm"
vm_memory = 512
vm_name = "lab02-vm"

Pour un seul output :

Fenêtre de terminal
terraform output vm_name
# "lab02-vm"

Le format JSON (-json) facilite l'intégration dans les pipelines CI/CD :

Fenêtre de terminal
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 :

Fenêtre de terminal
VM=$(terraform output -json | jq -r '.vm_name.value')
echo "VM créée : $VM"
# VM créée : lab02-vm

Ou directement :

Fenêtre de terminal
VM=$(terraform output -raw vm_name)
echo "VM créée : $VM"

-raw renvoie la valeur brute (sans guillemets), utile pour les assignations shell.

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"
}
}

Quand vous utilisez un module, ses outputs deviennent accessibles avec module.nom_du_module.nom_output :

module/vm/outputs.tf
output "ip_address" {
value = libvirt_domain.vm.network_interface[0].addresses[0]
}
# root module : main.tf
module "web" {
source = "./modules/vm"
# ...
}
module "monitoring" {
source = "./modules/monitoring"
target_ip = module.web.ip_address
}
  • Passer une valeur à une variable du même module : utilisez locals pour ç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 .tf partagent le même namespace, pas besoin d'outputs internes
  1. output {} dans outputs.tf expose une valeur après apply
  2. terraform output relit les outputs depuis le state sans apply
  3. terraform output -json et -raw facilitent l'intégration dans les scripts
  4. sensitive = true masque l'affichage mais pas le state
  5. Entre modules, on accède aux outputs via module.nom.output

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn