Variables et sorties

LinuxBeginner
Pratiquer maintenant

Introduction

Imaginez que vous commandiez un café. Si le menu indique seulement « Café », vous risquez de recevoir un café noir à chaque fois. En revanche, si le menu propose des options comme « Taille » ou « Type de lait », vous pouvez personnaliser votre commande sans que le barista doive apprendre une nouvelle recette pour chaque combinaison possible.

Dans Terraform, les variables rendent les configurations réutilisables en permettant de modifier les valeurs d’entrée sans réécrire tout le fichier.

Les sorties permettent à Terraform de communiquer des valeurs importantes produites par l’exécution, comme des identifiants, des noms ou des adresses. Ensemble, les variables et les sorties rendent les configurations Terraform plus modulaires et plus pratiques.

À la fin de ce laboratoire, vous disposerez d’une configuration Terraform flexible capable de créer à la demande des conteneurs portant des noms différents.

Les variables séparent la logique de configuration des données propres à l’environnement. Les sorties font l’inverse : elles publient les valeurs utiles produites par l’exécution afin de les transmettre à l’utilisateur ou à une automatisation ultérieure.

Créer le fichier des variables

Les bons cuisiniers organisent leurs ingrédients avant de commencer à cuisiner. Dans Terraform, il est recommandé de conserver les options personnalisées (les variables) dans un fichier séparé de la recette principale.

Le nom standard de ce fichier est variables.tf. La création de ce fichier ne modifie pas le fonctionnement de Terraform : Terraform lit tous les fichiers .tf du dossier comme s’ils formaient un seul grand livre. Cette organisation facilite toutefois la gestion du projet.

Ce principe d’organisation est important dans l’IaC, car les configurations réelles prennent rapidement de l’ampleur. Une séparation claire entre les variables, les ressources et les sorties simplifie considérablement la maintenance.

Accédez au dossier du projet et créez ce fichier.

cd ~/project
touch variables.tf

Vous disposez maintenant d’un fichier vide prêt à recevoir vos définitions. À l’étape suivante, vous y ajouterez du contenu.

Définir une variable

Vous devez maintenant déclarer les options disponibles. Cela revient à ajouter un champ « Nom » à un formulaire de commande.

Ouvrez variables.tf avec nano :

nano variables.tf

Ajoutez le bloc suivant. Il indique à Terraform qu’une option appelée container_name existe, qu’elle accepte du texte (string) et que, si l’utilisateur ne précise aucune valeur, Terraform doit utiliser ExampleNginxContainer.

variable "container_name" {
  description = "Value of the name for the Docker container"
  type        = string
  default     = "ExampleNginxContainer"
}

Enregistrez le fichier et quittez nano (Ctrl+O, Entrée, Ctrl+X).

Le champ du formulaire existe maintenant, mais vous devez encore l’utiliser dans votre recette. Vous allez créer un fichier main.tf qui utilise cette variable.

Créez main.tf :

nano main.tf

Collez le code suivant. Faites attention à name = var.container_name. C’est ainsi que vous insérez la variable dans la configuration.

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 3.0.1"
    }
  }
}

provider "docker" {}

resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}

resource "docker_container" "nginx" {
  image = docker_image.nginx.image_id
  name  = var.container_name
  ports {
    internal = 80
    external = 8000
  }
}

N’oubliez pas d’enregistrer le fichier et de quitter nano.

En utilisant var.container_name, vous indiquez à Terraform : « N’insérez pas un nom en dur ; recherchez la valeur de la variable container_name et utilisez-la. »

Définir les sorties

Lorsque vous achetez quelque chose, vous recevez un reçu. Dans Terraform, les sorties jouent un rôle similaire : elles affichent les informations importantes sur ce qui vient d’être créé.

Elles sont particulièrement utiles pour obtenir des informations que vous ne pouviez pas connaître avant la création de la ressource, comme un identifiant attribué aléatoirement par le système ou une adresse IP publique.

Les sorties sont également utiles lorsqu’une partie de l’infrastructure doit transmettre des informations à un opérateur humain, à un autre module Terraform ou à une étape d’automatisation ultérieure.

Créez un fichier nommé outputs.tf pour organiser ces valeurs renvoyées. Ouvrez-le avec nano :

nano outputs.tf

Ajoutez le bloc suivant. Il indique à Terraform : « Une fois le travail terminé, affichez l’identifiant du conteneur nginx. »

output "container_id" {
  description = "ID of the Docker container"
  value       = docker_container.nginx.id
}

Enregistrez le fichier et quittez nano.

Exécutez maintenant votre code.

Commencez par initialiser le projet, ce qui téléchargera le provider Docker :

terraform init

Appliquez ensuite la configuration. Vous ne préciserez pas de nom de conteneur ; Terraform utilisera donc la valeur par défaut (ExampleNginxContainer). L’option -auto-approve permet d’ignorer la demande de confirmation « yes » et de gagner du temps.

terraform apply -auto-approve

Observez tout en bas de la sortie. Vous devez voir Outputs:, suivi de la valeur container_id.

Remplacer la valeur d’une variable

La véritable puissance des variables réside dans la possibilité de les modifier sans réécrire le code. Supposons que vous souhaitiez lancer un second conteneur avec un nom différent. Vous n’avez pas besoin de modifier main.tf.

Vous pouvez simplement demander à Terraform de remplacer la valeur par défaut à l’aide de l’option -var. Cela revient à dire au barista : « Finalement, préparez-moi un grand café. »

Exécutez la commande suivante :

terraform apply -var="container_name=MyDynamicContainer" -auto-approve

Observez attentivement la sortie. Terraform indique : docker_container.nginx must be replaced.

Pourquoi ? Avec Docker, il n’est pas facile de renommer un conteneur en cours d’exécution. Pour modifier le nom, Terraform détermine qu’il doit détruire l’ancien conteneur (-) et en créer un nouveau (+) portant le nouveau nom. Il s’agit d’un principe essentiel de l’infrastructure immuable : nous remplaçons les éléments au lieu de les modifier par petites corrections.

Vérifiez que le nouveau conteneur est en cours d’exécution :

docker ps --format "{{.Names}}"

Vous devez voir MyDynamicContainer.

Résumé

Félicitations ! Vous avez réussi à rendre votre code Terraform dynamique.

Dans ce laboratoire, vous avez appris :

  • Variables : utiliser variables.tf pour créer des « champs de formulaire » flexibles dans votre code.
  • Référence : utiliser var.variable_name pour insérer ces valeurs dans votre configuration principale.
  • Sorties : utiliser outputs.tf pour afficher des informations importantes (le « reçu ») après une exécution.
  • Remplacements : saisir de nouvelles valeurs depuis la ligne de commande avec -var, afin de réutiliser le même code dans différentes situations.