alltools.one
YAML
2025-06-19
7 min
alltools.one Team
YAMLAnchorsAliasesDRYConfiguration

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:

  1. Menyalin semua pasangan key-value dari pemetaan yang direferensikan
  2. Key yang ditetapkan secara eksplisit memiliki prioritas di atas key yang di-merge
  3. 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

Published on 2025-06-19
YAML Anchors and Aliases: DRY Configuration Patterns | alltools.one