Penguasaan Baris Perintah Linux & Penskripan Bash · Pelajaran

Mengedit Fail Konfigurasi YAML dengan yq

Baca dan ubah YAML Kubernetes serta CI secara terus menggunakan yq sambil mengekalkan struktur dan komen

Pelajaran 4 daripada 413 langkah

Mengedit Fail Konfigurasi YAML dengan yq ialah pelajaran Penguasaan Baris Perintah Linux & Penskripan Bash percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Penguasaan Baris Perintah Linux & Penskripan Bash, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Penguasaan Baris Perintah Linux & Penskripan Bash merangkumi sejumlah 4 pelajaran.

Apakah yq dan Mengapa Menggunakannya untuk YAML?

yq ialah pemproses YAML baris perintah mudah alih, sama seperti cara jq mengendalikan JSON. Dengannya, anda boleh membaca, menapis dan menyunting fail YAML tanpa menulis skrip dalam Python atau Ruby.

Terdapat dua alat popular yang bernama yq:

  • mikefarah/yq (Go) — diselenggara secara aktif serta menyokong YAML, JSON, XML dan TOML. Pelajaran ini menggunakan versi ini.
  • kislyuk/yq (Python) — pembungkus jq untuk YAML; sintaksnya berbeza.

Pasang versi Go:

  • brew install yq pada macOS
  • snap install yq pada Linux
  • Atau muat turun binari: wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/local/bin/yq && chmod +x /usr/local/bin/yq

Sahkan: yq --version sepatutnya mencetak v4.x.x. Versi 4 menggunakan sintaks ungkapan yang berbeza daripada v3, jadi versi adalah penting.

# 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

Membaca Nilai daripada YAML Deployment Kubernetes

Sebelum menyunting apa-apa, pelajari cara membaca medan YAML. Diberi Deployment Kubernetes, anda boleh mengekstrak sebarang nilai bersarang menggunakan laluan notasi titik.

Contoh 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

Perintah pembacaan utama:

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

Output ialah teks biasa secara lalai (tanpa petikan). Tambahkan bendera -r atau gunakan | yq -r jika anda memerlukan rentetan mentah dalam skrip.

# 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)"

Penyuntingan di Tempat dengan Bendera -i

Bendera paling penting untuk penggunaan sebenar ialah -i (di tempat). Tanpanya, yq mencetak hasil ke stdout dan membiarkan fail tanpa perubahan.

Sintaks:

  • Baca sahaja (stdout): yq '.spec.replicas' file.yaml
  • Sunting di tempat: yq -i '.spec.replicas = 5' file.yaml

Operator penetapan = menetapkan nilai. Ungkapan tersebut ialah penapis yq penuh, jadi anda boleh menggabungkan pembacaan dan penulisan dalam satu laluan.

Penting: yq -i menulis semula keseluruhan fail. Komen yang diletakkan pada baris yang sama dengan medan biasanya dikekalkan, tetapi blok komen kendiri mungkin berubah kedudukan. Sentiasa lakukan commit YAML anda ke kawalan versi sebelum menjalankan suntingan di tempat secara pukal.

Uji dahulu tanpa -i, kemudian tambahkannya setelah anda berpuas hati dengan output.

# 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

Mengemas Kini Tag Imej Kontena

Tugas CI yang sangat biasa ialah menaik taraf tag imej Docker dalam manifes Kubernetes selepas imej baharu dibina. Dengan yq, tugas ini menjadi satu baris perintah.

Coraknya ialah:

  • Sasarkan kontena mengikut nama menggunakan select() untuk mengelakkan pengekodan indeks tatasusunan 0 secara terus.
  • Gunakan |= (operator kemas kini) atau = untuk menetapkan nilai baharu.

Menggunakan indeks tatasusunan (rapuh jika senarai kontena berubah):

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

Menggunakan select() (kukuh):

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

Dalam pipeline CI, anda akan menghantar tag sebagai pemboleh ubah shell:

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

Menambah dan Membuang Medan

Selain mengemas kini medan sedia ada, yq boleh menambah kunci baharu atau memadam kunci sedia ada.

Menambah medan:

  • Berikan nilai kepada laluan yang belum wujud: yq -i '.metadata.labels.version = "v2"' file.yaml
  • Jika kunci induk (labels) tiada, yq akan menciptanya secara automatik.

Memadam medan:

  • Gunakan fungsi del(): yq -i 'del(.metadata.annotations)' file.yaml
  • Padam elemen tatasusunan mengikut indeks: yq -i 'del(.spec.template.spec.containers[1])' file.yaml

Menambah elemen pada tatasusunan:

  • 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

