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
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Variable | une valeur d’entrée, avec un type et une valeur par défaut | var.noms |
| Sortie | une valeur que le projet affiche à la fin | output |
| count | fait n copies d’une ressource, numérotées à partir de 0 | count.index |
| for_each | fait une copie par clé, nommée par cette clé | each.key |
| Adresse | le nom complet d’une copie dans l’état | terraform_data.badge["lea"] |
| Liste et ensemble | une liste a un ordre et des doublons, un ensemble n’en a pas | toset(...) |
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
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
mkdir -p ~/atelier-iac/parcAffiché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
cd ~/atelier-iac/parcAffiché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
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.tfAffiché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
tofu init -no-color | grep successfullyAffiché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
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
| Adresse | Fabriquée par | Valeur de input |
|---|---|---|
| numero[0] | count, indice 0 | lea |
| numero[1] | count, indice 1 | marc |
| numero[2] | count, indice 2 | zoe |
| badge["lea"] | for_each, clé lea | badge-lea |
| badge["marc"] | for_each, clé marc | badge-marc |
| badge["zoe"] | for_each, clé zoe | badge-zoe |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Appliquer le plan
tofu apply -auto-approve -no-color | grep ^ApplyAffiché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
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
| Adresse | Avant | Après | Le plan fait |
|---|---|---|---|
| numero[0] | lea | marc | changement sur place |
| numero[1] | marc | zoe | changement sur place |
| numero[2] | zoe | rien | destruction |
| badge["lea"] | badge-lea | rien | destruction |
| badge["marc"], badge["zoe"] | inchangés | inchangés | rien |
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
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 ?