Mengedit Fail Konfigurasi YAML dengan yq
Baca dan ubah YAML Kubernetes serta CI secara terus menggunakan yq sambil mengekalkan struktur dan komen
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
jquntuk YAML; sintaksnya berbeza.
Pasang versi Go:
brew install yqpada macOSsnap install yqpada 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 --versionMembaca 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.0Perintah pembacaan utama:
yq '.metadata.name' deployment.yaml— mencetakmy-appyq '.spec.replicas' deployment.yaml— mencetak3yq '.spec.template.spec.containers[0].image' deployment.yaml— mencetakmy-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.yamlMengemas 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.yamlMenambah 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.yamlBekerja 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.yamlMenampal 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-onmerentas 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.ymlIdiom 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.ymlMenggunakan 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.yamlGunakan 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.yamlMenggabungkan 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
-iuntuk 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.yamlMengesahkan 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
jquntuk pemprosesan JSON selanjutnya:yq -o=json '.' file.yaml | jq '.metadata.name'
Tukar JSON kepada YAML:
yq -P '.' file.json— bendera-Pmemaksa 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:
- Mengesahkan YAML input sebelum mengubahnya.
- Menggunakan
env()/strenv()untuk semua penggantian pemboleh ubah. - Mengemas kini teg imej bekas menggunakan
select()berasaskan nama. - Menaikkan bilangan replika.
- Menetapkan anotasi
deploy-timedengan cap masa semasa. - 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
-imenulis 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 danenv(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=jsondan-Puntuk 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.
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 & Penskripan Bash, tingkat taraf kepada CoddyKit PRO. Kursus Penguasaan Baris Perintah Linux & 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 & 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 & Penskripan Bash?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Penguasaan Baris Perintah Linux & 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 & Penskripan Bash ini?
Ya. Setiap pelajaran Penguasaan Baris Perintah Linux & 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
- Menapis dan Memilih JSON dengan Saluran Paip jq
- Mengubah dan Membina Objek JSON dengan jq
- Menggunakan API REST dengan curl dan jq Bersama-sama
- Mengedit Fail Konfigurasi YAML dengan yq