Bekerja dengan Fail YAML Berbilang Dokumen

Manifes Kubernetes sering menghimpunkan berbilang sumber dalam satu fail yang dipisahkan oleh ---. Secara lalai, yq memproses semua dokumen dalam fail tersebut.

Teknik utama:

  • Senaraikan semua jenis dokumen: yq '.[].kind' multi.yaml — perhatikan .[] pada permulaan untuk mengulangi dokumen.
  • Sasarkan dokumen tertentu mengikut jenis: yq 'select(.kind == "Service")' multi.yaml
  • Sunting hanya dokumen yang sepadan di tempat:

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

Dokumen yang tidak sepadan dengan predikat select() diteruskan tanpa perubahan, jadi Service, ConfigMap dan sumber lain anda kekal utuh.

Untuk memecahkan fail berbilang dokumen kepada fail individu, anda boleh mengulang output yq atau menggunakan:

  • yq -s '.kind' multi.yaml — menulis satu fail bagi setiap dokumen, dinamakan berdasarkan nilai .kind.
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

Menampal YAML CI GitHub Actions

Fail konfigurasi CI (.github/workflows/*.yml, .gitlab-ci.yml) juga ialah YAML. Perintah yq yang sama boleh digunakan, walaupun laluannya mungkin sangat bersarang.

Tugas penampalan CI yang biasa:

  • Menetapkan versi pelaksana: kemas kini runs-on merentas semua kerja.
  • Mengemas kini versi tindakan: cari langkah yang menggunakan tindakan tertentu dan naik taraf medan usesnya.
  • Menogol bendera: hidupkan atau matikan tetapan pada peringkat aliran kerja.

Contoh: kemas kini semua langkah yang menggunakan actions/checkout kepada v4:

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

Idiom ini — ulang dengan [], kecilkan skop dengan select(), tetapkan dengan = — ialah corak teras untuk sebarang suntingan YAML berstruktur.

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

Menggunakan Pemboleh Ubah Persekitaran dalam Ungkapan yq

Menetapkan nilai secara terus dalam ungkapan yq menjadikan skrip rapuh. yq menyokong penyuntikan pemboleh ubah shell menggunakan env() atau singkatan strenv().

  • env(VAR_NAME) — membaca pemboleh ubah persekitaran dan menukarkannya kepada jenis YAML yang sesuai (nombor kekal nombor, rentetan kekal rentetan).
  • strenv(VAR_NAME) — sentiasa mengembalikan rentetan, berguna untuk tag imej.

Ini mengelakkan masalah petikan yang rumit apabila pemboleh ubah diinterpolasi dalam rentetan shell yang menggunakan petikan berganda serta mengandungi laluan YAML.

Corak:

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

Gunakan env() apabila menetapkan medan berangka seperti replicas supaya jenis YAML dikekalkan (integer, bukan rentetan berpetik).

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

Menggabungkan Dua Fail YAML

Kadangkala anda perlu menggunakan fail tampalan (YAML penggantian kecil) pada konfigurasi asas — contohnya, penggantian khusus persekitaran dalam aliran kerja gaya Kustomize.

yq boleh menggabungkan dua fail menggunakan operator gabungan *:

  • yq '. *= load("patch.yaml")' base.yaml — menggabungkan tampalan secara mendalam ke dalam asas dan menulis hasil ke output piawai.
  • Tambahkan -i untuk mengemas kini asas di tempatnya: yq -i '. *= load("patch.yaml")' base.yaml

Kelakuan penggabungan:

  • Nilai skalar dalam tampalan menggantikan nilai dalam asas.
  • Pemetaan digabungkan secara mendalam (kunci yang tiada dalam tampalan dikekalkan).
  • Jujukan (tatasusunan) digantikan secara lalai, bukannya ditambahkan. Gunakan *+ untuk menambahkannya.

Pola ini menggantikan skrip sed yang rapuh dan rosak apabila terdapat perubahan ruang kosong.

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

Mengesahkan YAML dan Menukarnya kepada JSON

Sebelum menggunakan YAML yang ditampal pada kluster, amalan yang baik ialah mengesahkannya dan, secara pilihan, menukarnya kepada JSON untuk alat lain.

Sahkan sintaks:

  • yq '.' file.yaml && echo "Valid" — yq keluar dengan kod 1 apabila berlaku ralat penghuraian, jadi arahan ini berfungsi dalam pintu kawalan CI.

Tukar YAML kepada JSON:

  • yq -o=json '.' file.yaml — menghasilkan JSON berformat kemas.
  • Salurkan kepada jq untuk pemprosesan JSON selanjutnya: yq -o=json '.' file.yaml | jq '.metadata.name'

Tukar JSON kepada YAML:

  • yq -P '.' file.json — bendera -P memaksa output YAML (berformat kemas) apabila inputnya ialah JSON.

Penukaran ini menjadikan yq sebagai jambatan antara alat asli YAML (Helm, kubectl) dengan alat asli JSON (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 '.'

Skrip Tampalan Pelancaran CI Lengkap

Menggabungkan semua teknik: satu skrip CI sebenar yang menampal manifes Deployment Kubernetes sebagai sebahagian daripada aliran GitOps.

Skrip ini:

  1. Mengesahkan YAML input sebelum mengubahnya.
  2. Menggunakan env() / strenv() untuk semua penggantian pemboleh ubah.
  3. Mengemas kini teg imej bekas menggunakan select() berasaskan nama.
  4. Menaikkan bilangan replika.
  5. Menetapkan anotasi deploy-time dengan cap masa semasa.
  6. Mengesahkan output sekali lagi sebelum melakukan serahan.

Pola ini memastikan setiap langkah kekal atomik dan boleh diaudit walaupun aliran berjalan serentak.

#!/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"

Semakan Pengetahuan: Penyuntingan Berbilang Dokumen yang Selamat

Uji pemahaman anda tentang penyuntingan fail YAML Kubernetes berbilang dokumen dengan yq.

Imbas Kembali Pelajaran: Menyunting YAML dengan yq

Anda telah melengkapkan pelajaran tentang menyunting fail konfigurasi YAML dengan yq. Berikut ialah ringkasan ringkas tentang semua perkara yang dibincangkan:

  • Pemasangan: Gunakan perduaan Go mikefarah/yq (v4). Sahkan dengan yq --version.
  • Membaca: Laluan notasi titik seperti .spec.replicas; akses tatasusunan dengan [0] atau lelaran [].
  • Penyuntingan di tempatnya: Bendera -i menulis semula fail. Sentiasa pratonton dahulu tanpa -i.
  • Penyasaran kukuh: Utamakan select(.name == "app") berbanding indeks tatasusunan yang dikodkan secara keras.
  • Menambah / memadam: Berikan nilai kepada laluan baharu untuk menciptanya; gunakan del() untuk membuang medan.
  • Fail berbilang dokumen: Gunakan select(.kind == "...") untuk menyasarkan satu sumber dan membiarkan sumber lain tanpa perubahan.
  • Pemboleh ubah CI: Gunakan strenv(VAR) untuk rentetan dan env(VAR) untuk nilai bert jenis — ini mengelakkan pepijat petikan shell.
  • Penggabungan: . *= load("patch.yaml") menggabungkan fail penggantian secara mendalam tanpa kehilangan kunci yang tidak ditampal.
  • Pengesahan & penukaran: yq '.' sebagai pintu kawalan pemeriksaan; -o=json dan -P untuk penukaran format.

Pola teras bagi sebarang tampalan YAML dalam CI ialah: sahkan → pilih → berikan → sahkan. Gabungkan ini dengan strenv() dan select(), dan anda tidak lagi perlu menggunakan satu baris sed yang rapuh.

Percuma untuk bermula

Pelajari Bash dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
22
Pelajaran
88

Soalan Lazim

Adakah pelajaran “Mengedit Fail Konfigurasi YAML dengan yq” percuma?

Ya — teks penuh “Mengedit Fail Konfigurasi YAML dengan yq” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Penguasaan Baris Perintah Linux &amp; Penskripan Bash, tingkat taraf kepada CoddyKit PRO. Kursus Penguasaan Baris Perintah Linux &amp; Penskripan Bash merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mengedit Fail Konfigurasi YAML dengan yq”?

Baca dan ubah YAML Kubernetes serta CI secara terus menggunakan yq sambil mengekalkan struktur dan komen Anda berlatih Penguasaan Baris Perintah Linux &amp; Penskripan Bash menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Penguasaan Baris Perintah Linux &amp; Penskripan Bash?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Penguasaan Baris Perintah Linux &amp; Penskripan Bash di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Mengedit Fail Konfigurasi YAML dengan yq” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Penguasaan Baris Perintah Linux &amp; Penskripan Bash ini?

Ya. Setiap pelajaran Penguasaan Baris Perintah Linux &amp; Penskripan Bash menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Menapis dan Memilih JSON dengan Saluran Paip jq
  2. Mengubah dan Membina Objek JSON dengan jq
  3. Menggunakan API REST dengan curl dan jq Bersama-sama
  4. Mengedit Fail Konfigurasi YAML dengan yq
← Kembali ke Penguasaan Baris Perintah Linux &amp; Penskripan Bash