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 :
- Elle copie toutes les paires clé-valeur du mapping référencé
- Les clés explicitement définies ont priorité sur les clés fusionnées
- 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
- Validateur YAML â Validez du YAML avec ancres et alias
- Tutoriel de Syntaxe YAML â Les fondamentaux YAML
- YAML pour Docker Compose â Patrons spĂ©cifiques Ă Docker