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

Ancres et Alias YAML : Patrons de Configuration DRY

RĂ©pĂ©ter la mĂȘme configuration dans plusieurs sections d'un fichier YAML viole le principe DRY (Don't Repeat Yourself) et crĂ©e des casse-tĂȘtes de maintenance. Les ancres et alias YAML rĂ©solvent ce problĂšme en vous permettant de dĂ©finir une valeur une seule fois et de la rĂ©fĂ©rencer plusieurs fois.

Syntaxe de Base

Ancre (&) : Marque une valeur pour réutilisation Alias (*) : Référence une valeur ancrée

# 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

La clé de fusion << incorpore toutes les paires clé-valeur de l'ancre référencée. Les propriétés définies aprÚs la fusion remplacent les valeurs ancrées.

Résultat aprÚs résolution :

development:
  timeout: 30
  retries: 3
  log_level: debug  # overridden

production:
  timeout: 30
  retries: 5        # overridden
  log_level: info

Types d'Ancres

Ancres Scalaires

Réutilisez une seule valeur :

max_connections: &max_conn 100

database:
  pool_size: *max_conn
cache:
  pool_size: *max_conn

Ancres de Séquence

Réutilisez des listes entiÚres :

common_ports: &ports
  - 80
  - 443

web_server:
  ports: *ports
load_balancer:
  ports: *ports

Ancres de Mapping

Réutilisez des objets entiers (le patron le plus courant) :

logging: &log_config
  driver: json-file
  options:
    max-size: "10m"
    max-file: "3"

services:
  api:
    logging: *log_config
  worker:
    logging: *log_config

La Clé de Fusion (<<)

La clé de fusion a un comportement spécifique :

  1. Elle copie toutes les paires clé-valeur du mapping référencé
  2. Les clés explicitement définies ont priorité sur les clés fusionnées
  3. Les fusions multiples sont traitées dans l'ordre (le premier l'emporte en cas de conflit)
# 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

Exemples Concrets

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 utilise la convention du préfixe x- pour les champs d'extension qui contiennent les ancres. Consultez notre guide YAML pour Docker Compose pour plus de patrons.

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

Limitations et PiĂšges

1. Pas de Références Inter-Fichiers

Les ancres ne fonctionnent qu'au sein d'un seul fichier YAML. Vous ne pouvez pas référencer une ancre définie dans un autre fichier. Pour la réutilisation inter-fichiers, utilisez des outils de templating comme Helm, Jsonnet ou Kustomize.

2. Pas de Remplacement Partiel dans les Séquences

Vous ne pouvez pas fusionner et remplacer partiellement une liste — vous remplacez la liste entiùre :

base_ports: &ports
  - 80
  - 443

service:
  ports: *ports  # You get exactly [80, 443]
  # Cannot add port 8080 to this list via merge

Solution de contournement : Définissez la liste étendue séparément.

3. L'Ordre est Important

Les ancres doivent ĂȘtre dĂ©finies avant d'ĂȘtre rĂ©fĂ©rencĂ©es :

# WRONG - alias before anchor
service:
  settings: *defaults

defaults: &defaults
  timeout: 30

# CORRECT - anchor before alias
defaults: &defaults
  timeout: 30

service:
  settings: *defaults

4. Tous les Outils ne Supportent pas les Clés de Fusion

La clĂ© de fusion << ne fait pas partie de la spĂ©cification YAML de base — c'est une extension spĂ©cifique au type. La plupart des parseurs YAML populaires la supportent, mais certains parseurs stricts peuvent ne pas le faire.

Validez votre utilisation des ancres YAML avec notre Validateur YAML.

FAQ

Les ancres sont-elles préservées lors de la conversion YAML vers JSON ?

Non. Quand le YAML est parsé, les ancres et alias sont résolus en leurs valeurs. Le JSON résultant aura les valeurs développées en ligne. Cela signifie que convertir en JSON puis revenir en YAML perdra la structure DRY. Les ancres n'existent que dans le format source YAML.

Puis-je utiliser des ancres avec des remplacements imbriqués complexes ?

La clĂ© de fusion (<<) n'effectue qu'une fusion superficielle — elle copie les clĂ©s de premier niveau du mapping ancrĂ©. Les objets imbriquĂ©s sont remplacĂ©s entiĂšrement, pas fusionnĂ©s en profondeur. Pour un comportement de fusion profonde, vous avez besoin d'une solution spĂ©cifique Ă  l'outil (fonction merge de Helm, processeurs YAML personnalisĂ©s).

Ressources Connexes

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