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

Un pipeline écrit en code

Après cette leçon: Je peux écrire un pipeline en étapes qui s’arrête au premier échec.

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

Le changement cassé du vendredi

Quelqu’un modifie un fichier à seize heures, le pousse et rentre chez lui. Personne n’a lancé les vérifications, et l’apply suivant échoue à mi-chemin.

Un pipeline lance les mêmes vérifications, dans le même ordre, pour chaque changement. Il s’arrête à la première qui échoue : un mauvais changement n’atteint jamais l’apply.

À la fin de cette leçon

Remarque

Je peux écrire un pipeline en étapes qui s’arrête au premier échec.

Mots-clés

MotCe que ça veut direExemple
Pipelinedes étapes qui s’exécutent dans un ordre fixe
Étapeun pas du pipeline
Code de sortiele nombre qu’une commande renvoie, où 0 veut dire réussiecho $?
Barrièreune étape qui arrête le pipeline quand une vérification échoue
Fichier de planun plan enregistré que l’apply suit à la lettreplan.bin

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

Toute commande finit par un code de sortie

Quand une commande se termine, elle renvoie un nombre, son code de sortie. Zéro veut dire que tout s’est bien passé. Tout autre nombre veut dire que non.

Le shell garde le dernier dans $?. Un pipeline ne lit que les codes de sortie : une vérification qui renvoie un nombre non nul est une vérification qui arrête l’exécution.

Créer un dossier pour le pipeline

Commande
mkdir -p ~/atelier-iac/pipeline && cd ~/atelier-iac/pipeline

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 un projet avec une ressource

Commande
printf '%s\n' 'variable "boutique" {' '  type    = string' '  default = "Boutique du coin"' '}' '' 'resource "terraform_data" "porte" {' '  input = format("%s : ouvert", var.boutique)' '}' > 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.

Écrire un second fichier mal espacé

Commande
printf '%s\n' 'resource "terraform_data" "enseigne" {' '    input = "Ouvert"' '}' > enseigne.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.

Vérifier la mise en forme

Commande
tofu fmt -check; echo "code de sortie $?"

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.

Un pipeline s’arrête au premier échec

Un script peut lancer chaque étape et s’arrêter quand l’une échoue. Ici une petite fonction, etape, lance une commande et quitte si elle renvoie autre chose que zéro.

Les étapes suivent l’ordre où vous les lanceriez à la main : format, validate, plan, barrière, apply. Une étape en échec empêche les suivantes de démarrer.

Écrire la barrière

Commande
printf '%s\n' '[.resource_changes[].change.actions[]] | index("delete") | not' > barriere.jq

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 le script du pipeline

Commande
printf '%s\n' '#!/bin/bash' 'etape() { echo "== etape : $1"; nom=$1; shift; "$@" > /dev/null || { echo "etape $nom en echec, arret"; exit 1; }; }' 'barriere() { tofu show -json plan.bin | jq -e -f barriere.jq; }' 'etape format tofu fmt -check -no-color' 'etape validate tofu validate -no-color' 'etape plan tofu plan -no-color -out=plan.bin' 'etape barriere barriere' 'etape apply tofu apply -no-color plan.bin' 'echo "pipeline reussi"' > ci.sh

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.

Le lancer, enseigne.tf mal espacé

Commande
bash ci.sh; echo "sortie du pipeline $?"

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.

Corriger la mise en forme et relancer

Commande
tofu fmt -no-color; bash ci.sh; echo "sortie du pipeline $?"

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.

Erreur fréquente

Attention

Beaucoup pensent qu’un pipeline vert prouve que le changement est sans danger. Il prouve seulement que chaque vérification écrite a réussi. Un changement peut être valide, planifié, appliqué, et rester le mauvais changement. La barrière et une personne qui lit le plan sont la vraie sécurité.

Une barrière lit le plan avant l’apply

L’étape plan a enregistré le plan dans plan.bin, et l’étape apply exécute ce fichier et rien d’autre. Ce que la barrière a approuvé est donc ce qui s’exécute.

tofu show -json transforme le plan en données. Le filtre de la barrière dit non dès qu’une ressource va être supprimée.

Supprimer une ressource et relancer

Commande
rm enseigne.tf; bash ci.sh; echo "sortie du pipeline $?"; tofu state list

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.

Un pipeline hébergé est un fichier

Sur un service qui héberge des pipelines, les étapes sont écrites dans un fichier du dépôt, et le service les lance sur sa propre machine. Un job peut dire needs pour en attendre un autre.

Vous ne pouvez pas en lancer un ici, faute de runner hébergé. Vous pouvez en écrire un et le lire.

Écrire un fichier de workflow

Commande
mkdir -p .github/workflows && printf '%s\n' 'name: infra' 'on:' '  pull_request:' '  push:' '    branches: [main]' 'jobs:' '  verification:' '    runs-on: ubuntu-latest' '    steps:' '      - uses: actions/checkout@v4' '      - run: tofu fmt -check' '      - run: tofu validate' '      - run: tofu plan -out=plan.bin' '  application:' '    needs: verification' "    if: github.ref == 'refs/heads/main'" '    runs-on: ubuntu-latest' '    steps:' '      - run: tofu apply plan.bin' > .github/workflows/infra.yml

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.

Y retrouver l’ordre et les commandes

Commande
grep -nE "^  (verification|application):|needs:|run:" .github/workflows/infra.yml

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.

Une exécution calculée en Python

Code: python
# Lancer un pipeline dont chaque étape dépend d'étapes précédentes.
taches = {"verifier": [], "plan": ["verifier"], "appliquer": ["plan"]}
en_echec = {"plan"}
etat = {}
for nom in ["verifier", "plan", "appliquer"]:
    bloquee = False
    for besoin in taches[nom]:
        if etat[besoin] != "reussie":
            bloquee = True
    if bloquee:
        etat[nom] = "ignoree"
    elif nom in en_echec:
        etat[nom] = "echouee"
    else:
        etat[nom] = "reussie"
    print(nom, etat[nom])
# Videz l'ensemble en_echec et regardez de nouveau.

À 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.