FlowingDev

YAML, explicado: el lenguaje de configuración que parece un poema

Aprende los fundamentos de YAML, el formato de datos legible por humanos para archivos de configuración, comunicación de API y para mantener la cordura en los ajustes de tu proyecto.

Probar la herramienta: Editor YAML

En una frase

YAML es una forma amigable para humanos de escribir datos estructurados, que cambia las llaves y comillas de sus primos por la indentación limpia de una lista del súper bien organizada.

El problema que resuelve

Al principio, todo era caos. Luego llegaron los archivos de configuración. Los primeros formatos como .ini eran simples, pero no podían manejar datos complejos y anidados. Después llegó XML, potente y estructurado, pero tan verboso y lleno de etiquetas que leerlo se sentía como armar un mueble de IKEA con instrucciones escritas en jerga legal. Los humanos odiaban escribirlo.

Luego vino JSON (JavaScript Object Notation) y fue una mejora enorme. Era ligero, se mapeaba directamente a estructuras de datos en la mayoría de los lenguajes de programación y era mucho más agradable a la vista que XML. Pero para los archivos que los humanos tenían que escribir y editar mucho —como scripts de DevOps, configuraciones de aplicaciones y textos de internacionalización— la sintaxis de JSON todavía se sentía tediosa. Todas esas llaves, comas y comillas eran ruido visual y era fácil equivocarse.

Y entonces llegó YAML. El nombre es un acrónimo recursivo que captura perfectamente su espíritu: "YAML Ain't Markup Language" (YAML No Es un Lenguaje de Marcado). Fue diseñado desde cero para una audiencia principal: el ser humano que mira la pantalla. Tomó las mismas estructuras de datos básicas que JSON (pares clave-valor, listas y valores simples) y se preguntó: "¿Cuál es la sintaxis mínima indispensable que necesitamos para representar esto?".

La respuesta fue la indentación. Al usar espacios en blanco para denotar la estructura, YAML creó un formato que a menudo es lo suficientemente limpio como para autodocumentarse. Fue hecho para el mundo de la configuración, donde la claridad y la facilidad de edición superan las necesidades de optimización para máquinas de una API de alto rendimiento.

Cómo funciona por debajo

La "magia" de YAML es solo un conjunto de reglas simples y consistentes para convertir texto indentado en datos estructurados. Es un superconjunto de JSON, lo que significa que a menudo puedes pegar JSON válido en un archivo YAML y simplemente funcionará. Pero el verdadero poder proviene de su sintaxis nativa y minimalista.

Los componentes básicos: Escalares, Secuencias y Mapeos

Todos los datos en YAML se reducen a tres cosas:

  1. Mapeos (también conocidos como Diccionarios u Objetos): Son los clásicos pares clave: valor. La clave es un string y el valor puede ser cualquier cosa: otro mapeo, una secuencia o un escalar.

    # Un mapeo simple
    personaje: "Bilbo Bolsón"
    raza: "Hobbit"
    edad: 111
    
  2. Secuencias (también conocidas como Listas o Arrays): Son listas ordenadas de elementos. Cada elemento se denota con un guion y un espacio (- ).

    # Una secuencia de strings
    miembros_de_la_comunidad:
      - Frodo Bolsón
      - Samsagaz Gamyi
      - Gandalf
      - Legolas
      - Gimli
    
  3. Escalares (también conocidos como Valores Simples): Es solo un valor único, como un string, un número o un booleano. YAML es bastante inteligente para adivinar el tipo. 123 es un número, true es un booleano y Hola mundo es un string. Generalmente no necesitas comillas, pero deberías usarlas si tu string podría ser malinterpretado (p. ej., "true", "1.23").

El ingrediente secreto: Indentación y espacios en blanco

Este es el concepto más importante en YAML. No hay llaves {} ni corchetes [] para mostrar anidación. En su lugar, simplemente indentas. La regla es simple: si una línea está más indentada que la línea anterior, se convierte en un hijo de esa línea.

Combinemos nuestros componentes básicos. Aquí hay un perfil de personaje con una lista de objetos en su inventario.

# Una estructura anidada
personaje:
  nombre: "Gollum"
  alias:
    - "Sméagol"
    - "Mi Precioso"
  posesiones:
    - objeto: "El Anillo Único"
      descripcion: "Un anillo de oro liso, sorprendentemente pesado."
    - objeto: "Un pez"
      descripcion: "¡Jugoso y dulce!"
  es_desdichado: true

Mira la estructura. nombre, alias, posesiones y es_desdichado son todas propiedades de personaje porque están indentadas debajo de él. La secuencia alias es un valor dentro del mapeo personaje. La secuencia posesiones contiene dos objetos de mapeo, cada uno con un objeto y una descripcion.

La cantidad de indentación no importa, siempre que sea consistente dentro del mismo bloque. Dos espacios es el estándar de la comunidad. Pero debes usar espacios, no tabuladores. Usar tabuladores es la forma #1 de meterte en un mundo de sufrimiento invisible.

Trucos avanzados: Anclas, alias y etiquetas

YAML tiene algunas funcionalidades para usuarios avanzados que JSON no tiene, diseñadas para mantener tus archivos DRY (Don't Repeat Yourself - No te repitas).

  • Anclas (&) y Alias (*): Si tienes un trozo de datos que necesitas reutilizar, puedes darle un nombre con un ancla (&nombre_ancla) y luego hacer referencia a él en otro lugar con un alias (*nombre_ancla).

    # Define un perfil de usuario por defecto con un ancla
    usuario_por_defecto: &perfil_usuario_defecto
      tema: "oscuro"
      notificaciones: "activadas"
      permisos: "solo-lectura"
    
    # Ahora crea usuarios específicos que heredan los valores por defecto
    usuarios:
      - nombre: "Alice"
        # Usa un alias para traer el perfil por defecto
        <<: *perfil_usuario_defecto
        # Y sobreescribe una clave específica
        permisos: "admin"
      - nombre: "Bob"
        # Bob obtiene el perfil estándar
        <<: *perfil_usuario_defecto
    

    Aquí, << es una clave de fusión especial. Tanto Alice como Bob obtienen el perfil predeterminado, pero la clave permisos de Alice se sobrescribe. Esto es un salvavidas en configuraciones complejas.

  • Etiquetas (!!): YAML generalmente infiere los tipos, pero puedes ser explícito con las etiquetas. Esto puede ser útil para evitar ambigüedades. Por ejemplo, si quieres el string "12.0" y no el número 12.0.

    version: !!str 12.0 # Forzar a que sea un string
    no_es_un_booleano: !!str "no" # Forzar a que sea un string
    

Historias del mundo real

El Caso del Pipeline Desaparecido

A una ingeniera DevOps junior, llamémosla Chloe, le asignaron la tarea de añadir un nuevo escaneo de seguridad al pipeline de CI/CD de su empresa, definido en un archivo gitlab-ci.yml. Añadió el nuevo job, hizo push de su código y... nada. El pipeline se ejecutó, pero su nuevo job de escaneo no aparecía por ninguna parte. No falló; simplemente se desvaneció. Durante dos horas, Chloe revisó la sintaxis de su script, la configuración del runner y las definiciones de las fases. Finalmente, exasperada, le pidió a un ingeniero senior que le echara un vistazo. Los ojos del dev senior escanearon el archivo durante unos cinco segundos antes de señalar una sola línea. Chloe había indentado su nuevo job con tres espacios en lugar de los dos que se usaban en todo lo demás. El parser de YAML lo vio como un hijo malformado del job anterior, no como un nuevo job de nivel superior, y lo ignoró silenciosamente.

Lección: En YAML, los espacios en blanco son sintaxis. Un solo espacio mal puesto puede cambiar todo el significado de tu archivo. Usa un linter o un editor estructurado que visualice el árbol de datos para pillar estos errores al instante.

La Configuración que se Convirtió en un Bosque

Una pequeña startup gestionaba los entornos de su aplicación (desarrollo, staging, producción) con un único config.yml. Al principio, era simple. Pero a medida que añadían más entornos (prod-us, prod-eu, dev-feature-x), el archivo explotó. Bloques enormes de configuración para URLs de bases de datos, claves de API y feature flags se copiaban y pegaban para cada entorno, con solo cambios menores. El archivo se convirtió en un monstruo de 500 líneas, y cambiar un solo valor compartido, como una configuración de timeout, requería encontrarlo y reemplazarlo en cinco lugares diferentes. Un recién contratado, recién llegado de una empresa más grande, vio esto e introdujo las anclas de YAML. Definió un bloque &default_config con todas las configuraciones comunes. Luego, la configuración de cada entorno simplemente usaba un alias al predeterminado (<<: *default_config) y sobrescribía los pocos valores que eran diferentes. El archivo de 500 líneas se redujo a menos de 100.

Lección: No te repitas. Si te encuentras copiando y pegando grandes bloques dentro de un archivo YAML, es hora de aprender y usar anclas y alias.

El Problema de Noruega

Un desarrollador estaba creando una funcionalidad que permitía a los usuarios seleccionar su país de un menú desplegable. La lista de códigos de país se almacenaba en un archivo YAML simple: supported_countries: [ US, DE, UK, NO ]. Durante las pruebas, los usuarios de Noruega (NO) se quejaron de que no podían registrarse. El desarrollador pasó horas debuggeando el código, rastreando variables, pero no podía ver el problema. El valor NO se estaba pasando correctamente desde el frontend. Finalmente, inspeccionó los datos que se cargaban desde el archivo YAML. El array supported_countries en su programa era ['US', 'DE', 'UK', false]. El parser de YAML, siguiendo una versión antigua de la especificación, había interpretado el NO sin comillas como un valor booleano para 'falso'.

Lección: Ante la duda, ponle comillas a tus strings. Cualquier escalar que pueda parecer un número ("1.0"), un booleano ("yes", "no", "on", "off"), o un valor especial debería llevar comillas explícitamente para evitar una sorpresa al parsear.

Errores y trampas comunes

  • Usar tabuladores en lugar de espacios. Este es el pecado capital de YAML. La especificación prohíbe los tabuladores. Como son invisibles, pueden causar errores de parseo que son desesperantemente difíciles de encontrar. Configura tu editor para que use espacios en los archivos YAML.
  • Indentación inconsistente. Si un elemento de una lista está indentado con dos espacios y el siguiente con cuatro, la vas a pasar mal. La estructura se parseará incorrectamente. Mantén los niveles de indentación consistentes.
  • Olvidar poner comillas en strings ambiguos. El 'Problema de Noruega' es un clásico. Strings como Yes, No, true, false, On, Off serán parseados como booleanos. Números con ceros a la izquierda o caracteres especiales podrían ser parseados incorrectamente. Ante la duda, envuélvelo en "comillas".
  • Confusión con los strings multilínea. Olvidar la diferencia entre | (estilo literal, preserva los saltos de línea) y > (estilo plegado, convierte los saltos de línea en espacios). Esto puede hacer que tu bloque de texto o script de shell cuidadosamente formateado quede destrozado.
  • Valores null inesperados. Una clave sin nada después de los dos puntos (clave: ) es un valor null. A menudo esto es un borrado accidental y puede causar fallos silenciosos si tu código no comprueba si hay null.

Por qué debería estar en tu radar

Si escribes código en 2024, no puedes escapar de YAML. Es el rey indiscutible de la configuración.

  • DevOps e Infraestructura como Código: Kubernetes, Ansible, Docker Compose, GitHub Actions, AWS CloudFormation y un sinnúmero de otras herramientas usan YAML como su lenguaje de definición principal.
  • Configuración de Aplicaciones: Muchos frameworks (como Symfony y Ruby on Rails) y aplicaciones usan YAML para archivos de configuración porque es muy fácil de leer y modificar para los desarrolladores.
  • Generadores de Sitios Estáticos: Herramientas como Jekyll y Hugo usan YAML para el "frontmatter" para definir metadatos para posts y páginas.

Saber YAML no es solo para escribir archivos de configuración. Se trata de entender la estructura de los sistemas con los que trabajas. Ser capaz de detectar un error sutil de indentación o saber cuándo usar un ancla puede ser la diferencia entre un arreglo rápido y un día perdido debuggeando.

Para profundizar

  • YAML Spec 1.2.2: La fuente oficial de la verdad. Es denso, pero es la referencia definitiva.
  • Wikipedia: YAML: Un gran resumen de alto nivel sobre la historia, características y versiones del lenguaje.
  • Learn YAML in Y minutes: Un "cheatsheet" fantástico de una sola página con ejemplos en vivo que cubre el 80% de lo que necesitarás.
  • YAML Lint: Un validador online que es invaluable para encontrar esos molestos errores de sintaxis y entender lo que el parser "ve".
  • GitHub Docs: Workflow syntax for GitHub Actions: Un excelente ejemplo del mundo real de un sistema complejo definido completamente en YAML. Estudiarlo revela muchos patrones comunes.

Teoría lista. Hora de ensuciarse las manos — 100% en tu navegador.

Probar la herramienta: Editor YAML