Redigering af YAML-konfigurationsfiler med yq
Læs og opdatér Kubernetes- og CI-YAML-filer direkte med yq, samtidig med at struktur og kommentarer bevares.
Redigering af YAML-konfigurationsfiler med yq er en gratis Linux-kommandolinjen og Bash-scripting på ekspertniveau-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Linux-kommandolinjen og Bash-scripting på ekspertniveau, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Linux-kommandolinjen og Bash-scripting på ekspertniveau-kurset indeholder 4 lektioner i alt.
Hvad er yq, og hvorfor bruge det til YAML?
yq er en portabel YAML-processor til kommandolinjen, på samme måde som jq håndterer JSON. Den lader dig læse, filtrere og redigere YAML-filer uden at skrive et script i Python eller Ruby.
Der findes to populære værktøjer med navnet yq:
- mikefarah/yq (Go) — vedligeholdes aktivt og understøtter YAML, JSON, XML og TOML. Denne lektion bruger denne version.
- kislyuk/yq (Python) — en
jq-wrapper til YAML; syntaksen er anderledes.
Installér Go-versionen:
brew install yqpå macOSsnap install yqpå Linux- Eller download binærfilen:
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/local/bin/yq && chmod +x /usr/local/bin/yq
Kontrollér installationen: yq --version bør udskrive v4.x.x. Version 4 bruger en anden udtrykssyntaks end v3, så versionen er vigtig.
# 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 --versionLæsning af værdier fra en Kubernetes-Deployment-YAML
Før du redigerer noget, skal du lære at læse YAML-felter. Med en Kubernetes-Deployment kan du udtrække enhver indlejret værdi ved hjælp af stiadressering med punktnotation.
Eksempel på 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.0Vigtige læsekommandoer:
yq '.metadata.name' deployment.yaml— udskrivermy-appyq '.spec.replicas' deployment.yaml— udskriver3yq '.spec.template.spec.containers[0].image' deployment.yaml— udskrivermy-app:1.0.0
Outputtet er som standard almindelig tekst (uden anførselstegn). Tilføj flaget -r, eller brug | yq -r, hvis du har brug for rå strenge i scripts.
# 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)"Redigering på stedet med flaget -i
Det vigtigste flag til praktisk brug er -i (på stedet). Uden det udskriver yq resultaterne til stdout og lader filen være uændret.
Syntaks:
- Læsning alene (stdout):
yq '.spec.replicas' file.yaml - Redigering på stedet:
yq -i '.spec.replicas = 5' file.yaml
Tildelingsoperatoren = angiver en værdi. Udtrykket er et komplet yq-filter, så du kan kombinere læsning og skrivning i én gennemkørsel.
Vigtigt: yq -i omskriver hele filen. Kommentarer på samme linje som et felt bevares normalt, men selvstændige kommentarblokke kan blive flyttet. Commit altid din YAML til versionsstyring, før du kører massevise redigeringer på stedet.
Test først uden -i, og tilføj det derefter, når du er tilfreds med outputtet.
# 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.yamlOpdatering af containerens imagetag
En meget almindelig CI-opgave er at opdatere Docker-imagetagget i et Kubernetes-manifest, efter at et nyt image er blevet bygget. Med yq bliver det til én linje.
Mønsteret er:
- Find containeren efter navn ved hjælp af
select(), så du undgår at hardkode array-indeks 0. - Brug
|=(opdateringsoperatoren) eller=til at angive den nye værdi.
Brug af array-indeks (skrøbeligt, hvis containerlisten ændres):
yq -i '.spec.template.spec.containers[0].image = "my-app:2.1.0"' deployment.yaml
Brug af select() (robust):
yq -i '(.spec.template.spec.containers[] | select(.name == "app")).image = "my-app:2.1.0"' deployment.yaml
I en CI-pipeline ville du sende tagget som en shell-variabel:
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.yamlTilføjelse og fjernelse af felter
Ud over at opdatere eksisterende felter kan yq tilføje nye nøgler eller slette eksisterende.
Tilføjelse af et felt:
- Tildel blot en værdi til en sti, der ikke findes:
yq -i '.metadata.labels.version = "v2"' file.yaml - Hvis den overordnede nøgle (
labels) mangler, opretter yq den automatisk.
Sletning af et felt:
- Brug funktionen
del():yq -i 'del(.metadata.annotations)' file.yaml - Slet et array-element efter indeks:
yq -i 'del(.spec.template.spec.containers[1])' file.yaml
Tilføjelse af et element til et array:
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.yamlArbejde med YAML-filer med flere dokumenter
Kubernetes-manifester samler ofte flere ressourcer i én fil, adskilt af ---. Som standard behandler yq alle dokumenter i sådan en fil.
Vigtige teknikker:
- Vis alle dokumenttyper:
yq '.[].kind' multi.yaml— bemærk det indledende.[], der gennemløber dokumenterne. - Vælg et bestemt dokument efter type:
yq 'select(.kind == "Service")' multi.yaml - Redigér kun matchende dokumenter på stedet:
yq -i 'select(.kind == "Deployment").spec.replicas = 2' multi.yaml
Dokumenter, der ikke matcher prædikatet i select(), sendes uændret videre, så din Service, ConfigMap og andre ressourcer forbliver intakte.
Hvis du vil opdele en fil med flere dokumenter i individuelle filer, kan du gennemløbe yq-outputtet eller bruge:
yq -s '.kind' multi.yaml— skriver én fil pr. dokument med navn efter dokumentets.kind-værdi.
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.yamlRettelse af en GitHub Actions-CI-YAML
CI-konfigurationsfiler (.github/workflows/*.yml, .gitlab-ci.yml) er også YAML. De samme yq-kommandoer virker, selvom stierne kan være dybt indlejrede.
Almindelige CI-rettelser:
- Fastlås en runner-version: opdatér
runs-onpå tværs af alle jobs. - Opdatér en action-version: find trin, der bruger en bestemt action, og opdatér feltet
uses. - Slå et flag til eller fra: aktivér eller deaktivér en indstilling på workflow-niveau.
Eksempel: opdatér alle trin, der bruger actions/checkout, til v4:
yq -i '(.jobs[].steps[] | select(.uses == "actions/checkout@v3")).uses = "actions/checkout@v4"' .github/workflows/ci.ymlDette idiom — gennemløb med [], indsnævr med select(), tildel med = — er grundmønstret for enhver struktureret YAML-redigering.
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.ymlBrug af miljøvariabler i yq-udtryk
Hardkodning af værdier i yq-udtryk gør scripts skrøbelige. yq understøtter indsættelse af shell-variabler ved hjælp af env()-funktionen eller forkortelsen strenv().
env(VAR_NAME)— læser miljøvariablen og konverterer den til den passende YAML-type (et tal forbliver et tal, og en streng forbliver en streng).strenv(VAR_NAME)— returnerer altid en streng og er nyttig til imagetags.
Det undgår citeringsmareridtet ved interpolation af variabler i shell-strenge med dobbelte anførselstegn og indlejrede YAML-stier.
Mønster:
export IMAGE_TAG="my-app:3.0.0"
yq -i '.spec.template.spec.containers[0].image = strenv(IMAGE_TAG)' deployment.yamlBrug env() ved angivelse af numeriske felter som replicas, så YAML-typen bevares (heltal i stedet for en citeret streng).
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.yamlSammenfletning af to YAML-filer
Nogle gange skal du anvende en patchfil (en lille YAML-fil med tilsidesættelser) på en grundkonfiguration — f.eks. miljøspecifikke tilsidesættelser i arbejdsforløb i stil med Kustomize.
yq kan sammenflette to filer ved hjælp af *-operatoren til sammenfletning:
yq '. *= load("patch.yaml")' base.yaml— sammenfletter patchen rekursivt ind i grundkonfigurationen og skriver resultatet til standardoutput.- Tilføj
-ifor at opdatere grundkonfigurationen direkte:yq -i '. *= load("patch.yaml")' base.yaml
Sådan fungerer sammenfletningen:
- Skalære værdier i patchen overskriver grundkonfigurationen.
- Kortlægninger sammenflettes rekursivt (nøgler, der ikke findes i patchen, bevares).
- Sekvenser (tabeller) erstattes som standard og føjes ikke til. Brug
*+for i stedet at føje dem til.
Dette mønster erstatter skrøbelige sed-skripter, der går i stykker ved ændringer i mellemrum.
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.yamlValidering af YAML og konvertering til JSON
Før du anvender en patchet YAML-fil på en klynge, er det god praksis at validere den og eventuelt konvertere den til JSON til andre værktøjer.
Validér syntaksen:
yq '.' file.yaml && echo "Valid"— yq afslutter med kode 1 ved parsefejl, så dette fungerer i CI-gates.
Konvertér YAML til JSON:
yq -o=json '.' file.yaml— skriver formateret JSON.- Send resultatet gennem
jqfor yderligere JSON-behandling:yq -o=json '.' file.yaml | jq '.metadata.name'
Konvertér JSON til YAML:
yq -P '.' file.json— flaget-Ptvinger YAML-output (med pæn formatering), når inputtet er JSON.
Disse konverteringer gør yq til en bro mellem YAML-baserede værktøjer (Helm, kubectl) og JSON-baserede værktøjer (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 '.'Et komplet CI-script til udrulning af en patch
Her samler vi alle teknikkerne i et rigtigt CI-script, der patcher et Kubernetes-udrulningsmanifest som en del af et GitOps-arbejdsforløb.
Scriptet:
- Validerer YAML-inputtet, før det ændres.
- Bruger
env()/strenv()til alle variabelsubstitutioner. - Opdaterer containerens billedtag ved hjælp af et navnebaseret
select(). - Forøger antallet af replikaer.
- Tilføjer en
deploy-time-annotation med det aktuelle tidsstempel. - Validerer outputtet igen før commit.
Dette mønster sikrer, at hvert trin er atomisk og kan revideres, selv hvis arbejdsforløbet kører samtidigt.
#!/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"Videnscheck: Sikker redigering af flere dokumenter
Test din forståelse af redigering af Kubernetes-YAML-filer med flere dokumenter ved hjælp af yq.
Opsummering af lektionen: Redigering af YAML med yq
Du har gennemført lektionen om redigering af YAML-konfigurationsfiler med yq. Her er en kort opsummering af alt det, vi har gennemgået:
- Installation: Brug mikefarah/yq Go-binærfilen (v4). Kontrollér med
yq --version. - Læsning: Stier med punktnotation som
.spec.replicas; adgang til tabeller med[0]eller iteration med[]. - Redigering direkte i filen: Flaget
-iomskriver filen. Forhåndsvis altid uden-iførst. - Robust målretning: Foretræk
select(.name == "app")frem for fast definerede tabelindekser. - Tilføjelse og sletning: Tildel en værdi til en ny sti for at oprette den; brug
del()til at fjerne felter. - Filer med flere dokumenter: Brug
select(.kind == "...")til at målrette én ressource og lade de andre være urørte. - CI-variabler: Brug
strenv(VAR)til strenge ogenv(VAR)til værdier med type — det undgår problemer med shell-citater. - Sammenfletning:
. *= load("patch.yaml")sammenfletter en tilsidesættelsesfil rekursivt uden at miste nøgler, der ikke er patchet. - Validering og konvertering: Brug
yq '.'som lint-gate samt-o=jsonog-Ptil formatkonvertering.
Grundmønstret for enhver YAML-patch i CI er: validér → vælg → tildel → validér. Kombinér dette med strenv() og select(), så behøver du aldrig mere ty til skrøbelige sed-enkeltlinjer.
Lær Bash med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 22
- Lektioner
- 88
Ofte stillede spørgsmål
Er lektionen “Redigering af YAML-konfigurationsfiler med yq” gratis?
Ja — hele teksten til “Redigering af YAML-konfigurationsfiler med yq” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Linux-kommandolinjen og Bash-scripting på ekspertniveau-kurset, skal du opgradere til CoddyKit PRO. Linux-kommandolinjen og Bash-scripting på ekspertniveau-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Redigering af YAML-konfigurationsfiler med yq”?
Læs og opdatér Kubernetes- og CI-YAML-filer direkte med yq, samtidig med at struktur og kommentarer bevares. Du øver dig i Linux-kommandolinjen og Bash-scripting på ekspertniveau med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Linux-kommandolinjen og Bash-scripting på ekspertniveau?
Der kræves ingen tidligere erfaring. Linux-kommandolinjen og Bash-scripting på ekspertniveau på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Redigering af YAML-konfigurationsfiler med yq”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Linux-kommandolinjen og Bash-scripting på ekspertniveau-lektion?
Ja. Alle Linux-kommandolinjen og Bash-scripting på ekspertniveau-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Filtrering og udvælgelse af JSON med jq-pipelines
- Transformation og opbygning af JSON-objekter med jq
- Brug af REST-API'er med curl og jq i kombination
- Redigering af YAML-konfigurationsfiler med yq