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

Âncoras e Aliases YAML: Padrões de Configuração DRY

Repetir a mesma configuração em múltiplas secções de um ficheiro YAML viola o princípio DRY (Don't Repeat Yourself) e cria dores de cabeça de manutenção. As âncoras e aliases YAML resolvem este problema, permitindo-lhe definir um valor uma vez e referenciá-lo múltiplas vezes.

Sintaxe Básica

Âncora (&): Marca um valor para reutilização Alias (*): Referencia um valor ancorado

# Definir uma âncora
defaults: &default_settings
  timeout: 30
  retries: 3
  log_level: info

# Utilizar aliases para referenciá-la
development:
  <<: *default_settings
  log_level: debug

production:
  <<: *default_settings
  retries: 5

A chave de fusão << incorpora todos os pares chave-valor da âncora referenciada. As propriedades definidas após a fusão sobrepõem os valores ancorados.

Resultado após resolução:

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

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

Tipos de Âncoras

Âncoras Escalares

Reutilize um valor único:

max_connections: &max_conn 100

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

Âncoras de Sequência

Reutilize listas inteiras:

common_ports: &ports
  - 80
  - 443

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

Âncoras de Mapeamento

Reutilize objetos inteiros (o padrão mais comum):

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

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

A Chave de Fusão (<<)

A chave de fusão tem um comportamento específico:

  1. Copia todos os pares chave-valor do mapeamento referenciado
  2. As chaves explicitamente definidas têm prioridade sobre as chaves fundidas
  3. Múltiplas fusões são processadas por ordem (a primeira ganha em caso de conflito)
# Múltiplas fusões
base: &base
  a: 1
  b: 2

extra: &extra
  b: 3
  c: 4

combined:
  <<: [*base, *extra]
  # Resultado: a=1, b=2 (base ganha), c=4

Exemplos do Mundo Real

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

O Docker Compose utiliza a convenção de prefixo x- para campos de extensão que contêm âncoras. Consulte o nosso guia YAML para Docker Compose para mais padrões.

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  # Mesmos limites de recursos

Limitações e Armadilhas

1. Sem Referências Entre Ficheiros

As âncoras funcionam apenas dentro de um único ficheiro YAML. Não é possível referenciar uma âncora definida noutro ficheiro. Para reutilização entre ficheiros, utilize ferramentas de template como Helm, Jsonnet ou Kustomize.

2. Sem Sobreposições Parciais em Sequências

Não é possível fundir e sobrepor parcialmente uma lista — substitui-se a lista inteira:

base_ports: &ports
  - 80
  - 443

service:
  ports: *ports  # Obtém exatamente [80, 443]
  # Não é possível adicionar a porta 8080 a esta lista via fusão

Solução alternativa: Defina a lista estendida separadamente.

3. A Ordem Importa

As âncoras devem ser definidas antes de serem referenciadas:

# ERRADO - alias antes da âncora
service:
  settings: *defaults

defaults: &defaults
  timeout: 30

# CORRETO - âncora antes do alias
defaults: &defaults
  timeout: 30

service:
  settings: *defaults

4. Nem Todas as Ferramentas Suportam Chaves de Fusão

A chave de fusão << não faz parte da especificação central do YAML — é uma extensão específica de tipo. A maioria dos analisadores YAML populares suporta-a, mas alguns analisadores rigorosos podem não a suportar.

Valide a sua utilização de âncoras YAML com o nosso Validador YAML.

FAQ

As âncoras são preservadas ao converter YAML para JSON?

Não. Quando o YAML é analisado, as âncoras e aliases são resolvidos nos seus valores. O JSON resultante terá os valores expandidos em linha. Isto significa que converter para JSON e de volta perderá a estrutura DRY. As âncoras existem apenas no formato de origem YAML.

Posso utilizar âncoras com sobreposições aninhadas complexas?

A chave de fusão (<<) realiza apenas uma fusão superficial — copia as chaves de nível superior do mapeamento ancorado. Os objetos aninhados são substituídos inteiramente, não fundidos em profundidade. Para comportamento de fusão profunda, necessita de uma solução específica da ferramenta (função merge do Helm, processadores YAML personalizados).

Recursos Relacionados

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