YAML Anchor dan Alias: Pola Konfigurasi DRY
Mengulang konfigurasi yang sama di beberapa bagian file YAML melanggar prinsip DRY (Don't Repeat Yourself) dan menimbulkan kesulitan pemeliharaan. YAML anchor dan alias menyelesaikan masalah ini dengan memungkinkan Anda mendefinisikan nilai satu kali dan mereferensikannya berkali-kali.
Sintaks Dasar
Anchor (&): Menandai nilai untuk digunakan ulang
Alias (*): Mereferensikan nilai yang telah di-anchor
# Define an anchor
defaults: &default_settings
timeout: 30
retries: 3
log_level: info
# Use aliases to reference it
development:
<<: *default_settings
log_level: debug
production:
<<: *default_settings
retries: 5
Merge key << menggabungkan semua pasangan key-value dari anchor yang direferensikan. Properti yang didefinisikan setelah merge akan menimpa nilai dari anchor.
Hasil setelah resolusi:
development:
timeout: 30
retries: 3
log_level: debug # overridden
production:
timeout: 30
retries: 5 # overridden
log_level: info
Jenis Anchor
Anchor Skalar
Gunakan ulang satu nilai:
max_connections: &max_conn 100
database:
pool_size: *max_conn
cache:
pool_size: *max_conn
Anchor Sekuens
Gunakan ulang seluruh daftar:
common_ports: &ports
- 80
- 443
web_server:
ports: *ports
load_balancer:
ports: *ports
Anchor Pemetaan
Gunakan ulang seluruh objek (pola yang paling umum):
logging: &log_config
driver: json-file
options:
max-size: "10m"
max-file: "3"
services:
api:
logging: *log_config
worker:
logging: *log_config
Merge Key (<<)
Merge key memiliki perilaku spesifik:
- Menyalin semua pasangan key-value dari pemetaan yang direferensikan
- Key yang ditetapkan secara eksplisit memiliki prioritas di atas key yang di-merge
- Beberapa merge diproses secara berurutan (yang pertama menang untuk konflik)
# Multiple merges
base: &base
a: 1
b: 2
extra: &extra
b: 3
c: 4
combined:
<<: [*base, *extra]
# Result: a=1, b=2 (base wins), c=4
Contoh Dunia Nyata
Docker Compose
x-common: &common
restart: unless-stopped
networks:
- app-network
logging:
driver: json-file
options:
max-size: "10m"
services:
api:
<<: *common
image: myapp/api:latest
ports:
- "8080:8080"
environment:
DATABASE_URL: postgres://db:5432/myapp
worker:
<<: *common
image: myapp/worker:latest
environment:
QUEUE_URL: redis://cache:6379
scheduler:
<<: *common
image: myapp/scheduler:latest
Docker Compose menggunakan konvensi prefiks x- untuk field ekstensi yang menyimpan anchor. Lihat panduan YAML untuk Docker Compose kami untuk pola lainnya.
GitHub Actions
jobs:
test:
runs-on: ubuntu-latest
env: &common_env
NODE_VERSION: '20'
CI: true
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- run: npm test
build:
runs-on: ubuntu-latest
needs: test
env:
<<: *common_env
BUILD_TARGET: production
steps:
- uses: actions/checkout@v4
- run: npm run build
Kubernetes
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: app
resources: &resources
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
- name: sidecar
resources: *resources # Same resource limits
Batasan dan Jebakan
1. Tidak Ada Referensi Lintas File
Anchor hanya berfungsi dalam satu file YAML. Anda tidak dapat mereferensikan anchor yang didefinisikan di file lain. Untuk penggunaan ulang lintas file, gunakan alat templating seperti Helm, Jsonnet, atau Kustomize.
2. Tidak Ada Override Parsial dalam Sekuens
Anda tidak dapat melakukan merge dan override parsial pada daftar — Anda mengganti seluruh daftar:
base_ports: &ports
- 80
- 443
service:
ports: *ports # You get exactly [80, 443]
# Cannot add port 8080 to this list via merge
Solusi: Definisikan daftar yang diperluas secara terpisah.
3. Urutan Penting
Anchor harus didefinisikan sebelum direferensikan:
# WRONG - alias before anchor
service:
settings: *defaults
defaults: &defaults
timeout: 30
# CORRECT - anchor before alias
defaults: &defaults
timeout: 30
service:
settings: *defaults
4. Tidak Semua Alat Mendukung Merge Key
Merge key << bukan bagian dari spesifikasi inti YAML — ini adalah ekstensi khusus tipe. Sebagian besar parser YAML populer mendukungnya, tetapi beberapa parser yang ketat mungkin tidak.
Validasi penggunaan YAML anchor Anda dengan YAML Validator kami.
FAQ
Apakah anchor dipertahankan saat mengkonversi YAML ke JSON?
Tidak. Ketika YAML di-parse, anchor dan alias di-resolve menjadi nilainya. JSON yang dihasilkan akan memiliki nilai yang diperluas secara inline. Ini berarti mengkonversi ke JSON dan kembali akan kehilangan struktur DRY. Anchor hanya ada dalam format sumber YAML.
Bisakah saya menggunakan anchor dengan override bersarang yang kompleks?
Merge key (<<) hanya melakukan shallow merge — menyalin key level atas dari pemetaan yang di-anchor. Objek bersarang diganti seluruhnya, bukan di-deep-merge. Untuk perilaku deep merge, Anda memerlukan solusi khusus alat (fungsi merge Helm, prosesor YAML kustom).
Sumber Terkait
- YAML Validator — Validasi YAML dengan anchor dan alias
- Tutorial Sintaks YAML — Dasar-dasar YAML
- YAML untuk Docker Compose — Pola khusus Docker