yq ile YAML Yapılandırma Dosyalarını Düzenleme
Yapıyı ve yorumları koruyarak Kubernetes ve CI YAML dosyalarını yq ile yerinde okuyun ve güncelleyin.
yq ile YAML Yapılandırma Dosyalarını Düzenleme, CoddyKit'te ücretsiz bir Linux Command Line & Bash Scripting Mastery dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Linux Command Line & Bash Scripting Mastery öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Linux Command Line & Bash Scripting Mastery kursu toplamda 4 dersten oluşur.
yq Nedir ve YAML İçin Neden Kullanılır?
yq, jq'nin JSON'u işlemesine benzer şekilde çalışan, taşınabilir bir komut satırı YAML işlemcisidir. Python veya Ruby ile betik yazmadan YAML dosyalarını okumanızı, filtrelemenizi ve düzenlemenizi sağlar.
yq adını taşıyan iki popüler araç vardır:
- mikefarah/yq (Go) — etkin olarak bakımı yapılır; YAML, JSON, XML ve TOML destekler. Bu derste bu sürüm kullanılır.
- kislyuk/yq (Python) — YAML için bir
jqsarmalayıcısıdır; söz dizimi farklıdır.
Go sürümünü yükleyin:
- macOS'ta
brew install yq - Linux'ta
snap install yq - Veya ikili dosyayı indirin:
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/local/bin/yq && chmod +x /usr/local/bin/yq
Doğrulayın: yq --version, v4.x.x yazdırmalıdır. 4. sürümü, v3'ten farklı bir ifade söz dizimi kullanır; bu nedenle sürüm önemlidir.
# 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 --versionKubernetes Dağıtım YAML'ından Değerleri Okuma
Herhangi bir şeyi düzenlemeden önce YAML alanlarını okumayı öğrenin. Bir Kubernetes Deployment verildiğinde, nokta gösterimli yollarla iç içe geçmiş tüm değerleri çıkarabilirsiniz.
Örnek 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.0Temel okuma komutları:
yq '.metadata.name' deployment.yaml—my-appyazdırıryq '.spec.replicas' deployment.yaml—3yazdırıryq '.spec.template.spec.containers[0].image' deployment.yaml—my-app:1.0.0yazdırır
Çıktı varsayılan olarak düz metindir (tırnak işareti yoktur). Betiklerde ham dizelere ihtiyacınız varsa -r bayrağını ekleyin veya | yq -r kullanın.
# 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)"-i Bayrağıyla Yerinde Düzenleme
Gerçek dünyadaki kullanım için en önemli bayrak -i (yerinde) bayrağıdır. Bu bayrak olmadan yq, sonuçları standart çıktıya yazdırır ve dosyayı değiştirmeden bırakır.
Söz dizimi:
- Yalnızca okuma (standart çıktı):
yq '.spec.replicas' file.yaml - Yerinde düzenleme:
yq -i '.spec.replicas = 5' file.yaml
Atama işleci = bir değer belirler. İfade tam bir yq filtresidir; bu nedenle okuma ve yazma işlemlerini tek geçişte birleştirebilirsiniz.
Önemli: yq -i dosyanın tamamını yeniden yazar. Alanla aynı satıra yerleştirilen açıklamalar genellikle korunur, ancak bağımsız açıklama blokları taşınabilir. Toplu yerinde düzenlemeleri çalıştırmadan önce YAML dosyanızı her zaman sürüm denetimine kaydedin.
Önce -i olmadan test edin, ardından çıktıyı beğendiğinizde ekleyin.
# 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.yamlKapsayıcı İmaj Etiketini Güncelleme
Çok yaygın bir CI görevi, yeni bir imaj oluşturulduktan sonra Kubernetes bildirimindeki Docker imaj etiketini artırmaktır. yq ile bu işlem tek satırlık bir komuta dönüşür.
Desen şöyledir:
- Dizi 0 dizinini sabit kodlamaktan kaçınmak için kapsayıcıyı adına göre
select()kullanarak hedefleyin. - Yeni değeri belirlemek için
|=(güncelleme işleci) veya=kullanın.
Dizi dizinini kullanma (kapsayıcı listesi değişirse kırılgan olur):
yq -i '.spec.template.spec.containers[0].image = "my-app:2.1.0"' deployment.yaml
select() kullanma (sağlamdır):
yq -i '(.spec.template.spec.containers[] | select(.name == "app")).image = "my-app:2.1.0"' deployment.yaml
Bir CI işlem hattında etiketi bir kabuk değişkeni olarak geçirirsiniz:
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.yamlAlanları Ekleme ve Kaldırma
Mevcut alanları güncellemenin yanı sıra yq, yeni anahtarlar ekleyebilir veya mevcut anahtarları silebilir.
Alan ekleme:
- Var olmayan bir yola doğrudan atama yapın:
yq -i '.metadata.labels.version = "v2"' file.yaml - Üst anahtar (
labels) eksikse yq bunu otomatik olarak oluşturur.
Alan silme:
del()işlevini kullanın:yq -i 'del(.metadata.annotations)' file.yaml- Dizi öğesini dizinine göre silin:
yq -i 'del(.spec.template.spec.containers[1])' file.yaml
Diziye öğe ekleme:
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.yamlBirden Çok Belgeli YAML Dosyalarıyla Çalışma
Kubernetes bildirimleri çoğu zaman tek bir dosyada, --- ile ayrılmış birden çok kaynağı bir araya getirir. Varsayılan olarak yq, böyle bir dosyadaki tüm belgeleri işler.
Temel teknikler:
- Tüm belge türlerini listeleyin:
yq '.[].kind' multi.yaml— belgeler üzerinde yineleme yapmak için baştaki.[]ifadesine dikkat edin. - Türe göre belirli bir belgeyi hedefleyin:
yq 'select(.kind == "Service")' multi.yaml - Yalnızca eşleşen belgeleri yerinde düzenleyin:
yq -i 'select(.kind == "Deployment").spec.replicas = 2' multi.yaml
select() koşuluyla eşleşmeyen belgeler değiştirilmeden aktarılır; böylece Service, ConfigMap ve diğer kaynaklarınız olduğu gibi kalır.
Birden çok belgeli bir dosyayı tek tek dosyalara ayırmak için yq çıktısı üzerinde döngü kurabilir veya şunu kullanabilirsiniz:
yq -s '.kind' multi.yaml— her belge için.kinddeğerinin adını taşıyan bir dosya yazar.
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.yamlGitHub Actions CI YAML'ını Yamama
CI yapılandırma dosyaları (.github/workflows/*.yml, .gitlab-ci.yml) de YAML'dır. Aynı yq komutları çalışır, ancak yollar derin biçimde iç içe olabilir.
Yaygın CI yama görevleri:
- Çalıştırıcı sürümünü sabitleme: tüm işler genelinde
runs-ondeğerini güncelleyin. - Eylem sürümünü güncelleme: belirli bir eylemi kullanan adımları bulun ve
usesalanındaki sürümü artırın. - Bir bayrağı açıp kapatma: iş akışı düzeyindeki bir ayarı etkinleştirin veya devre dışı bırakın.
Örnek: actions/checkout kullanan tüm adımları v4'e güncelleyin:
yq -i '(.jobs[].steps[] | select(.uses == "actions/checkout@v3")).uses = "actions/checkout@v4"' .github/workflows/ci.ymlBu deyim — [] ile yineleme yapma, select() ile daraltma, = ile atama — yapılandırılmış her YAML düzenlemesi için temel desendir.
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.ymlyq İfadelerinde Ortam Değişkenlerini Kullanma
yq ifadelerinde değerleri sabit kodlamak betikleri kırılgan hale getirir. yq, kabuk değişkenlerini env() işlevi veya strenv() kısa yazımı ile eklemeyi destekler.
env(VAR_NAME)— ortam değişkenini okur ve uygun YAML türüne dönüştürür (sayı sayı olarak, dize dize olarak kalır).strenv(VAR_NAME)— her zaman bir dize döndürür; imaj etiketleri için kullanışlıdır.
Bu yaklaşım, YAML yolları içeren çift tırnaklı kabuk dizelerinin içine değişken yerleştirirken yaşanan tırnaklama kâbusunu önler.
Desen:
export IMAGE_TAG="my-app:3.0.0"
yq -i '.spec.template.spec.containers[0].image = strenv(IMAGE_TAG)' deployment.yamlreplicas gibi sayısal alanları ayarlarken YAML türünün korunması (tırnak içine alınmış dize değil, tam sayı) için env() kullanın.
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İki YAML Dosyasını Birleştirme
Bazen bir yama dosyasını (küçük bir geçersiz kılma YAML'ı) temel yapılandırmaya uygulamanız gerekir — örneğin Kustomize tarzı iş akışlarında ortama özgü geçersiz kılmalar için.
yq, * birleştirme işleci kullanarak iki dosyayı birleştirebilir:
yq '. *= load("patch.yaml")' base.yaml— yamayı temel dosyayla derinlemesine birleştirir ve sonucu standart çıktıya yazar.- Temel dosyayı yerinde güncellemek için
-iekleyin:yq -i '. *= load("patch.yaml")' base.yaml
Birleştirme davranışı:
- Yamadaki skaler değerler temel dosyadakilerin üzerine yazılır.
- Eşlemeler derinlemesine birleştirilir (yamada bulunmayan anahtarlar korunur).
- Diziler varsayılan olarak değiştirilir, sonuna eklenmez. Bunun yerine ekleme yapmak için
*+kullanın.
Bu yaklaşım, boşluk değişikliklerinde bozulan kırılgan sed betiklerinin yerini alır.
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.yamlYAML'ı Doğrulama ve JSON'a Dönüştürme
Yama uygulanmış bir YAML'ı kümeye uygulamadan önce onu doğrulamak ve isteğe bağlı olarak diğer araçlar için JSON'a dönüştürmek iyi bir uygulamadır.
Söz dizimini doğrulama:
yq '.' file.yaml && echo "Valid"— yq ayrıştırma hatalarında 1 koduyla çıkar; bu nedenle CI geçitlerinde kullanılabilir.
YAML'ı JSON'a dönüştürme:
yq -o=json '.' file.yaml— biçimlendirilmiş JSON çıktısı verir.- Daha ileri JSON işleme için
jq'ya yönlendirin:yq -o=json '.' file.yaml | jq '.metadata.name'
JSON'u YAML'a dönüştürme:
yq -P '.' file.json— giriş JSON olduğunda-Pseçeneği YAML (biçimlendirilmiş) çıktısını zorunlu kılar.
Bu dönüştürmeler, yq'yu YAML yerel araçları (Helm, kubectl) ile JSON yerel araçları (Terraform, AWS CLI, jq) arasında bir köprü hâline getirir.
# 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 '.'Eksiksiz CI Dağıtım Yaması Betiği
Tüm teknikleri bir araya getirelim: GitOps işlem hattının parçası olarak bir Kubernetes Deployment bildirimine yama uygulayan gerçek bir CI betiği.
Betik şunları yapar:
- Giriş YAML'ını üzerinde işlem yapmadan önce doğrular.
- Tüm değişken ikameleri için
env()/strenv()kullanır. - İsim tabanlı bir
select()kullanarak kapsayıcı imajı etiketini günceller. - Çoğaltma sayısını artırır.
- Geçerli zaman damgasıyla bir
deploy-timeaçıklaması ekler. - Göndermeden önce çıktıyı yeniden doğrular.
Bu yaklaşım, işlem hattı eşzamanlı çalışsa bile her adımın atomik ve denetlenebilir olmasını sağlar.
#!/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"Bilgi Kontrolü: Güvenli Çok Belgeli Düzenleme
yq ile çok belgeli Kubernetes YAML dosyalarını düzenleme konusundaki anlayışınızı sınayın.
Ders Özeti: yq ile YAML Düzenleme
YAML yapılandırma dosyalarını yq ile düzenleme dersini tamamladınız. İşlenen konuların kısa özeti aşağıdadır:
- Kurulum: mikefarah/yq Go ikilisini (v4) kullanın.
yq --versionile doğrulayın. - Okuma:
.spec.replicasgibi nokta gösterimli yollar;[0]veya[]yinelemesiyle dizi erişimi. - Yerinde düzenleme:
-iseçeneği dosyayı yeniden yazar. Önce her zaman-iolmadan önizleme yapın. - Sağlam hedefleme: Sabit dizi dizinleri yerine
select(.name == "app")kullanmayı tercih edin. - Ekleme / silme: Yeni bir yol oluşturmak için bu yola değer atayın; alanları kaldırmak için
del()kullanın. - Çok belgeli dosyalar: Bir kaynağı hedeflemek ve diğerlerine dokunmamak için
select(.kind == "...")kullanın. - CI değişkenleri: Dizeler için
strenv(VAR), türü belirlenmiş değerler içinenv(VAR)kullanın — kabuk tırnaklama hatalarını önler. - Birleştirme:
. *= load("patch.yaml"), yama uygulanmamış anahtarları kaybetmeden bir geçersiz kılma dosyasını derinlemesine birleştirir. - Doğrulama ve dönüştürme: Bir lint geçidi olarak
yq '.'; biçim dönüştürme için-o=jsonve-P.
CI'daki herhangi bir YAML yaması için temel yaklaşım şudur: doğrula → seç → ata → doğrula. Bunu strenv() ve select() ile birleştirdiğinizde kırılgan tek satırlık sed komutlarına bir daha ihtiyaç duymazsınız.
Sıkça Sorulan Sorular
“yq ile YAML Yapılandırma Dosyalarını Düzenleme” dersi ücretsiz mi?
Evet — “yq ile YAML Yapılandırma Dosyalarını Düzenleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Linux Command Line & Bash Scripting Mastery kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Linux Command Line & Bash Scripting Mastery kursu toplamda 4 dersten oluşur.
“yq ile YAML Yapılandırma Dosyalarını Düzenleme” dersinde ne öğreneceğim?
Yapıyı ve yorumları koruyarak Kubernetes ve CI YAML dosyalarını yq ile yerinde okuyun ve güncelleyin. Linux Command Line & Bash Scripting Mastery ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Linux Command Line & Bash Scripting Mastery öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Linux Command Line & Bash Scripting Mastery, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“yq ile YAML Yapılandırma Dosyalarını Düzenleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Linux Command Line & Bash Scripting Mastery dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Linux Command Line & Bash Scripting Mastery dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- jq Pipeline'larıyla JSON Filtreleme ve Seçme
- jq ile JSON Nesnelerini Dönüştürme ve Oluşturma
- curl ve jq ile Birlikte REST API'lerini Kullanma
- yq ile YAML Yapılandırma Dosyalarını Düzenleme