YAML-Konfigurationsdateien mit yq bearbeiten
Lesen und ändern Sie Kubernetes- und CI-YAML direkt mit yq und bewahren Sie dabei Struktur und Kommentare.
YAML-Konfigurationsdateien mit yq bearbeiten ist eine kostenlose DevOps Bootcamp-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 DevOps Bootcamp-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der DevOps Bootcamp-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 yqunter macOSsnap install yqunter 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 --versionWerte 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.0Wichtige Lese-Befehle:
yq '.metadata.name' deployment.yaml– gibtmy-appausyq '.spec.replicas' deployment.yaml– gibt3ausyq '.spec.template.spec.containers[0].image' deployment.yaml– gibtmy-app:1.0.0aus
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.yamlDen 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.yamlFelder 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.yamlMit 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.yamlEine 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-onfü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.ymlDieses 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.ymlUmgebungsvariablen 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.yamlVerwenden 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.yamlZwei 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
-ihinzu, 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.yamlYAML 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
jqweiter:yq -o=json '.' file.yaml | jq '.metadata.name'
JSON in YAML konvertieren:
yq -P '.' file.json– das Flag-Perzwingt 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:
- Validiert das Eingabe-YAML, bevor Änderungen vorgenommen werden.
- Verwendet
env()/strenv()für alle Variablenersetzungen. - Aktualisiert das Container-Image-Tag mithilfe eines namensbasierten
select(). - Erhöht die Replikazahl.
- Verseht eine
deploy-time-Annotation mit dem aktuellen Zeitstempel. - 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
-ischreibt die Datei neu. Zeigen Sie das Ergebnis immer zuerst ohne-ian. - 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 undenv(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=jsonund-Pzur 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.
Lerne DevOps Bootcamp 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
- 142
- Lektionen
- 568
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 DevOps Bootcamp-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der DevOps Bootcamp-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 DevOps Bootcamp 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 DevOps Bootcamp zu starten?
Keine Vorkenntnisse erforderlich. DevOps Bootcamp 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 DevOps Bootcamp-Lektion Code schreiben und ausführen?
Ja. Jede DevOps Bootcamp-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
- JSON mit jq-Pipelines filtern und auswählen
- JSON-Objekte mit jq umformen und erstellen
- REST-APIs gemeinsam mit curl und jq nutzen
- YAML-Konfigurationsdateien mit yq bearbeiten