Linux Command Line & Bash Scripting Mastery · Lektion

YAML-Konfigurationsdateien mit yq bearbeiten

Lesen und ändern Sie Kubernetes- und CI-YAML direkt mit yq und bewahren Sie dabei Struktur und Kommentare.

Lektion 4 von 413 Schritte

YAML-Konfigurationsdateien mit yq bearbeiten ist eine kostenlose Linux Command Line & Bash Scripting Mastery-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Linux Command Line & Bash Scripting Mastery-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Linux Command Line & Bash Scripting Mastery-Kurs umfasst insgesamt 4 Lektionen.

Was ist yq und warum sollte man es für YAML verwenden?

yq ist ein portabler YAML-Prozessor für die Kommandozeile, ähnlich wie jq für JSON. Damit können Sie YAML-Dateien lesen, filtern und bearbeiten, ohne ein Skript in Python oder Ruby zu schreiben.

Es gibt zwei verbreitete Tools mit dem Namen yq:

  • mikefarah/yq (Go) – wird aktiv gepflegt und unterstützt YAML, JSON, XML und TOML. Diese Lektion verwendet diese Version.
  • kislyuk/yq (Python) – ein jq-Wrapper für YAML; die Syntax unterscheidet sich.

Installieren Sie die Go-Version:

  • brew install yq unter macOS
  • snap install yq unter Linux
  • Oder laden Sie die Binärdatei herunter: wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/local/bin/yq && chmod +x /usr/local/bin/yq

Überprüfen Sie die Installation: yq --version sollte v4.x.x ausgeben. Version 4 verwendet eine andere Ausdruckssyntax als Version 3, daher ist die Version wichtig.

# Install yq (Go version) on Linux
wget -q https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 \
  -O /usr/local/bin/yq
chmod +x /usr/local/bin/yq

# Confirm version
yq --version

Werte aus einer Kubernetes-Deployment-YAML-Datei auslesen

Bevor Sie etwas bearbeiten, lernen Sie, YAML-Felder zu lesen. Bei einem Kubernetes-Deployment können Sie jeden verschachtelten Wert mit Pfaden in Punktnotation extrahieren.

Beispiel für deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: production
spec:
  replicas: 3
  template:
    spec:
      containers:
        - name: app
          image: my-app:1.0.0

Wichtige Lese-Befehle:

  • yq '.metadata.name' deployment.yaml – gibt my-app aus
  • yq '.spec.replicas' deployment.yaml – gibt 3 aus
  • yq '.spec.template.spec.containers[0].image' deployment.yaml – gibt my-app:1.0.0 aus

Die Ausgabe erfolgt standardmäßig als einfacher Text (ohne Anführungszeichen). Fügen Sie das Flag -r hinzu oder verwenden Sie | yq -r, wenn Sie in Skripten rohe Zeichenfolgen benötigen.

# Create a sample deployment YAML
cat > /tmp/deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: production
spec:
  replicas: 3
  template:
    spec:
      containers:
        - name: app
          image: my-app:1.0.0
EOF

# Read individual fields
echo "App name:    $(yq '.metadata.name' /tmp/deployment.yaml)"
echo "Replicas:    $(yq '.spec.replicas' /tmp/deployment.yaml)"
echo "Image:       $(yq '.spec.template.spec.containers[0].image' /tmp/deployment.yaml)"

Bearbeiten an Ort und Stelle mit dem -i-Flag

Das wichtigste Flag für den praktischen Einsatz ist -i (in-place). Ohne dieses Flag gibt yq die Ergebnisse nach stdout aus und lässt die Datei unverändert.

Syntax:

  • Nur lesen (stdout): yq '.spec.replicas' file.yaml
  • Bearbeitung an Ort und Stelle: yq -i '.spec.replicas = 5' file.yaml

Der Zuweisungsoperator = setzt einen Wert. Der Ausdruck ist ein vollständiger yq-Filter, sodass Sie Lesen und Schreiben in einem Durchlauf kombinieren können.

Wichtig: yq -i schreibt die Datei vollständig neu. Kommentare in derselben Zeile wie ein Feld bleiben im Allgemeinen erhalten, eigenständige Kommentarblöcke können jedoch verschoben werden. Übertragen Sie Ihre YAML-Datei immer in die Versionsverwaltung, bevor Sie umfangreiche Bearbeitungen an Ort und Stelle durchführen.

