Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Variables, count et for_each avec OpenTofu

Après cette leçon: Je peux fabriquer plusieurs ressources à partir d’une variable avec count ou foreach.

Leçon de 55 min8 commandesLab OpenTofu : l’infrastructure en code, avec plan, apply et état, dans une VM

Quarante adhérents, un seul bloc

Une variable OpenTofu est une valeur que l’on choisit au moment du plan, et count et for_each fabriquent plusieurs ressources à partir d’une seule description. Sans eux, un club de quarante adhérents demande quarante blocs copiés.

Avec eux, le fichier ne change pas quand le nombre change. Il reste à savoir lequel choisir : le mauvais décale tout ce qui suit.

À la fin de cette leçon

Remarque

Je peux fabriquer plusieurs ressources à partir d’une variable avec count ou for_each.

Mots-clés

MotCe que ça veut direExemple
Variableune valeur d’entrée, avec un type et une valeur par défautvar.noms
Sortieune valeur que le projet affiche à la finoutput
countfait n copies d’une ressource, numérotées à partir de 0count.index
for_eachfait une copie par clé, nommée par cette cléeach.key
Adressele nom complet d’une copie dans l’étatterraform_data.badge["lea"]
Liste et ensembleune liste a un ordre et des doublons, un ensemble n’en a pastoset(...)

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Une variable évite de toucher au code

Un bloc variable a un nom, un type et une valeur par défaut. On la lit avec var.noms. Sans rien dire, le plan prend la valeur par défaut. Avec -var, il prend la vôtre.

Le type compte. list(string) est une liste de textes, dans l’ordre, doublons permis. Le fichier ci-dessous en fait des numéros avec count, et des badges avec for_each.

Une liste de noms, deux usages

Code: bash
variable "noms" {
  type    = list(string)
  default = ["lea", "marc", "zoe"]
}

resource "terraform_data" "numero" {
  count = length(var.noms)
  input = var.noms[count.index]
}

resource "terraform_data" "badge" {
  for_each = toset(var.noms)
  input    = format("badge-%s", each.key)
}

output "badges" {
  value = sort(keys(terraform_data.badge))
}

Créer le dossier du projet

Commande
mkdir -p ~/atelier-iac/parc

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Aller dans ce dossier

Commande
cd ~/atelier-iac/parc

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Écrire main.tf

Commande
printf 'variable "noms" {\n  type    = list(string)\n  default = ["lea", "marc", "zoe"]\n}\n\nresource "terraform_data" "numero" {\n  count = length(var.noms)\n  input = var.noms[count.index]\n}\n\nresource "terraform_data" "badge" {\n  for_each = toset(var.noms)\n  input    = format("badge-%%s", each.key)\n}\n\noutput "badges" {\n  value = sort(keys(terraform_data.badge))\n}\n' > main.tf

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Préparer le dossier

Commande
tofu init -no-color | grep successfully

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Chaque copie a une adresse

Avec count, les copies sont numérotées à partir de 0 : numero[0], numero[1]. Le nombre peut venir d’un chiffre, ou de length d’une liste.

Avec for_each, chaque copie porte sa clé : badge["lea"]. for_each demande un ensemble ou un dictionnaire, d’où toset. Le plan nomme chaque copie par son adresse.

Lire le plan de création

Commande
tofu plan -no-color | grep -E "^Plan|will be"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Exemple travaillé : les six copies créées

AdresseFabriquée parValeur de input
numero[0]count, indice 0lea
numero[1]count, indice 1marc
numero[2]count, indice 2zoe
badge["lea"]for_each, clé leabadge-lea
badge["marc"]for_each, clé marcbadge-marc
badge["zoe"]for_each, clé zoebadge-zoe

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Appliquer le plan

Commande
tofu apply -auto-approve -no-color | grep ^Apply

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Retirer un nom ne coûte pas pareil

Retirons lea de la liste. Avec count, les noms se décalent : numero[0] devient marc, numero[1] devient zoe, et la dernière copie disparaît.

Avec for_each, chaque copie garde sa clé. Seul badge["lea"] disparaît. Le plan ci-dessous le montre ligne à ligne.

Planifier sans lea

Commande
tofu plan -no-color -var 'noms=["marc","zoe"]' | grep -E "^Plan|will be"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Exemple travaillé : le plan sans lea

AdresseAvantAprèsLe plan fait
numero[0]leamarcchangement sur place
numero[1]marczoechangement sur place
numero[2]zoeriendestruction
badge["lea"]badge-leariendestruction
badge["marc"], badge["zoe"]inchangésinchangésrien

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Erreur fréquente

Attention

Beaucoup de gens pensent que count et for_each se valent, puisque les deux font plusieurs copies. Avec count, une copie est reconnue par son rang : retirer un élément du début change toutes les suivantes. Prenez for_each dès que les copies ont un nom propre.

Planifier avec un nom de plus

Commande
tofu plan -no-color -var 'noms=["lea","marc","zoe","ana"]' | grep -E "^Plan|will be"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Pour aller plus loin

Ajoutez une variable etage, de type nombre, avec la valeur par défaut 2, puis faites-en l’input d’une ressource terraform_data nommée salle. Lancez le plan avec -var etage=3.

Quel symbole le plan met-il devant la ressource, et pourquoi n’y a-t-il ni ajout ni destruction ?

À propos de ce labo et de sa source: Lab OpenTofu : l’infrastructure en code, avec plan, apply et état, dans une VM

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.