Todos amamos a Ansible, pero Ansible es YAML. Existen muchos formatos para los archivos de configuración: listas de valores, pares de parámetros-valores, archivos INI, YAML, JSON, XML y muchos otros. Sin embargo, por varios motivos, de todos estos, YAML a menudo se considera particularmente difícil. En particular, a pesar de su minimalismo refrescante y sus impresionantes capacidades para trabajar con valores jerárquicos, la sintaxis de YAML puede ser molesta con su enfoque de sangría similar a Python.

Si YAML te enfurece, puedes, ¡y debes! - Siga los siguientes 10 pasos para reducir su irritación a un nivel aceptable y ame YAML. Como debería estar en esta lista, nuestros diez consejos estarán numerados desde cero, agregamos meditación y prácticas espirituales a voluntad ;-)
0. Haz que tu editor funcione
No importa qué tipo de editor de texto tenga, para él, seguro, hay al menos un complemento para trabajar con YAML. Si no tiene uno, búsquelo e instálelo de inmediato. El tiempo dedicado a la búsqueda y configuración dará sus frutos muchas veces cada vez que tenga que editar YAML.
Por ejemplo, el editor
Atom admite YAML de forma predeterminada, pero GNU Emacs tendrá que instalar paquetes adicionales, por ejemplo,
yaml-mode .
Emacs en modo YAML y espacios de visualización.Si su editor favorito no tiene el modo YAML, algunos de los problemas se pueden resolver trabajando con la configuración. Por ejemplo, el editor de texto Gedit estándar para GNOME no tiene modo YAML, pero por defecto resalta la sintaxis YAML y le permite configurar la sangría:
Configuración de sangría de Gedit.Y el complemento de espacios de
dibujo para Gedit muestra los espacios como puntos, eliminando ambigüedades con niveles de sangría.
En otras palabras, tómese el tiempo para estudiar a su editor favorito. Descubra qué ofrece él o su comunidad de desarrollo para trabajar con YAML y utilice estas funciones. Definitivamente no te arrepentirás.
1. Use un linter (linter)
Idealmente, los lenguajes de programación y marcado utilizan una sintaxis predecible. Las computadoras hacen un buen trabajo de previsibilidad, así que en 1978
apareció el concepto de
linter . Si durante 40 años de su existencia te pasó de largo y todavía no usas el YAML-linter, entonces es hora de probar yamllint.
Puede instalar
yamllint utilizando el administrador de paquetes estándar de Linux. Por ejemplo, en
Red Hat Enterprise Linux 8 o
Fedora, esto se hace así:
$ sudo dnf install yamllint
Luego simplemente ejecuta yamllint, pasándole el archivo YAML para su verificación. Esto es lo que parece si le pasa un archivo de error a la interfaz:
$ yamllint errorprone.yaml errorprone.yaml 23:10 error syntax error: mapping values are not allowed here 23:11 error trailing spaces (trailing-spaces)
Los números a la izquierda no son el tiempo, sino las coordenadas del error: número de fila y columna. La descripción del error puede no decirle nada, pero usted sabe exactamente dónde está. Solo mire este lugar en el código y, muy probablemente, todo se aclarará.
Cuando yamllint no encuentra errores en el archivo, no se muestra nada. Si tiene miedo de ese silencio y desea un poco más de comentarios, puede iniciar la interfaz con el comando de eco condicional a través del doble ampersand (&&), de esta manera:
$ yamllint perfect.yaml && echo "OK" OK
En POSIX, se activa un doble ampersand si y solo si el comando anterior devuelve 0. Y yamllint solo devuelve el número de errores encontrados, por lo que toda esta construcción condicional funciona.
2. Escribe en Python, no en YAML
Si YAML realmente te molesta, simplemente no escribas en él, literalmente. Sucede que YAML es el único formato que la aplicación percibe. Pero en este caso, no es necesario crear un archivo YAML. Escribe lo que quieras y luego convierte. Por ejemplo, para Python hay una gran biblioteca
pyyaml y dos métodos de conversión completos: autoconversión y conversión basada en script.
Autoconversión
En este caso, el archivo de datos también es un script de Python que genera YAML. Este método es el más adecuado para pequeños conjuntos de datos. Simplemente escriba datos JSON en una variable de Python, agregue el prefijo con la directiva de importación y agregue tres líneas al final del archivo para implementar la salida.
#!/usr/bin/python3 import yaml d={ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } } f=open('output.yaml','w') f.write(yaml.dump(d)) f.close
Ahora ejecute este archivo en Python y el archivo de salida es output.yaml:
$ python3 ./example.json $ cat output.yaml glossary: GlossDiv: GlossList: GlossEntry: Abbrev: ISO 8879:1986 Acronym: SGML GlossDef: GlossSeeAlso: [GML, XML] para: A meta-markup language, used to create markup languages such as DocBook. GlossSee: markup GlossTerm: Standard Generalized Markup Language ID: SGML SortAs: SGML title: S title: example glossary
Esto es absolutamente correcto YAML, pero yamllint le advertirá que no comienza con ---. Bueno, esto se puede arreglar fácilmente manualmente o modificar ligeramente Python-script.
Convertir mediante scripts
En este caso, primero escribimos en JSON y luego ejecutamos el convertidor en forma de un script de Python separado, que produce YAML en la salida. En comparación con el anterior, este método se escala mejor porque la conversión está separada por datos.
Primero, cree el archivo JSON example.json, por ejemplo, puede llevarlo a
json.org :
{ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } }
Luego cree un convertidor de script simple y guárdelo con el nombre json2yaml.py. Este script importa ambos módulos: YAML y JSON Python, y también descarga el archivo JSON especificado por el usuario, realiza la conversión y escribe datos en el archivo output.yaml.
#!/usr/bin/python3 import yaml import sys import json OUT=open('output.yaml','w') IN=open(sys.argv[1], 'r') JSON = json.load(IN) IN.close() yaml.dump(JSON, OUT) OUT.close()
Guarde este script en la ruta del sistema y ejecútelo según sea necesario:
$ ~/bin/json2yaml.py example.json
3. Analiza mucho y con frecuencia
A veces es útil mirar el problema desde un ángulo diferente. Si le resulta difícil imaginar las relaciones entre los datos en YAML, puede transformarlos temporalmente en algo más familiar.
Por ejemplo, si se siente cómodo trabajando con listas de diccionarios o JSON, entonces YAML se puede convertir a JSON con solo dos comandos en el shell interactivo de Python. Supongamos que tiene un archivo YAML mydata.yaml, así es como se vería:
$ python3 >>> f=open('mydata.yaml','r') >>> yaml.load(f) {'document': 34843, 'date': datetime.date(2019, 5, 23), 'bill-to': {'given': 'Seth', 'family': 'Kenlon', 'address': {'street': '51b Mornington Road\n', 'city': 'Brooklyn', 'state': 'Wellington', 'postal': 6021, 'country': 'NZ'}}, 'words': 938, 'comments': 'Good article. Could be better.'}
Se pueden encontrar muchos otros ejemplos sobre este tema. Además, hay muchos convertidores en línea y analizadores locales. Por lo tanto, no dude en volver a formatear los datos cuando vea en ellos solo un hash incomprensible.
4. Leer especificaciones
Volviendo a YAML después de un largo descanso, es útil ir a
yaml.org y volver a leer las especificaciones. Si tiene dificultades con YAML, pero sus manos no han alcanzado la especificación, entonces es hora de corregir esta situación. Las especificaciones son sorprendentemente fáciles de escribir, y los requisitos de sintaxis se ilustran con una gran cantidad de ejemplos en el
Capítulo 6 .
5. Pseudoconfigs
Al escribir un libro o artículo, siempre es útil esbozar primero un plan preliminar, al menos en forma de una tabla de contenido. Así es con YAML. Lo más probable es que te imagines qué datos necesitas escribir en el archivo YAML, pero realmente no entiendes cómo relacionarlos entre sí. Por lo tanto, antes de esculpir YAML, dibuje una pseudoconfiguración.
La pseudoconfiguración es similar al pseudocódigo, donde no tiene que preocuparse por la estructura o la sangría, las relaciones padre-hijo, la herencia y el anidamiento. Entonces está aquí: dibuja iteraciones de datos a medida que surgen en su cabeza.
Un programador de listado de pseudoconfiguración (Martin y Tabitha) y sus habilidades (lenguajes de programación: Python, Perl, Pascal y Lisp, Fortran, Erlang, respectivamente).Después de dibujar una pseudoconfiguración en una hoja de papel, analícela cuidadosamente y, si todo está en orden, formateela como un archivo YAML válido.
6. La pestaña o dilema dilema
Tienes que resolver el dilema
"pestañas o espacios"? . No en un sentido global, sino solo a nivel de su organización, o al menos un proyecto. No importa si se utiliza el procesamiento posterior mediante el script sed, la configuración de editores de texto en las máquinas de los programadores o la recepción general de recibos para el estricto cumplimiento de las instrucciones de la lista bajo amenaza de despido, pero todos los miembros de su equipo que de alguna manera se relacionen con YAML deben Use solo espacios (como lo requiere la especificación YAML).
En cualquier editor de texto normal, puede establecer pestañas de Autocorrección en un número específico de espacios, por lo que no puede temer los disturbios de
Tabulación .
Como todos los que odian a YAML son conscientes, la diferencia entre pestañas y espacios no es visible en la pantalla. Y cuando algo no es visible, esto generalmente se recuerda al final, después de que se ha ordenado, verificado y eliminado todos los demás problemas posibles. La hora de tiempo que se pierde para buscar una curva de tabulación o un bloque de espacios simplemente grita que necesita crear urgentemente una política para usar uno u otro, y luego implementar una verificación concreta reforzada de su cumplimiento (por ejemplo, a través de un gancho Git para correr forzado a través de la interfaz).
7. Mejor menos es mejor (o más es menos)
A algunas personas les gusta escribir en YAML porque enfatiza la estructura. Al mismo tiempo, utilizan activamente la sangría para resaltar bloques de datos. Este es un tipo de estafa para simular lenguajes de marcado que usan delimitadores explícitos.
Aquí hay un ejemplo de tal estructura de la
documentación de Ansible :
# Employee records - martin: name: Martin D'vloper job: Developer skills: - python - perl - pascal - tabitha: name: Tabitha Bitumen job: Developer skills: - lisp - fortran - erlang
Para algunos, esta opción ayuda a descomponer la estructura YAML en la cabeza; por el contrario, molesta a otros con muchas sangrías que son innecesarias, en su opinión.
Pero si usted es el propietario de un documento YAML y es responsable de su mantenimiento, entonces
usted y solo usted deben determinar cómo usar la sangría. Si le molesta una sangría grande, manténgala al mínimo posible de acuerdo con la especificación YAML. Por ejemplo, el archivo anterior de la documentación de Ansible se puede reescribir sin ninguna pérdida como esta:
--- - martin: name: Martin D'vloper job: Developer skills: - python - perl - pascal - tabitha: name: Tabitha Bitumen job: Developer skills: - lisp - fortran - erlang
8. Use espacios en blanco
Si repite constantemente los mismos errores al completar el archivo YAML, tiene sentido insertar una plantilla en blanco como comentario. Luego, la próxima vez será posible simplemente copiar esta pieza de trabajo e ingresar datos reales allí, por ejemplo:
--- # - <common name>: # name: Given Surname # job: JOB # skills: # - LANG - martin: name: Martin D'vloper job: Developer skills: - python - perl - pascal - tabitha: name: Tabitha Bitumen job: Developer skills: - lisp - fortran - erlang
9. Usa algo más
Si la aplicación no lo detiene en un dominio absoluto, entonces quizás valga la pena cambiar YAML a otro formato. Con el tiempo, los archivos de configuración pueden superarse y luego es mejor convertirlos en scripts simples en Lua o Python.
YAML es una gran cosa que muchas personas adoran por su minimalismo y simplicidad, pero esto está lejos de ser la única herramienta en su arsenal. Entonces a veces puedes rechazarlo. Para YAML es fácil encontrar bibliotecas de análisis, por lo que si ofrece opciones de migración convenientes, sus usuarios sobrevivirán a esta falla de manera relativamente sencilla.
Si no puede prescindir de YAML, ¡tome estos 10 consejos en servicio y elimine su aversión a YAML de una vez por todas!