Testen Sie zunächst ohne -i und fügen Sie es erst hinzu, wenn Sie mit der Ausgabe zufrieden sind.

# Start with the deployment from the previous scene
echo 'Before:' && yq '.spec.replicas' /tmp/deployment.yaml

# Edit in place: scale to 5 replicas
yq -i '.spec.replicas = 5' /tmp/deployment.yaml

echo 'After:' && yq '.spec.replicas' /tmp/deployment.yaml

Den Container-Image-Tag aktualisieren

Eine sehr häufige CI-Aufgabe besteht darin, den Docker-Image-Tag zu erhöhen, nachdem ein neues Image erstellt wurde. Mit yq wird daraus ein Einzeiler.

Das Muster:

  • Identifizieren Sie den Container anhand seines Namens mit select(), um eine fest codierte Array-Position 0 zu vermeiden.
  • Verwenden Sie |= (Update-Operator) oder =, um den neuen Wert zu setzen.

Mit Array-Index (anfällig, wenn sich die Containerliste ändert):

  • yq -i '.spec.template.spec.containers[0].image = "my-app:2.1.0"' deployment.yaml

Mit select() (robust):

  • yq -i '(.spec.template.spec.containers[] | select(.name == "app")).image = "my-app:2.1.0"' deployment.yaml

In einer CI-Pipeline würden Sie den Tag als Shell-Variable übergeben:

NEW_TAG="my-app:2.1.0"
CONTAINER_NAME="app"

# Robust update: target by container name, not index
yq -i \
  "(.spec.template.spec.containers[] | select(.name == \"${CONTAINER_NAME}\")).image = \"${NEW_TAG}\"" \
  /tmp/deployment.yaml

# Verify
yq '.spec.template.spec.containers[0].image' /tmp/deployment.yaml

Felder hinzufügen und entfernen

Über das Aktualisieren vorhandener Felder hinaus kann yq neue Schlüssel hinzufügen oder vorhandene löschen.

Ein Feld hinzufügen:

  • Weisen Sie einfach einem nicht vorhandenen Pfad einen Wert zu: yq -i '.metadata.labels.version = "v2"' file.yaml
  • Wenn der übergeordnete Schlüssel (labels) fehlt, erstellt yq ihn automatisch.

Ein Feld löschen:

  • Verwenden Sie die Funktion del(): yq -i 'del(.metadata.annotations)' file.yaml
  • Löschen Sie ein Array-Element anhand seines Index: yq -i 'del(.spec.template.spec.containers[1])' file.yaml

Ein Element zu einem Array hinzufügen:

  • yq -i '.spec.template.spec.containers += [{"name": "sidecar", "image": "envoy:latest"}]' file.yaml
# Add a label to the deployment
yq -i '.metadata.labels.version = "v2"' /tmp/deployment.yaml
yq -i '.metadata.labels.managed-by = "ci-pipeline"' /tmp/deployment.yaml

echo '--- Labels after adding ---'
yq '.metadata.labels' /tmp/deployment.yaml

# Delete one label
yq -i 'del(.metadata.labels.managed-by)' /tmp/deployment.yaml

echo '--- Labels after delete ---'
yq '.metadata.labels' /tmp/deployment.yaml

Mit YAML-Dateien mit mehreren Dokumenten arbeiten

Kubernetes-Manifeste enthalten häufig mehrere durch --- getrennte Ressourcen in einer einzigen Datei. Standardmäßig verarbeitet yq alle Dokumente in einer solchen Datei.

Wichtige Techniken:

  • Alle Dokumenttypen auflisten: yq '.[].kind' multi.yaml – beachten Sie das vorangestellte .[], um die Dokumente zu durchlaufen.
  • Ein bestimmtes Dokument nach Typ auswählen: yq 'select(.kind == "Service")' multi.yaml
  • Nur passende Dokumente an Ort und Stelle bearbeiten:

yq -i 'select(.kind == "Deployment").spec.replicas = 2' multi.yaml

Dokumente, die das select()-Prädikat nicht erfüllen, werden unverändert durchgereicht. Dadurch bleiben Ihr Service, Ihre ConfigMap und andere Ressourcen intakt.

Um eine Datei mit mehreren Dokumenten in einzelne Dateien aufzuteilen, können Sie die yq-Ausgabe in einer Schleife verarbeiten oder Folgendes verwenden:

  • yq -s '.kind' multi.yaml – schreibt für jedes Dokument eine Datei, benannt nach ihrem .kind-Wert.
