¿Por qué estamos plantillando YAML? (2019)
Los ingenieros argumentan que el plantillado de YAML para infraestructura y configuraciones de Kubernetes se ha convertido en un antipatrón: archivos declarativos que antes eran simples han acumulado bucles, condicionales y DSLs específicos del proveedor, convirtiéndose en sistemas frágiles de “yaml-como-lenguaje-de-programación” que son difíciles de validar, depurar y asegurar. Muchos prefieren generar JSON/YAML desde lenguajes de programación reales (TypeScript, Python, Ruby) o desde lenguajes de configuración creados a propósito (Jsonnet, CUE, Dhall, Nix), a menudo combinados con herramientas como CDK, Pulumi o Tanka, para que la lógica viva en código probado mientras el clúster sigue recibiendo manifiestos simples. En el fondo hay una preocupación más amplia de que cada nuevo formato de configuración y motor de plantillas repite el mismo error: reinventar un lenguaje restringido en lugar de aprovechar los existentes y el tooling adecuado para tipos, esquemas y composición.
Por qué se usa YAML y luego se le aplican plantillas
- Quienes comentan coinciden en que YAML domina en gran medida por inercia y familiaridad: hay ejemplos y herramientas por todas partes, especialmente en Kubernetes y CI.
- La gente empieza con “solo un YAML simple”, luego añade unas pocas variables, después condicionales/bucles, y termina con un lenguaje de programación de facto.
- Copiar y pegar fragmentos de la documentación y los blogs es una gran razón por la que la gente se aferra al YAML puro/plantillado en lugar de usar herramientas de nivel más alto.
Críticas al propio YAML
- Muchos ven YAML como engañosamente “amigable para humanos”: la indentación es frágil, el contexto se pierde fácilmente en archivos largos y la especificación es compleja.
- El sistema de tipos y las conversiones implícitas (p. ej.
no→ false / problema de “Norway”, diferencias entre 1.1 y 1.2) son quejas recurrentes. - El YAML con plantillas se describe como “programación tipada como cadenas”: difícil de validar, depurar y razonar, con semánticas específicas del proveedor.
- Algunos defienden YAML para configuraciones de pequeña a mediana complejidad y para personas que no programan (p. ej. front-matter, simple docker-compose), especialmente con validación de esquemas y linters.
Plantillas frente a generación con lenguajes reales
- Tendencia fuerte: dejar de inventar DSLs de plantillas a medio hacer; usar un lenguaje real (TypeScript, Python, Ruby, Go, etc.) para construir estructuras de datos y emitir JSON/YAML.
- Beneficios citados: reutilización de bibliotecas y herramientas, verificación de tipos, pruebas unitarias, refactorización más fácil, separación más clara entre “datos tontos” y lógica.
- Contraargumentos:
- Permitir que lenguajes arbitrarios se ejecuten en CI/IaC aumenta la superficie de ataque y la complejidad.
- La configuración debe ser declarativa y restringida; dar poder de Turing completo invita al spaghetti y dificulta las políticas/la validación.
Lenguajes/sistemas alternativos de configuración
- Mencionados con frecuencia: Jsonnet, Dhall, CUE, Nix, Nickel, herramientas basadas en Starlark (ytt, Bazel/Starlark, Kurtosis), CDK8s, AWS CDK, Pulumi, Tanka, Kustomize.
- Las opiniones divergen: a algunos les encantan Jsonnet/CUE/Nix/Dhall por su configuración funcional, total o segura por tipos; otros los encuentran demasiado de nicho, difíciles de aprender o carentes de bibliotecas.
- Varios sugieren “configuración como código con tipos”, más un formato de datos simple y validado como artefacto compilado (a menudo JSON, opcionalmente renderizado a YAML).
Kubernetes, Helm, CI y operadores
- Los charts de Helm se describen ampliamente como dolorosos: sustitución de texto, manejo de indentación, mensajes de error pobres y necesidad de volver a exponer características de Kubernetes mediante
values.yaml. - Algunos prefieren Kustomize o manifiestos sin más; otros argumentan que los operadores o CDKs de nivel superior son una mejor abstracción que seguir añadiendo más plantillado YAML.
- Para CI (GitHub Actions, etc.), muchos recomiendan YAML mínimo que solo haga
execde scripts reales, evitando lógica compleja en archivos de configuración.
Filosofía más profunda de la configuración
- Tema recurrente: “toda configuración deriva hacia la completitud de Turing”.
- El debate se centra en dónde debería vivir la lógica, cuánta potencia debería tener la configuración y cómo mantener los sistemas observables, testeables y mantenibles a medida que crece la complejidad.