Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Eine Pipeline als Code

Nach dieser Lektion: Ich kann eine Pipeline als Stufen schreiben, die beim ersten Fehler anhalten.

Lektion, 60 Min.12 BefehleOpenTofu-Lab: Infrastructure as Code mit Plan, Apply und State auf einer VM

Die kaputte Änderung am Freitag

Jemand ändert um vier Uhr eine Datei, schiebt sie hoch und geht nach Hause. Niemand hat die Prüfungen laufen lassen, und das nächste Apply scheitert auf halbem Weg.

Eine Pipeline führt für jede Änderung dieselben Prüfungen in derselben Reihenfolge aus. Sie hält bei der ersten an, die scheitert, sodass eine schlechte Änderung nie das Apply erreicht.

Am Ende dieser Lektion

Notiz

Ich kann eine Pipeline als Stufen schreiben, die beim ersten Fehler anhalten.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
PipelineSchritte, die in fester Reihenfolge laufen
Stufeein Schritt einer Pipeline
Exitcodedie Zahl, die ein Befehl zurückgibt, wobei 0 Erfolg heißtecho $?
Schrankeeine Stufe, die die Pipeline stoppt, wenn eine Prüfung scheitert
Plan-Dateiein gespeicherter Plan, den apply genau so ausführtplan.bin

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Jeder Befehl endet mit einem Exitcode

Wenn ein Befehl endet, gibt er eine Zahl zurück, seinen Exitcode. Null heißt, es hat geklappt. Jede andere Zahl heißt, es hat nicht geklappt.

Die Shell behält den letzten in $?. Eine Pipeline liest nur Exitcodes: Eine Prüfung, die eine Zahl ungleich null zurückgibt, ist eine Prüfung, die den Lauf stoppt.

Einen Ordner für die Pipeline anlegen

Befehl
mkdir -p ~/iac-demo/pipeline && cd ~/iac-demo/pipeline

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Projekt mit einer Ressource schreiben

Befehl
printf '%s\n' 'variable "laden" {' '  type    = string' '  default = "Eckladen"' '}' '' 'resource "terraform_data" "tuer" {' '  input = format("%s: offen", var.laden)' '}' > main.tf

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Ordner vorbereiten

Befehl
tofu init -no-color | grep successfully

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Eine zweite Datei mit unordentlichen Abständen schreiben

Befehl
printf '%s\n' 'resource "terraform_data" "schild" {' '    input = "Offen"' '}' > schild.tf

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das Layout prüfen und den Exitcode lesen

Befehl
tofu fmt -check; echo "Exitcode $?"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Eine Pipeline hält beim ersten Fehler an

Ein Skript kann jede Stufe ausführen und anhalten, wenn eine scheitert. Hier führt eine kleine Funktion, stufe, einen Befehl aus und beendet sich, wenn er etwas anderes als null zurückgibt.

Die Stufen folgen der Reihenfolge, in der Sie sie von Hand ausführen würden: format, validate, plan, Schranke, apply. Eine gescheiterte Stufe verhindert, dass die späteren starten.

Die Schranke schreiben

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

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das Pipeline-Skript schreiben

Befehl
printf '%s\n' '#!/bin/bash' 'stufe() { echo "== Stufe: $1"; name=$1; shift; "$@" > /dev/null || { echo "Stufe $name gescheitert, Abbruch"; exit 1; }; }' 'schranke() { tofu show -json plan.bin | jq -e -f schranke.jq; }' 'stufe format tofu fmt -check -no-color' 'stufe validate tofu validate -no-color' 'stufe plan tofu plan -no-color -out=plan.bin' 'stufe schranke schranke' 'stufe apply tofu apply -no-color plan.bin' 'echo "Pipeline bestanden"' > ci.sh

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Es laufen lassen, schild.tf unordentlich

Befehl
bash ci.sh; echo "Pipeline-Exitcode $?"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das Layout korrigieren und erneut starten

Befehl
tofu fmt -no-color; bash ci.sh; echo "Pipeline-Exitcode $?"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele denken, eine grüne Pipeline beweise, dass die Änderung sicher ist. Sie beweist nur, dass jede geschriebene Prüfung bestanden hat. Eine Änderung kann gültig, geplant und angewendet sein und trotzdem die falsche Änderung bleiben. Die Schranke und ein Mensch, der den Plan liest, sind die Sicherheit.

Eine Schranke liest den Plan vor dem Apply

Die Stufe plan hat den Plan in plan.bin gespeichert, und die Stufe apply führt genau diese Datei aus und nichts sonst. Was die Schranke gebilligt hat, ist also das, was läuft.

tofu show -json macht aus dem Plan Daten. Der Filter der Schranke sagt nein, sobald eine Ressource gelöscht werden soll.

Eine Ressource löschen und starten

Befehl
rm schild.tf; bash ci.sh; echo "Pipeline-Exitcode $?"; tofu state list

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Eine gehostete Pipeline ist eine Datei

Bei einem Dienst, der Pipelines hostet, stehen die Stufen in einer Datei im Repository, und der Dienst führt sie auf seiner eigenen Maschine aus. Ein Job kann mit needs auf einen anderen warten.

Hier können Sie keine ausführen, weil es keinen gehosteten Runner gibt. Sie können eine schreiben und lesen.

Eine Workflow-Datei schreiben

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

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Reihenfolge und Befehle darin finden

Befehl
grep -nE "^  (pruefen|anwenden):|needs:|run:" .github/workflows/infra.yml

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Lauf in Python berechnet

Code: python
# Eine Pipeline ausführen, deren Stufen von früheren abhängen.
stufen = {"pruefen": [], "plan": ["pruefen"], "anwenden": ["plan"]}
fehlgeschlagen = {"plan"}
stand = {}
for name in ["pruefen", "plan", "anwenden"]:
    blockiert = False
    for noetig in stufen[name]:
        if stand[noetig] != "bestanden":
            blockiert = True
    if blockiert:
        stand[name] = "uebersprungen"
    elif name in fehlgeschlagen:
        stand[name] = "fehlgeschlagen"
    else:
        stand[name] = "bestanden"
    print(name, stand[name])
# Leeren Sie die Menge fehlgeschlagen und schauen Sie noch einmal.

Über dieses Lab und seinen Quellcode: OpenTofu-Lab: Infrastructure as Code mit Plan, Apply und State auf einer VM

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.