Mengedit File Konfigurasi YAML dengan yq
Baca dan ubah YAML Kubernetes serta CI langsung di tempat menggunakan yq, dengan tetap mempertahankan struktur dan komentar.
Mengedit File Konfigurasi YAML dengan yq adalah pelajaran DevOps Bootcamp gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar DevOps Bootcamp, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus DevOps Bootcamp mencakup 4 pelajaran total.
Apa Itu yq dan Mengapa Menggunakannya untuk YAML?
yq adalah pemroses YAML portabel berbasis baris perintah, mirip dengan cara jq menangani JSON. Anda dapat membaca, memfilter, dan mengedit file YAML tanpa menulis skrip dalam Python atau Ruby.
Ada dua alat populer bernama yq:
- mikefarah/yq (Go) — dipelihara secara aktif, mendukung YAML, JSON, XML, TOML. Pelajaran ini menggunakan versi ini.
- kislyuk/yq (Python) — pembungkus
jquntuk YAML; sintaksnya berbeda.
Instal versi Go:
brew install yqdi macOSsnap install yqdi Linux- Atau unduh biner:
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/local/bin/yq && chmod +x /usr/local/bin/yq
Verifikasi: yq --version seharusnya mencetak v4.x.x. Versi 4 menggunakan sintaks ekspresi yang berbeda dari v3, jadi versinya 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 dari YAML Deployment Kubernetes
Sebelum mengedit apa pun, pelajari cara membaca bidang YAML. Dengan Deployment Kubernetes, Anda dapat mengekstrak nilai bertingkat apa pun menggunakan jalur 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 utama untuk membaca:
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
Keluaran secara default berupa teks biasa (tanpa tanda kutip). Tambahkan tanda -r atau gunakan | yq -r jika Anda memerlukan string 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)"Mengedit di Tempat dengan Tanda -i
Tanda yang paling penting untuk penggunaan di dunia nyata adalah -i (di tempat). Tanpa tanda ini, yq mencetak hasil ke stdout dan membiarkan file tidak berubah.
Sintaks:
- Hanya membaca (stdout):
yq '.spec.replicas' file.yaml - Edit di tempat:
yq -i '.spec.replicas = 5' file.yaml
Operator penugasan = menetapkan sebuah nilai. Ekspresi tersebut merupakan filter yq lengkap, jadi Anda dapat menggabungkan pembacaan dan penulisan dalam satu proses.
Penting: yq -i menulis ulang file sepenuhnya. Komentar yang ditempatkan pada baris yang sama dengan suatu bidang umumnya dipertahankan, tetapi blok komentar yang berdiri sendiri dapat berpindah. Selalu lakukan commit terhadap YAML Anda ke kontrol versi sebelum menjalankan pengeditan di tempat secara massal.
Uji terlebih dahulu tanpa -i, lalu tambahkan tanda tersebut setelah Anda puas dengan hasilnya.
# 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.yamlMemperbarui Tag Image Container
Tugas CI yang sangat umum adalah menaikkan tag image Docker dalam manifes Kubernetes setelah image baru dibuat. Dengan yq, hal ini menjadi perintah satu baris.
Polanya adalah:
- Tentukan target container berdasarkan nama menggunakan
select()agar tidak mengandalkan indeks array 0. - Gunakan
|=(operator pembaruan) atau=untuk menetapkan nilai baru.
Menggunakan indeks array (rentan jika daftar container berubah):
yq -i '.spec.template.spec.containers[0].image = "my-app:2.1.0"' deployment.yaml
Menggunakan select() (andal):
yq -i '(.spec.template.spec.containers[] | select(.name == "app")).image = "my-app:2.1.0"' deployment.yaml
Dalam pipeline CI, Anda akan meneruskan tag sebagai variabel 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.yamlMenambahkan dan Menghapus Bidang
Selain memperbarui bidang yang sudah ada, yq dapat menambahkan kunci baru atau menghapus kunci yang sudah ada.
Menambahkan bidang:
- Cukup tetapkan nilai ke jalur yang belum ada:
yq -i '.metadata.labels.version = "v2"' file.yaml - Jika kunci induk (
labels) tidak ada, yq akan membuatnya secara otomatis.
Menghapus bidang:
- Gunakan fungsi
del():yq -i 'del(.metadata.annotations)' file.yaml - Hapus elemen array berdasarkan indeks:
yq -i 'del(.spec.template.spec.containers[1])' file.yaml
Menambahkan elemen ke 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.yamlBekerja dengan File YAML Multi-Dokumen
Manifes Kubernetes sering menggabungkan beberapa sumber daya dalam satu file yang dipisahkan oleh ---. Secara default, yq memproses semua dokumen dalam file tersebut.
Teknik utama:
- Daftarkan semua jenis dokumen:
yq '.[].kind' multi.yaml— perhatikan.[]di awal untuk mengiterasi dokumen. - Tentukan dokumen tertentu berdasarkan jenisnya:
yq 'select(.kind == "Service")' multi.yaml - Edit hanya dokumen yang cocok di tempat:
yq -i 'select(.kind == "Deployment").spec.replicas = 2' multi.yaml
Dokumen yang tidak cocok dengan predikat select() diteruskan tanpa perubahan, sehingga Service, ConfigMap, dan sumber daya Anda lainnya tetap utuh.
Untuk memisahkan file multi-dokumen menjadi file individual, Anda dapat melakukan perulangan pada keluaran yq atau menggunakan:
yq -s '.kind' multi.yaml— menulis satu file untuk setiap dokumen dengan nama berdasarkan nilai.kind-nya.
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.yamlMenambal YAML CI GitHub Actions
File konfigurasi CI (.github/workflows/*.yml, .gitlab-ci.yml) juga merupakan YAML. Perintah yq yang sama dapat digunakan, meskipun jalurnya mungkin sangat bertingkat.
Tugas penambalan CI yang umum:
- Menetapkan versi runner: perbarui
runs-ondi seluruh pekerjaan. - Memperbarui versi action: temukan langkah yang menggunakan action tertentu dan naikkan bidang
uses-nya. - Mengubah tanda: aktifkan atau nonaktifkan pengaturan tingkat alur kerja.
Contoh: perbarui semua langkah yang menggunakan actions/checkout ke v4:
yq -i '(.jobs[].steps[] | select(.uses == "actions/checkout@v3")).uses = "actions/checkout@v4"' .github/workflows/ci.ymlIdiom ini — iterasikan dengan [], persempit dengan select(), tetapkan dengan = — merupakan pola inti untuk setiap pengeditan YAML terstruktur.
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 Variabel Lingkungan dalam Ekspresi yq
Menuliskan nilai secara langsung dalam ekspresi yq membuat skrip rentan. yq mendukung penyisipan variabel shell menggunakan fungsi env() atau singkatan strenv().
env(VAR_NAME)— membaca variabel lingkungan dan mengonversinya ke tipe YAML yang sesuai (angka tetap menjadi angka, string tetap menjadi string).strenv(VAR_NAME)— selalu mengembalikan string, berguna untuk tag image.
Ini menghindari kerumitan pengutipan saat menginterpolasi variabel di dalam string shell yang diapit tanda kutip ganda dan berisi jalur YAML.
Pola:
export IMAGE_TAG="my-app:3.0.0"
yq -i '.spec.template.spec.containers[0].image = strenv(IMAGE_TAG)' deployment.yamlGunakan env() saat menetapkan bidang numerik seperti replicas agar tipe YAML tetap dipertahankan (bilangan bulat, bukan string yang diapit tanda kutip).
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 Berkas YAML
Terkadang Anda perlu menerapkan berkas patch (YAML penimpaan kecil) ke konfigurasi dasar—misalnya, penimpaan khusus lingkungan dalam alur kerja bergaya Kustomize.
yq dapat menggabungkan dua berkas menggunakan * operator penggabungan:
yq '. *= load("patch.yaml")' base.yaml— menggabungkan patch secara mendalam ke konfigurasi dasar dan menulis hasilnya ke stdout.- Tambahkan
-iuntuk memperbarui konfigurasi dasar di tempat:yq -i '. *= load("patch.yaml")' base.yaml
Perilaku penggabungan:
- Nilai skalar dalam patch menimpa konfigurasi dasar.
- Pemetaan digabungkan secara mendalam (kunci yang tidak ada dalam patch tetap dipertahankan).
- Urutan (array) secara bawaan diganti, bukan ditambahkan. Gunakan
*+untuk menambahkan.
Pola ini menggantikan skrip sed yang rapuh dan rusak saat terjadi perubahan spasi.
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.yamlMemvalidasi YAML dan Mengonversinya ke JSON
Sebelum menerapkan YAML yang telah di-patch ke klaster, sebaiknya Anda memvalidasinya dan, jika diperlukan, mengonversinya ke JSON untuk alat lain.
Validasi sintaks:
yq '.' file.yaml && echo "Valid"— yq keluar dengan kode 1 jika terjadi kesalahan penguraian, sehingga perintah ini dapat digunakan dalam pemeriksaan CI.
Mengonversi YAML ke JSON:
yq -o=json '.' file.yaml— menghasilkan JSON berformat rapi.- Salurkan ke
jquntuk pemrosesan JSON lebih lanjut:yq -o=json '.' file.yaml | jq '.metadata.name'
Mengonversi JSON ke YAML:
yq -P '.' file.json— tanda-Pmemaksa keluaran YAML (berformat rapi) saat masukannya berupa JSON.
Konversi ini menjadikan yq sebagai jembatan antara alat berbasis YAML (Helm, kubectl) dan alat berbasis 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 Patch Deployment CI Lengkap
Menggabungkan semua teknik: skrip CI nyata yang melakukan patch pada manifes Deployment Kubernetes sebagai bagian dari alur GitOps.
Skrip ini:
- Memvalidasi YAML masukan sebelum memprosesnya.
- Menggunakan
env()/strenv()untuk semua penggantian variabel. - Memperbarui tag image kontainer menggunakan
select()berbasis nama. - Menaikkan jumlah replika.
- Menambahkan anotasi
deploy-timedengan stempel waktu saat ini. - Memvalidasi keluaran sekali lagi sebelum melakukan commit.
Pola ini memastikan bahwa meskipun alur berjalan secara bersamaan, setiap langkah berlangsung secara atomis dan dapat diaudit.
#!/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"Pemeriksaan Pengetahuan: Penyuntingan Aman Banyak Dokumen
Uji pemahaman Anda tentang penyuntingan berkas YAML Kubernetes yang terdiri dari banyak dokumen dengan yq.
Ringkasan Pelajaran: Menyunting YAML dengan yq
Anda telah menyelesaikan pelajaran tentang menyunting berkas konfigurasi YAML dengan yq. Berikut ringkasan singkat semua materi yang dibahas:
- Instalasi: Gunakan biner Go mikefarah/yq (v4). Verifikasi dengan
yq --version. - Membaca: Jalur notasi titik seperti
.spec.replicas; akses array dengan iterasi[0]atau[]. - Penyuntingan di tempat: Tanda
-imenulis ulang berkas. Selalu tampilkan pratinjau tanpa-iterlebih dahulu. - Penargetan yang tangguh: Utamakan
select(.name == "app")daripada indeks array yang ditulis secara permanen. - Menambahkan / menghapus: Tetapkan nilai ke jalur baru untuk membuatnya; gunakan
del()untuk menghapus bidang. - Berkas banyak dokumen: Gunakan
select(.kind == "...")untuk menargetkan satu sumber daya dan membiarkan yang lain tanpa perubahan. - Variabel CI: Gunakan
strenv(VAR)untuk string danenv(VAR)untuk nilai bertipe—cara ini menghindari masalah pengutipan shell. - Penggabungan:
. *= load("patch.yaml")menggabungkan berkas penimpaan secara mendalam tanpa kehilangan kunci yang tidak diubah oleh patch. - Validasi & konversi: Gunakan
yq '.'sebagai pemeriksaan lint;-o=jsondan-Puntuk konversi format.
Pola inti untuk patch YAML apa pun dalam CI adalah: validasi → pilih → tetapkan → validasi. Gabungkan pola ini dengan strenv() dan select(), dan Anda tidak perlu lagi menggunakan perintah satu baris sed yang rapuh.
Belajar DevOps Bootcamp dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 142
- Pelajaran
- 568
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengedit File Konfigurasi YAML dengan yq” gratis?
Ya — teks lengkap “Mengedit File Konfigurasi YAML dengan yq” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus DevOps Bootcamp, upgrade ke CoddyKit PRO. Kursus DevOps Bootcamp mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengedit File Konfigurasi YAML dengan yq”?
Baca dan ubah YAML Kubernetes serta CI langsung di tempat menggunakan yq, dengan tetap mempertahankan struktur dan komentar. Kamu berlatih DevOps Bootcamp dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai DevOps Bootcamp?
Tidak diperlukan pengalaman sebelumnya. DevOps Bootcamp di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Mengedit File Konfigurasi YAML dengan yq” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran DevOps Bootcamp ini?
Ya. Setiap pelajaran DevOps Bootcamp menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Menyaring dan Memilih JSON dengan Pipeline jq
- Mengubah dan Membangun Objek JSON dengan jq
- Menggunakan REST API dengan curl dan jq Bersama-sama
- Mengedit File Konfigurasi YAML dengan yq