¿Qué es YAML?
YAML originalmente significaba Yet Another Markup Language, pero fue renombrado retroactivamente a YAML Ain't Markup Language para enfatizar que es un lenguaje de serialización de datos, no un lenguaje de marcado de documentos. YAML está diseñado para ser altamente legible para humanos: la especificación prioriza explícitamente la legibilidad sobre la velocidad de análisis o la compacidad.
YAML está definido por la especificación YAML (yaml.org), actualmente en la versión 1.2 (2009). YAML 1.2 es un superconjunto estricto de JSON — todo documento JSON válido es un documento YAML válido. YAML añade comentarios, tipos de datos complejos, múltiples documentos por archivo, referencias/alias y una sintaxis más expresiva.
YAML es el formato dominante para los archivos de configuración de DevOps: manifiestos de Kubernetes, archivos Docker Compose, flujos de trabajo de GitHub Actions, playbooks de Ansible, gráficos Helm e innumerables definiciones de pipelines CI/CD.
Sintaxis Principal
YAML usa sangría (solo espacios, sin tabulaciones) para representar la estructura:
# Esto es un comentario
nombre: Alicia
edad: 30
activo: true
puntuacion: 98.6
apodo: ~ # null
direccion:
calle: C/ Mayor 123
ciudad: Madrid
cp: "28001" # Entre comillas para evitar interpretación como entero
etiquetas:
- admin
- editor
- desarrollador
servidores:
- host: web01
puerto: 80
ssl: false
- host: web02
puerto: 443
ssl: true
Diferencias clave respecto a JSON:
- Sin comillas obligatorias para la mayoría de las cadenas
- Dos puntos y espacios separan claves de valores
- Guiones para elementos de lista
- Comentarios
#admitidos en todas partes ~onullpara valores nulos
Tipos de Datos YAML
El sistema de tipos de YAML es más rico que el de JSON:
Problema conocido con YAML 1.1: Los analizadores más antiguos (incluyendo PyYAML por defecto) tratan yes, no, on, off como booleanos. Esto causa problemas famosos con códigos de país:
pais: NO # ¡Analizado como booleano false en YAML 1.1!
activo: on # ¡Analizado como booleano true en YAML 1.1!
Siempre coloca estos valores entre comillas si pretendes que sean cadenas de texto.
Estilo Bloque frente a Estilo Flujo
YAML admite dos estilos sintácticos:
Estilo bloque (el formato legible y multilínea):
frutas:
- manzana
- platano
- cereza
persona:
nombre: Alicia
edad: 30
Estilo flujo (en línea, compatible con JSON):
frutas: [manzana, platano, cereza]
persona: {nombre: Alicia, edad: 30}
Ambos estilos pueden mezclarse libremente en el mismo documento.
Cadenas Multilínea
YAML tiene dos estilos de cadena multilínea:
Escalar de bloque literal (|): Preserva los saltos de línea exactamente:
descripcion: |
Primera línea de la descripción.
La segunda línea continúa aquí.
La tercera línea termina el bloque.
Escalar de bloque plegado (>): Pliega los saltos de línea en espacios (los saltos de línea simples se convierten en espacios; las líneas en blanco se convierten en saltos de línea):
resumen: >
Este es un párrafo largo que se extiende
por varias líneas pero se plegará
en una sola línea.
Una línea en blanco crea un salto de párrafo.
Anclajes y Alias
La característica más potente de YAML para la configuración DRY (Don't Repeat Yourself) son los anclajes y alias:
por_defecto: &por_defecto # & define un anclaje llamado "por_defecto"
tiempo_espera: 30
reintentos: 3
nivel_registro: info
desarrollo:
<<: *por_defecto # << es la "clave de fusión"; *por_defecto desreferencia el anclaje
base_datos: dev_db
depuracion: true
produccion:
<<: *por_defecto # Hereda tiempo_espera: 30, reintentos: 3, nivel_registro: info
base_datos: prod_db
tiempo_espera: 60 # Anulación: producción necesita más tiempo de espera
depuracion: false
Múltiples Documentos en un Archivo
Un archivo YAML puede contener múltiples documentos separados por ---:
---
# Documento 1
nombre: Alicia
rol: admin
---
# Documento 2
nombre: Roberto
rol: editor
Esto se usa extensamente en Kubernetes, donde un único archivo YAML puede definir múltiples recursos (Deployment, Service, ConfigMap) separados por ---.
YAML en DevOps: Ejemplos Reales
Docker Compose:
version: '3.9'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: postgres:15
environment:
POSTGRES_DB: miapp
POSTGRES_USER: usuario
POSTGRES_PASSWORD: secreto
Riesgos de Seguridad de YAML
Ejecución de código arbitrario: Los analizadores YAML que admiten la especificación completa (incluyendo etiquetas específicas del lenguaje como !!python/object/apply) pueden ejecutar código arbitrario. Un archivo YAML malicioso podría instanciar objetos y llamar a métodos durante el análisis.
Usa siempre la carga segura:
- Python:
yaml.safe_load()(noyaml.load()) - JavaScript: usa un analizador que no admita etiquetas ejecutables
Ataque de mil millones de risas: El abuso de anclas/alias puede crear una expansión exponencial:
a: &a [lol, lol, lol, lol]
b: &b [*a, *a, *a, *a]
c: &c [*b, *b, *b, *b]
# Después de 9 niveles: 4^9 = 262.144 cadenas de 5 líneas
Conversión de YAML
YAML → JSON: La mayoría de YAML representa datos compatibles con JSON. Python: json.dumps(yaml.safe_load(f)).
YAML → TOML: Ambos admiten comentarios y fechas de forma nativa. Las características complejas de YAML (anclajes, múltiples documentos) no tienen equivalentes en TOML.
JSON → YAML: Casi sin pérdida. Python: yaml.dump(json.load(f), default_flow_style=False).
Resumen
La extraordinaria legibilidad humana de YAML — posibilitada por el espacio en blanco significativo, las comillas opcionales, los comentarios y los anclajes — lo convierte en el formato dominante para la configuración de DevOps. Su propiedad de superconjunto de JSON de YAML 1.2 le proporciona elegancia matemática. Sus costes son reales: la especificación es una de las más complejas de uso común, los analizadores han tenido históricamente importantes vulnerabilidades de seguridad, y la sintaxis con espacio en blanco significativo es propensa a errores (tabulaciones invisibles, errores de nivel de sangría). Para el intercambio de datos generado por máquinas, JSON es más simple y seguro; para la configuración de infraestructura creada por humanos, YAML es el estándar.
Conversiones relacionadas
Conversiones frecuentes del catálogo: