• Blog
  • YAML: qué es, para qué sirve y en qué se diferencia de JSON

YAML: qué es, para qué sirve y en qué se diferencia de JSON

16min

En el ámbito del desarrollo de software, la administración de sistemas informáticos y la ingeniería DevOps, el almacenamiento y la estructuración de la configuración representan un pilar crítico. El formato YAML (YAML Ain’t Markup Language) se ha establecido como el estándar preferido para definir parámetros de infraestructura, orquestación de contenedores y automatización de despliegues en la nube. Su arquitectura prioriza la legibilidad directa por parte de los seres humanos sin sacrificar el rigor exigido por las computadoras para el análisis de datos.

A medida que los entornos informáticos han evolucionado hacia arquitecturas orientadas a microservicios e infraestructura como código (IaC), las herramientas modernas requieren formatos de serialización de datos que reduzcan la fricción sintáctica. A lo largo de esta guía técnica profundizaremos en la sintaxis de YAML, sus características distintivas, sus aplicaciones operativas en plataformas como Kubernetes o Ansible, sus diferencias estructurales respecto a JSON y las mejores prácticas de seguridad para su gestión en repositorios de código.

Índice

¿Qué es YAML?

YAML es un formato de serialización de datos altamente legible diseñado de forma específica para la gestión de archivos de configuración y la representación de estructuras de datos complejas. Las siglas responden al acrónimo recursivo YAML Ain’t Markup Language (YAML no es un lenguaje de marcado), una denominación adoptada para enfatizar que su propósito central es la representación de datos puros y no el marcado de documentos con etiquetas de formato web como ocurre con HTML o XML.

Creado en 2001 por Clark Evans, Ingy döt Net y Oren Ben-Kiki, este estándar independiente de cualquier lenguaje de programación se apoya en una sintaxis limpia basada en sangrado por espacios. Su diseño permite definir listas, mapeos clave-valor y valores escalares de manera intuitiva, ofreciendo a desarrolladores y administradores de sistemas un formato de texto plano muy sencillo de editar, auditar en sistemas de control de versiones como Git y mantener a lo largo del tiempo.

Sintaxis del formato YAML

La especificación técnica de este formato establece reglas precisas de estructuración basadas en el uso de espacio en blanco y caracteres delimitadores mínimos.

Indentación mediante espacios y prohibición del uso de tabuladores

El mecanismo fundamental para determinar la jerarquía y el anidamiento de elementos en un archivo de configuración YAML es la indentación mediante espacios en blanco. A diferencia de lenguajes como C, Java o formatos como JSON que utilizan llaves {} para delimitar bloques de código, este formato emplea el sangrado de línea para establecer la relación entre elementos padres e hijos dentro del árbol de datos.

Está estrictamente prohibido utilizar caracteres de tabulación (\t) para realizar la indentación. La especificación técnica exige el uso exclusivo de espacios estándar, ya que los caracteres de tabulación se interpretaban de forma heterogénea según el editor de texto o el sistema operativo del usuario, lo que provocaba errores graves de análisis sintáctico. La convención habitual en la industria es emplear dos espacios por cada nivel de anidamiento.

# Ejemplo de indentación correcta con espacios (2 espacios por nivel)
servidor:
  red:
    puerto: 8080
    protocolo: tcp

Estructura de pares clave-valor y representación de listas y secuencias

La unidad básica de organización de datos es la asociación clave-valor (mapeo o diccionario). Una clave se define mediante una cadena de texto seguida inmediatamente por dos puntos y un espacio en blanco (clave: valor). Omitir el espacio posterior a los dos puntos constituye un error sintáctico habitual que impide al intérprete identificar el límite de la clave.

Las listas o secuencias ordenadas de elementos se representan colocando un guion seguido de un espacio (- ) al comienzo de cada elemento de la colección. Es posible combinar mapeos y listas de forma indefinida, permitiendo crear estructuras complejas como colecciones de objetos o listas anidadas con una claridad visual óptima.

# Mapeo con secuencias anidadas
aplicacion:
  nombre: servicio-autenticacion
  instancias: 3
  dependencias:
    - base-datos-main
    - servidor-cache-redis

Tratamiento de cadenas multilínea con los operadores literal (|) y plegado («>»)

Gestión de bloques de texto que ocupan múltiples líneas mediante dos operadores específicos colocados tras la clave, el operador literal (|) y el operador plegado («>»). El operador literal conserva de forma exacta todos los saltos de línea y espacios incluidos en el bloque de texto, resultando idóneo para incluir scripts de consola, certificados digitales o claves criptográficas dentro del archivo.

Por su parte, el operador plegado («>») convierte los saltos de línea individuales dentro del bloque de texto en espacios simples, unificando el párrafo en una sola cadena de texto al ser procesado por el analizador, excepto cuando se detectan líneas en blanco consecutivas. Estos operadores simplifican la inclusión de textos extensos sin recurrir a caracteres de escape de salto de línea (\n).

# Bloque literal (preserva saltos de línea exactos)
script_inicio: |
  #!/bin/bash
  echo 'Iniciando servicio...'
  python3 app.py

# Bloque plegado (unifica líneas en un solo párrafo)
descripcion: '>'
  Este es un texto extenso que se escribirá en múltiples
  líneas en el archivo fuente para facilitar su lectura,
  pero que el analizador procesará como una única línea continua.

Características principales de YAML

Las decisiones de diseño detrás de este estándar le otorgan capacidades técnicas avanzadas para la modelación de datos en sistemas informáticos.

Legibilidad humana optimizada basada en una sintaxis limpia

El pilar central del diseño de YAML es la maximización de la claridad visual. Al eliminar caracteres delimitadores masivos como llaves, corchetes o comillas obligatorias alrededor de las cadenas de texto simples, la densidad de puntuación del archivo se reduce a niveles mínimos, destacando únicamente los nombres de los parámetros y sus valores asignados.

Esta sobriedad sintáctica reduce la fatiga visual durante las revisiones de código y minimiza los errores cometidos por desarrolladores y operadores al redactar configuraciones complejas. La lectura de un archivo se aproxima a la de un documento estructurado en texto plano o un esquema conceptual.

Soporte nativo para la inclusión de comentarios en el código

A diferencia del estándar JSON, este formato admite la inserción nativa de comentarios descriptivos mediante el carácter almohadilla (#). Todo el texto ubicado a la derecha del símbolo # en una línea es ignorado por el analizador sintáctico durante el procesamiento del archivo.

La capacidad de añadir comentarios es fundamental en la administración de sistemas y la infraestructura como código. Permite a los ingenieros documentar el propósito de un parámetro específico, advertir sobre rangos de valores válidos o dejar referencias sobre decisiones de arquitectura directamente al lado de la variable correspondiente.

# Configuración del servidor de producción
servidor:
max_conexiones: 500 # Ajustado tras pruebas de carga
timeout: 30 # Valor expresado en segundos

Reutilización de elementos mediante el uso de anclas («&») y alias (*)

Este estándar incluye un mecanismo interno para evitar la duplicación de bloques de configuración mediante el uso de anclas ('&') y alias (*). Al colocar un ancla delante de una estructura de datos, se le asigna un identificador reutilizable que puede ser invocado en cualquier otra sección del documento mediante su correspondiente alias.

Esta funcionalidad se complementa con la clave de combinación ('<<:' *alias), que permite heredar la totalidad de los pares clave-valor de un bloque etiquetado y sobrescribir únicamente los parámetros específicos que cambian en el nuevo bloque, aplicando el principio DRY (Don't Repeat Yourself) dentro de los archivos de configuración.
# Definición de ancla para la plantilla base
configuracion_base: '&'base 
puerto: 8080 
ambiente: produccion 
logging: activo 

# Reutilización mediante alias y sobrescritura de parámetros servicio_web: 
'<<': *base 
nombre: API-Gateway # Inyecta puerto, ambiente y logging, añadiendo el nombre

Posibilidad de incluir múltiples documentos en un único archivo mediante tres guiones

La especificación permite empaquetar varios documentos independientes dentro de un mismo archivo físico de texto. Cada documento se delimita explícitamente mediante una línea compuesta por tres guiones consecutivos (—) en su inicio, pudiendo indicar el cierre opcional del documento mediante tres puntos consecutivos (…).

Esta característica resulta especialmente útil en herramientas como Kubernetes, donde se pueden declarar múltiples recursos de red, almacenamiento y cómputo dentro de un único archivo manifiesto, procesando cada sección de forma independiente durante el despliegue de la infraestructura.

---
# Primer documento: Definición del servicio
tipo: Servicio
nombre: auth-service ---
# Segundo documento: Definición del despliegue
tipo: Despliegue
nombre: auth-deployment 
...

Tipado de datos implícito con opción de conversión explícita

El analizador de este formato infiere automáticamente el tipo de dato de cada valor asignado sin requerir anotaciones explícitas. Un valor sin comillas compuesto por dígitos se interpreta como número entero o flotante, los valores true o false se convierten en booleanos, y los textos generales se procesan como cadenas de caracteres.

Cuando se requiere forzar un tipo de dato específico para evitar ambigüedades, la sintaxis permite la conversión explícita (casting) utilizando el doble signo de exclamación (!!) seguido del tipo deseado (!!str, !!int, !!float, !!bool).

# Tipado implícito
puerto: 8080          # Inferred as Integer
activo: true          # Inferred as Boolean
codigo_postal: '28001' # Forzado a cadena mediante comillas

# Tipado explícito mediante etiquetas
version: !!str 1.2    # Forzado a tipo cadena de texto a pesar de ser numérico

Compatibilidad total como superserie del formato JSON

Formalmente, las especificaciones modernas de YAML (versión 1.2) constituyen un superserie directo de JSON. Esto significa que cualquier archivo JSON válido es de forma simultánea un documento sintácticamente correcto en este formato.

El estándar soporta la denominada sintaxis de flujo (flow style), la cual permite escribir mapas mediante llaves {} y secuencias mediante corchetes [] dentro del propio documento, facilitando la integración de estructuras densas o la migración gradual de sistemas basados en JSON.

Representación flexible de escalares, mapeos y secuencias complejas

El modelo de datos abstracto del formato se compone de tres nodos universales: escalares (cadenas, números, booleanos, nulos), mapeos (asociaciones clave-valor) y secuencias (listas ordenadas). La flexibilidad del sistema permite combinar estos tres tipos primitivos sin restricciones de profundidad.

Las claves de los mapeos no se limitan a cadenas de texto simples; mediante la sintaxis de clave explícita representada por el símbolo de interrogación (?), se pueden utilizar estructuras complejas o secuencias completas como claves dentro de un diccionario.

¿Para qué sirve YAML?

La adopción masiva de este estándar lo ha posicionado como la herramienta universal para la definición declarativa de sistemas en múltiples áreas de la informática.

Orquestación de contenedores y despliegues en Kubernetes y Docker

En el paradigma de la contenedorización de aplicaciones, YAML se utiliza para definir el estado deseado de los servicios. En herramientas como Docker Compose, un archivo docker-compose.yml especifica las imágenes de contenedor, los volúmenes de almacenamiento, las variables de entorno y las conexiones de red necesarias para ejecutar una pila de software completa.

En la plataforma de orquestación Kubernetes, los manifiestos escritos en este formato describen objetos como Pods, Deployments, Services, ConfigMaps e Ingress. El motor de Kubernetes analiza estos archivos para desplegar, escalar y autorreparar la infraestructura en el clúster de forma automatizada.

# Manifiesto básico de un Pod en Kubernetes
apiVersion: v1
kind: Pod
metadata:
  name: servidor-web
spec:
  containers:
    - name: nginx
      image: nginx:1.25
      ports:
        - containerPort: 80

Configuración de pipelines de integración y despliegue continuos en CI/CD

Las plataformas modernas de Integración Continua y Despliegue Continuo (CI/CD) —tales como GitHub Actions, GitLab CI/CD, Azure DevOps o Bitbucket Pipelines— emplean archivos de configuración almacenados junto al código fuente de la aplicación para automatizar los flujos de trabajo de ingeniería.

Estos archivos especifican las etapas de compilación, la ejecución de baterías de pruebas unitarias, el análisis estático de código y el envío final de las imágenes construidas hacia los entornos de producción, permitiendo versionar la propia tubería de integración en el sistema Git (Pipeline as Code).

# Ejemplo de workflow en GitHub Actions
name: Integracion-Continua
on: [push]
jobs:
  pruebas:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Ejecutar Test Unitarios
        run: npm test

Automatización de infraestructura como código con Ansible y Helm

En la gestión de configuraciones masivas y la infraestructura como código, herramientas como Ansible utilizan cuadernos de viaje (playbooks) redactados en este formato. Un playbook de Ansible lista de forma secuencial las tareas declarativas que deben ejecutarse en un grupo de servidores remotos sin necesidad de instalar agentes residentes en los nodos de destino.

Por su parte, el gestor de paquetes de Kubernetes, Helm, utiliza archivos de valores (values.yaml) para parametrizar plantillas de manifiestos, permitiendo adaptar el despliegue de aplicaciones complejas a diferentes entornos (desarrollo, pruebas, producción) simplemente modificando un único archivo de configuración.

Documentación y definición de APIs RESTful bajo la especificación OpenAPI

La especificación OpenAPI (anteriormente denominada Swagger) emplea YAML como el formato preferido para describir, documentar y diseñar interfaces de programación de aplicaciones (APIs RESTful).

Un único archivo especifica los puntos de entrada (endpoints), los métodos HTTP admitidos, los esquemas de petición y respuesta, los parámetros de consulta y las reglas de autenticación del servicio. La legibilidad del formato permite a los ingenieros diseñar la arquitectura de la API de forma colaborativa antes de escribir una sola línea de código backend.

# Fragmento de especificación OpenAPI
openapi: 3.0.0
info:
  title: API de Usuarios
  version: 1.0.0
paths:
  /usuarios:
    get:
      summary: Obtener lista de usuarios
      responses:
        '200':
          description: Operación exitosa

Definición de parámetros de configuración global en aplicaciones y servidores

Múltiples marcos de desarrollo y servidores de aplicaciones utilizan este estándar para gestionar sus parámetros de ejecución internos. Frameworks populares como Spring Boot (application.yml), Symfony, Ruby on Rails o Flutter (pubspec.yaml) organizan variables de entorno, credenciales de conexión y módulos activos mediante estos archivos.

A nivel de administración de sistemas, herramientas de red como Netplan en distribuciones Linux Ubuntu, el servidor de métricas Prometheus (prometheus.yml) o el proxy inverso Traefik emplean este formato para definir la topología de red y los servicios de enrutamiento del servidor.

Intercambio y almacenamiento de datos de configuración de forma estructurada

El formato se utiliza de forma recurrente para almacenar metadatos estáticos en generadores de páginas web, permitiendo definir el título, la fecha, los autores y las etiquetas de una entrada de blog sin mezclar los metadatos con el cuerpo del texto.

Asimismo, es ampliamente utilizado para almacenar diccionarios de internacionalización y traducción (i18n) en aplicaciones web, donde la estructura jerárquica facilita la organización de cadenas de texto traducidas por módulos o secciones de la interfaz.

Gestión de reglas de seguridad y políticas de acceso en entornos Cloud Native

En arquitecturas de seguridad en la nube definen sus reglas de validación y restricciones de cumplimiento normativo en archivos de configuración planos.

De igual forma, las políticas de Control de Acceso Basado en Roles (RBAC) en Kubernetes se redactan mediante manifiestos que especifican los permisos exactos (lectura, escritura, borrado) que un usuario o servicio posee sobre los recursos del clúster, facilitando la auditoría de seguridad del sistema.

Diferencias entre YAML y JSON

A pesar de sus similitudes funcionales como formatos de serialización de datos planos, ambas tecnologías presentan diferencias estructurales clave en su sintaxis y rendimiento.

Sintaxis basada en sangrado por espacios frente al uso de llaves y corchetes

La disparidad sintáctica más evidente radica en la delimitación de bloques. Mientras que YAML utiliza el sangrado por espacios para indicar la pertenencia de un elemento a una jerarquía concreta, JSON exige el uso explícito de llaves {} para definir objetos y corchetes [] para definir arreglos.

JSON requiere que las cadenas de texto utilizadas como claves y valores estén obligatoriamente entrecomilladas con comillas dobles, mientras que el formato alternativo permite omitir las comillas en la mayoría de las cadenas simples, reduciendo la sobrecarga de caracteres en pantalla.

Admisión nativa de comentarios frente al formato estricto de JSON

La especificación oficial de JSON prohíbe de forma estricta la inclusión de comentarios dentro del documento. Si un analizador JSON encuentra un carácter de comentario (// o /* */), interrumpirá el procesamiento devolviendo un error sintáctico.

En contraste, la inclusión de comentarios con # en archivos de configuración es una característica nativa y promovida por el estándar, lo que convierte a este último en la opción adecuada para archivos de parámetros editados por seres humanos.

Soporte para punteros internos y referencias frente a la duplicación de bloques

JSON no dispone de ningún mecanismo nativo para hacer referencia a otros bloques de datos dentro del mismo documento. Si un objeto debe repetirse en diez secciones diferentes del archivo, la información debe duplicarse completamente de forma redundante.

El uso de anclas («&») y alias (*) permite definir estructuras de datos una sola vez y referenciarlas en cualquier punto del archivo, manteniendo el principio de no duplicación de código y reduciendo el tamaño de archivos de configuración masivos.

Legibilidad y simplicidad visual para el usuario frente a la densidad de sintaxis

La ausencia de comas al final de cada línea, la omisión de comillas en claves y la falta de paréntesis de cierre otorgan a los archivos de configuración una apariencia limpia. Un error común en JSON, como olvidar una coma delimitadora al añadir un nuevo elemento a una lista, no existe en la sintaxis alternativa.

Sin embargo, esta simplicidad visual implica que un error en el número de espacios de una línea puede alterar silenciosamente la jerarquía del árbol de datos sin generar un fallo de sintaxis evidente a simple vista, requiriendo el uso de editores de texto con marcado de guías de indentación.

Rendimiento y velocidad de análisis del parser al procesar los datos

Desde el punto de vista del rendimiento computacional, JSON es significativamente superior. La gramática de JSON es extremadamente sencilla y determinista, lo que permite a los analizadores sintácticos (parsers) convertir texto plano en objetos en memoria utilizando una fracción del tiempo de CPU y memoria RAM que requiere un analizador completo.

La complejidad gramatical de la alternativa (que incluye soporte para múltiples documentos, anclas, mapeos complejos y resolución de tipos implícitos) exige un esfuerzo computacional elevado. Por este motivo, JSON sigue siendo el estándar indiscutible para el tráfico de datos masivo de alta velocidad entre aplicaciones web (APIs), mientras que el formato competidor domina en los archivos de configuración editados manualmente.

Criterio Técnico Formato YAML Formato JSON
Delimitación estructural Indentación mediante espacios en blanco. Llaves {} y corchetes [] explícitos.
Soporte de comentarios Admitido de forma nativa con el carácter #. No admitido en la especificación estándar.
Punteros y referencias Soporte nativo mediante anclas («&») y alias (*). No admitido de forma nativa.
Legibilidad humana Máxima, limpia de caracteres de puntuación. Media, densa en caracteres delimitadores.
Velocidad de análisis (Parsing) Menor velocidad por complejidad gramatical. Extrema velocidad de procesamiento en la CPU.
Uso predeterminado Archivos de configuración e infraestructura. Intercambio de datos en APIs REST y almacenamiento.

Seguridad y buenas prácticas en la gestión de un archivo YAML

Dado que estos archivos controlan el comportamiento de servidores, redes y pipelines de despliegue, la aplicación de medidas de seguridad y estándares de calidad es imperativa.

Prevención de ejecución remota de código mediante el uso de funciones de carga segura

Uno de los riesgos de seguridad históricos más graves en el procesamiento de estos archivos es la vulnerabilidad de Deserialización Insegura. Analizadores antiguos en lenguajes como Python (PyYAML), Ruby o Java permitían ejecutar código fuente arbitrario en el servidor si el archivo procesado contenía etiquetas de conversión avanzadas como !!python/object/apply.

Para prevenir ataques de Ejecución Remota de Código (RCE), es obligatorio sustituir cualquier llamada a métodos de carga dinámica genéricos (como yaml.load()) por funciones de carga segura restringidas (como yaml.safe_load() en Python o analizadores de tipo estricto). La carga segura deshabilita la instanciación automática de objetos de código arbitrario, limitando el parseo exclusivamente a tipos primitivos de datos.

import yaml

# PRÁCTICA INSEGURA (Vulnerable a Ejecución Remota de Código)
# datos = yaml.load(contenido_archivo, Loader=yaml.Loader)

# BUENA PRÁCTICA (Carga segura restringida a tipos primitivos)
datos = yaml.safe_load(contenido_archivo)

Implementación de linters y validación de esquemas en el flujo de desarrollo

Para detectar errores sintácticos y desviaciones de estilo antes de enviar cambios al repositorio de código, los equipos de desarrollo deben integrar herramientas de análisis estático (linters) como yamllint dentro de sus entornos de edición local y en las etapas de pruebas de sus tuberías de integración continua.

Adicionalmente, se deben validar los documentos contra esquemas formales que verifiquen que la estructura y los rangos de valores cumplen con los requisitos del sistema. En el ecosistema de Kubernetes, herramientas como kubeval, kube-score o datree analizan los manifiestos contra los esquemas oficiales de la API para denegar despliegues con configuraciones incorrectas o inseguras.

# Instalación y ejecución de validación sintáctica estricta mediante yamllint
pip install yamllint
yamllint archivo_configuracion.yaml

Prevención de ambigüedades de tipado mediante la acotación de cadenas y booleanos

Uno de los problemas de diseño más conocidos en la versión 1.1 del estándar se denomina «El problema de Noruega» (The Norway Problem). En dicha versión, el código de país de dos letras para Noruega (NO) se interpretaba automáticamente por el analizador como el valor booleano false al no llevar comillas, generando errores lógicos complejos en bases de datos o configuraciones de idioma.

Para evitar ambigüedades de tipado donde cadenas como NO, OFF, YES, ON o versiones numéricas como 1.0 sean convertidas involuntariamente a booleanos o números flotantes, se establece como buena práctica entrecomillar siempre cualquier valor de texto plano que pueda ser malinterpretado por la especificación del analizador.

# Error potencial: 'NO' puede ser interpretado como el booleano 'false'
pais_codigo: NO

# Buena práctica: El uso de comillas garantiza que se procese como cadena
pais_codigo: 'NO'
version_app: '1.0'

Gestión segura de secretos y credenciales sin incluir texto plano en el repositorio

Almacenar contraseñas, claves privadas, tokens de API o cadenas de conexión a bases de datos en texto plano dentro de archivos de configuración versionados en Git representa una brecha de seguridad crítica. Los repositorios de código deben mantenerse libres de secretos en texto claro.

Para gestionar credenciales de forma segura dentro de archivos de configuración se deben emplear herramientas de cifrado a nivel de archivo como SOPS (Secrets OPerationS), Ansible Vault o Sealed Secrets para Kubernetes. Estas utilidades permiten cifrar exclusivamente los valores sensibles del documento manteniendo las claves visibles para Git, o bien sustituir los valores en tiempo de despliegue mediante inyección de variables de entorno desde un almacén de secretos dedicado.

Consistencia en la indentación y establecimiento de guías de estilo para el equipo

Dado que un cambio involuntario en la cantidad de espacios de una línea puede reorganizar la estructura jerárquica del archivo sin generar un error sintáctico directo, los equipos de ingeniería deben establecer una guía de estilo unificada.

Se recomienda configurar herramientas de formateo automático (como Prettier o extensiones del editor IDE) para aplicar reglas homogéneas: fijar el sangrado en dos espacios exactos, prohibir el uso de espacios al final de las líneas (trailing spaces), exigir una línea en blanco al final del archivo y estandarizar la longitud máxima de línea para mantener la coherencia del código en todo el proyecto.

Productos relacionados: