Linux-kommandolinjen og Bash-scripting på ekspertniveau · Lektion

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.

Lektion 4 af 413 trin

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 yq på macOS
  • snap install yq på 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 --version

Læ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.0

Vigtige læsekommandoer:

  • yq '.metadata.name' deployment.yaml — udskriver my-app
  • yq '.spec.replicas' deployment.yaml — udskriver 3
  • yq '.spec.template.spec.containers[0].image' deployment.yaml — udskriver my-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.yaml

Opdatering 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.yaml

Tilfø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.yaml

Arbejde 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.yaml

Rettelse 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-on på 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.yml

Dette 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.yml

Brug 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.yaml

Brug 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.yaml

Sammenfletning 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 -i for 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.yaml

Validering 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 jq for yderligere JSON-behandling: yq -o=json '.' file.yaml | jq '.metadata.name'

Konvertér JSON til YAML:

  • yq -P '.' file.json — flaget -P tvinger 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:

  1. Validerer YAML-inputtet, før det ændres.
  2. Bruger env() / strenv() til alle variabelsubstitutioner.
  3. Opdaterer containerens billedtag ved hjælp af et navnebaseret select().
  4. Forøger antallet af replikaer.
  5. Tilføjer en deploy-time-annotation med det aktuelle tidsstempel.
  6. 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 -i omskriver filen. Forhåndsvis altid uden -i fø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 og env(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=json og -P til 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.

Gratis at komme i gang

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

  1. Filtrering og udvælgelse af JSON med jq-pipelines
  2. Transformation og opbygning af JSON-objekter med jq
  3. Brug af REST-API'er med curl og jq i kombination
  4. Redigering af YAML-konfigurationsfiler med yq
← Tilbage til Linux-kommandolinjen og Bash-scripting på ekspertniveau