cat > /tmp/multi.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 1
---
apiVersion: v1
kind: Service
metadata:
  name: web-svc
spec:
  port: 80
EOF

# Scale ONLY the Deployment, leave Service untouched
yq -i 'select(.kind == "Deployment").spec.replicas = 4' /tmp/multi.yaml

echo '--- Deployment replicas ---'
yq 'select(.kind == "Deployment").spec.replicas' /tmp/multi.yaml

echo '--- Service port (unchanged) ---'
yq 'select(.kind == "Service").spec.port' /tmp/multi.yaml

Eine GitHub-Actions-CI-YAML-Datei patchen

CI-Konfigurationsdateien (.github/workflows/*.yml, .gitlab-ci.yml) sind ebenfalls YAML-Dateien. Dieselben yq-Befehle funktionieren auch hier, obwohl die Pfade tief verschachtelt sein können.

Häufige CI-Patching-Aufgaben:

  • Eine Runner-Version festlegen: Aktualisieren Sie runs-on für alle Jobs.
  • Eine Action-Version aktualisieren: Suchen Sie nach Schritten, die eine bestimmte Action verwenden, und erhöhen Sie deren Feld uses.
  • Ein Flag umschalten: Aktivieren oder deaktivieren Sie eine Einstellung auf Workflow-Ebene.

Beispiel: Alle Schritte, die actions/checkout verwenden, auf v4 aktualisieren:

yq -i '(.jobs[].steps[] | select(.uses == "actions/checkout@v3")).uses = "actions/checkout@v4"' .github/workflows/ci.yml

Dieses Idiom – mit [] iterieren, mit select() eingrenzen, mit = zuweisen – ist das zentrale Muster für jede strukturierte YAML-Bearbeitung.

cat > /tmp/ci.yml << 'EOF'
name: CI
on: [push]
jobs:
  build:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
      - run: npm test
  lint:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v3
      - run: npm run lint
EOF

# Bump all checkout steps from v3 → v4
yq -i '(.jobs[].steps[] | select(.uses == "actions/checkout@v3")).uses = "actions/checkout@v4"' \
  /tmp/ci.yml

# Verify both jobs were updated
yq '.jobs[].steps[] | select(.uses | test("checkout")).uses' /tmp/ci.yml

Umgebungsvariablen in yq-Ausdrücken verwenden

Fest codierte Werte in yq-Ausdrücken machen Skripte fehleranfällig. yq unterstützt das Einfügen von Shell-Variablen mit der Funktion env() oder der Kurzform strenv().

  • env(VAR_NAME) – liest die Umgebungsvariable und wandelt sie in den passenden YAML-Typ um (eine Zahl bleibt eine Zahl, eine Zeichenfolge bleibt eine Zeichenfolge).
  • strenv(VAR_NAME) – gibt immer eine Zeichenfolge zurück und eignet sich daher für Image-Tags.

Damit vermeiden Sie das Anführungszeichen-Chaos, das beim Einfügen von Variablen in doppelt quotierte Shell-Zeichenfolgen mit eingebetteten YAML-Pfaden entsteht.

Muster:

export IMAGE_TAG="my-app:3.0.0"
yq -i '.spec.template.spec.containers[0].image = strenv(IMAGE_TAG)' deployment.yaml

Verwenden Sie env() beim Setzen numerischer Felder wie replicas, damit der YAML-Typ erhalten bleibt (Ganzzahl statt quotierter Zeichenfolge).

export APP_IMAGE="my-app:3.0.0"
export REPLICA_COUNT=6

# Set image using strenv() — result is a YAML string
yq -i '.spec.template.spec.containers[0].image = strenv(APP_IMAGE)' \
  /tmp/deployment.yaml

# Set replicas using env() — result is a YAML integer
yq -i '.spec.replicas = env(REPLICA_COUNT)' \
  /tmp/deployment.yaml

# Confirm types are correct in the output
yq '.spec.replicas, .spec.template.spec.containers[0].image' /tmp/deployment.yaml

Zwei YAML-Dateien zusammenführen

Manchmal müssen Sie eine Patch-Datei (eine kleine überschreibende YAML-Datei) auf eine Basiskonfiguration anwenden – beispielsweise um umgebungsspezifische Überschreibungen in Kustomize-ähnlichen Workflows umzusetzen.

Mit yq können Sie zwei Dateien mithilfe des *-Merge-Operators zusammenführen:

  • yq '. *= load("patch.yaml")' base.yaml – führt den Patch rekursiv mit der Basis zusammen und schreibt das Ergebnis nach stdout.
  • Fügen Sie -i hinzu, um die Basisdatei direkt zu aktualisieren: yq -i '. *= load("patch.yaml")' base.yaml

Verhalten beim Zusammenführen:

  • Skalare Werte im Patch überschreiben die Basiswerte.
  • Mappings werden rekursiv zusammengeführt (Schlüssel, die im Patch nicht vorkommen, bleiben erhalten).
  • Sequenzen (Arrays) werden standardmäßig ersetzt, nicht angehängt. Verwenden Sie stattdessen *+, um sie anzuhängen.

Dieses Muster ersetzt fehleranfällige sed-Skripte, die bei Änderungen an Leerzeichen nicht mehr funktionieren.

cat > /tmp/base.yaml << 'EOF'
app:
  name: my-service
  port: 8080
  debug: false
database:
  host: localhost
  port: 5432
EOF

cat > /tmp/patch.yaml << 'EOF'
app:
  port: 9090
  debug: true
database:
  host: db.production.svc
EOF

# Deep-merge patch into base (stdout preview first)
yq '. *= load("/tmp/patch.yaml")' /tmp/base.yaml

# Apply in place
yq -i '. *= load("/tmp/patch.yaml")' /tmp/base.yaml

YAML validieren und in JSON konvertieren

Bevor Sie gepatchtes YAML auf einen Cluster anwenden, sollten Sie es validieren und es optional für andere Tools in JSON konvertieren.

Syntax validieren:

  • yq '.' file.yaml && echo "Valid" – yq wird bei Parse-Fehlern mit Code 1 beendet, sodass sich dies für CI-Prüfungen eignet.

YAML in JSON konvertieren:

  • yq -o=json '.' file.yaml – gibt formatiertes JSON aus.
  • Leiten Sie die Ausgabe für die weitere JSON-Verarbeitung an jq weiter: yq -o=json '.' file.yaml | jq '.metadata.name'

JSON in YAML konvertieren:

  • yq -P '.' file.json – das Flag -P erzwingt eine Ausgabe im YAML-Format (prettyprint), wenn die Eingabe JSON ist.

Diese Konvertierungen machen yq zu einer Brücke zwischen YAML-nativen Tools (Helm, kubectl) und JSON-nativen Tools (Terraform, AWS CLI, jq).

# Validate YAML (exits 0 on success, 1 on parse error)
if yq '.' /tmp/deployment.yaml > /dev/null 2>&1; then
  echo "YAML is valid"
else
  echo "YAML parse error!" >&2
  exit 1
fi

# Convert to JSON and query with jq
yq -o=json '.' /tmp/deployment.yaml \
  | jq '{name: .metadata.name, image: .spec.template.spec.containers[0].image}'

# Round-trip: JSON snippet back to YAML
echo '{"replicas": 7, "strategy": "RollingUpdate"}' \
  | yq -P '.'

Ein vollständiges CI-Skript zum Patchen eines Deployments

Hier werden alle Techniken zu einem praxisnahen CI-Skript kombiniert, das im Rahmen einer GitOps-Pipeline ein Kubernetes-Deployment-Manifest patcht.

Das Skript:

  1. Validiert das Eingabe-YAML, bevor Änderungen vorgenommen werden.
  2. Verwendet env() / strenv() für alle Variablenersetzungen.
  3. Aktualisiert das Container-Image-Tag mithilfe eines namensbasierten select().
  4. Erhöht die Replikazahl.
  5. Verseht eine deploy-time-Annotation mit dem aktuellen Zeitstempel.
  6. Validiert die Ausgabe erneut, bevor sie committed wird.

Dieses Muster stellt sicher, dass jeder Schritt auch bei gleichzeitig ausgeführten Pipelines atomar und nachvollziehbar bleibt.

#!/usr/bin/env bash
set -euo pipefail

MANIFEST="/tmp/deployment.yaml"
export NEW_IMAGE="my-app:$(date +%Y%m%d)-abc1234"
export NEW_REPLICAS=3
export DEPLOY_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
export CONTAINER="app"

# 1. Validate before patching
yq '.' "$MANIFEST" > /dev/null

# 2. Update image (by container name)
yq -i \
  '(.spec.template.spec.containers[] | select(.name == strenv(CONTAINER))).image = strenv(NEW_IMAGE)' \
  "$MANIFEST"

# 3. Set replicas
yq -i '.spec.replicas = env(NEW_REPLICAS)' "$MANIFEST"

# 4. Stamp annotation
yq -i '.metadata.annotations."deploy-time" = strenv(DEPLOY_TIME)' "$MANIFEST"

# 5. Validate result
yq '.' "$MANIFEST" > /dev/null && echo "Patch applied successfully"

# 6. Show diff summary
yq '{image: .spec.template.spec.containers[0].image, replicas: .spec.replicas}' "$MANIFEST"

Wissenscheck: Sicheres Bearbeiten mehrerer Dokumente

Testen Sie Ihr Verständnis beim Bearbeiten von Kubernetes-YAML-Dateien mit mehreren Dokumenten und yq.

Zusammenfassung der Lektion: YAML mit yq bearbeiten

Sie haben die Lektion zum Bearbeiten von YAML-Konfigurationsdateien mit yq abgeschlossen. Hier ist eine kurze Zusammenfassung aller behandelten Themen:

  • Installation: Verwenden Sie das mikefarah/yq-Go-Binary (v4). Überprüfen Sie die Installation mit yq --version.
  • Lesen: Pfade in Punktnotation wie .spec.replicas; Array-Zugriff mit [0] oder Iteration mit [].
  • Bearbeiten an Ort und Stelle: Das Flag -i schreibt die Datei neu. Zeigen Sie das Ergebnis immer zuerst ohne -i an.
  • Robuste Zielauswahl: Bevorzugen Sie select(.name == "app") gegenüber fest codierten Array-Indizes.
  • Hinzufügen / Löschen: Weisen Sie einem neuen Pfad einen Wert zu, um ihn zu erstellen; verwenden Sie del(), um Felder zu entfernen.
  • Dateien mit mehreren Dokumenten: Verwenden Sie select(.kind == "..."), um eine Ressource anzusprechen und die übrigen unverändert zu lassen.
  • CI-Variablen: Verwenden Sie strenv(VAR) für Zeichenketten und env(VAR) für typisierte Werte – so vermeiden Sie Quoting-Fehler in der Shell.
  • Zusammenführen: . *= load("patch.yaml") führt eine Überschreibungsdatei rekursiv zusammen, ohne nicht gepatchte Schlüssel zu verlieren.
  • Validierung & Konvertierung: yq '.' als Lint-Prüfung; -o=json und -P zur Formatkonvertierung.

Das grundlegende Muster für jeden YAML-Patch in CI lautet: validieren → auswählen → zuweisen → validieren. Kombinieren Sie dies mit strenv() und select(), und Sie müssen nie wieder auf fehleranfällige sed-Einzeiler zurückgreifen.

Kostenlos starten

Lerne Bash mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
22
Lektionen
88

Häufig gestellte Fragen

Ist die Lektion „YAML-Konfigurationsdateien mit yq bearbeiten“ kostenlos?

Ja — der vollständige Text von „YAML-Konfigurationsdateien mit yq bearbeiten“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Linux Command Line & Bash Scripting Mastery-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Linux Command Line & Bash Scripting Mastery-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „YAML-Konfigurationsdateien mit yq bearbeiten“?

Lesen und ändern Sie Kubernetes- und CI-YAML direkt mit yq und bewahren Sie dabei Struktur und Kommentare. Du übst Linux Command Line & Bash Scripting Mastery mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Linux Command Line & Bash Scripting Mastery zu starten?

Keine Vorkenntnisse erforderlich. Linux Command Line & Bash Scripting Mastery auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „YAML-Konfigurationsdateien mit yq bearbeiten“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Linux Command Line & Bash Scripting Mastery-Lektion Code schreiben und ausführen?

Ja. Jede Linux Command Line & Bash Scripting Mastery-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. JSON mit jq-Pipelines filtern und auswählen
  2. JSON-Objekte mit jq umformen und erstellen
  3. REST-APIs gemeinsam mit curl und jq nutzen
  4. YAML-Konfigurationsdateien mit yq bearbeiten
← Zurück zu Linux Command Line & Bash Scripting Mastery