A todos amamos Ansible, pero Ansible é YAML. Hai moitos formatos para os ficheiros de configuración: listas de valores, pares parámetro-valor, ficheiros INI, YAML, JSON, XML e moitos outros. Non obstante, por varias razóns de todas elas, YAML adoita considerarse particularmente difícil. En particular, a pesar do seu minimalismo refrescante e das súas impresionantes capacidades para traballar con valores xerárquicos, a sintaxe YAML pode resultar molesta co seu enfoque de sangría similar a Python.
Se YAML te cabrea, podes e deberías! – toma os seguintes 10 pasos para reducir a túa frustración a un nivel aceptable e namórate de YAML. Como corresponde a esta lista, os nosos dez consellos estarán numerados desde cero, engadiremos meditación e prácticas espirituais a vontade 😉
0. Fai que o teu editor funcione
Non importa o editor de texto que teñas, probablemente haxa polo menos un complemento para traballar con YAML. Se non tes un, busca e instálao inmediatamente. O tempo que dediques á procura e á configuración dará vantaxes moitas veces cada vez que teñas que editar YAML.
Por exemplo, editor
Emacs en modo YAML e mostrando espazos.
Se o teu editor favorito non ten un modo YAML, algúns dos problemas pódense resolver traballando coa configuración. Por exemplo, o editor de texto estándar de GNOME Gedit non ten un modo YAML, pero por defecto destaca a sintaxe YAML e permíteche configurar o traballo con sangrías:
Establecer sangrías en Gedit.
Un complemento
Noutras palabras, pase tempo aprendendo sobre o teu editor favorito. Descubra o que el ou a súa comunidade de desenvolvemento teñen para ofrecer para traballar con YAML e utiliza esas funcións. Seguro que non te arrepentirás.
1. Usa un linter
Idealmente, as linguaxes de programación e as linguaxes de marcado usan unha sintaxe previsible. Os ordenadores son bos en previsibilidade, polo que o concepto de
Instala
$ sudo dnf install yamllint
Entón simplemente executa yamllint, pasándolle o ficheiro YAML para comprobar. Isto é o que parece se pasas un ficheiro cun erro ao linter:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
Os números da esquerda non son a hora, senón as coordenadas do erro: número de fila e columna. A descrición do erro pode non dicirche nada, pero sabes exactamente onde está. Basta con mirar este lugar no código, e moi probablemente todo quedará claro.
Cando yamllint non atopa erros nun ficheiro, non se imprime nada na pantalla. Se tal silencio te asusta e queres un pouco máis de comentarios, podes executar o linter co comando de eco condicional mediante un dobre e (&&), así:
$ yamllint perfect.yaml && echo "OK"
OK
En POSIX, un dobre ampersand dispara se e só se o comando anterior devolve 0. E yamllint só devolve o número de erros atopados, polo que funciona toda esta construción condicional.
2. Escribe en Python, non en YAML
Se YAML realmente te cabrea, simplemente non escribas nel, literalmente. Ocorre que YAML é o único formato que entende a aplicación. Pero mesmo neste caso, non é necesario crear un ficheiro YAML. Escribe o que che gusta e despois convérteo. Por exemplo, hai unha gran biblioteca para Python
Autoconversión
Neste caso, o ficheiro de datos tamén é un script de Python que xera YAML. Este método é o máis adecuado para pequenos conxuntos de datos. Só tes que escribir os datos JSON nunha variable de Python, prefacelo cunha directiva de importación e, ao final do ficheiro, engade tres liñas para implementar a saída.
#!/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
Agora executamos este ficheiro en Python e obtemos o ficheiro 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
Este YAML é perfectamente válido, pero yamllint avisará de que non comeza por -. Ben, isto pódese corrixir facilmente manualmente ou modificar lixeiramente no script de Python.
Conversión mediante scripts
Neste caso, primeiro escribimos en JSON e despois executamos o conversor como un script Python separado, que produce YAML como saída. En comparación co método anterior, este método escala mellor, xa que a conversión está separada dos datos.
Primeiro, imos crear un ficheiro JSON example.json, por exemplo, podes tomalo de
{
"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"
}
}
}
}
}
A continuación, crearemos un script de conversor sinxelo e gardaremos co nome json2yaml.py. Este script importa módulos YAML e JSON Python e carga un ficheiro JSON especificado polo usuario, realiza a conversión e escribe os datos no ficheiro 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()
Garda este script na ruta do sistema e execútao segundo sexa necesario:
$ ~/bin/json2yaml.py example.json
3. Analiza moito e a miúdo
Ás veces é útil mirar un problema desde un ángulo diferente. Se tes problemas para representar as relacións entre os teus datos en YAML, podes transformalos temporalmente en algo máis familiar.
Por exemplo, se estás cómodo traballando con listas de dicionario ou JSON, podes converter YAML en JSON con só dous comandos no shell interactivo de Python. Digamos que tes un ficheiro YAML mydata.yaml, entón así serí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 Roadn', 'city': 'Brooklyn', 'state': 'Wellington', 'postal': 6021, 'country': 'NZ'}}, 'words': 938, 'comments': 'Good article. Could be better.'}
Podes atopar moitos outros exemplos sobre este tema. Ademais, hai moitos conversores en liña e analizadores locais dispoñibles. Polo tanto, non dubides en reformatear os datos cando vexas só un revolto incomprensible nel.
4. Le as especificacións
Volvendo a YAML despois dunha longa pausa, é útil visitalo
5. Pseudo-configs
Ao escribir un libro ou artigo, sempre é útil esbozar primeiro un esquema preliminar, polo menos en forma de índice. É o mesmo con YAML. O máis probable é que teñas unha idea de que datos hai que escribir nun ficheiro YAML, pero realmente non entendes como conectalos entre si. Polo tanto, antes de esculpir YAML, debuxa unha pseudo-configuración.
Pseudo-config é semellante ao pseudo-código, no que non tes que preocuparte pola estrutura ou sangría, as relacións entre pais e fillos, a herdanza e a anidación. Aquí pasa o mesmo: debuxas iteracións dos datos a medida que xorden na túa cabeza.
Programadores de listas de pseudoconfiguración (Martin e Tabitha) e as súas habilidades (linguaxes de programación: Python, Perl, Pascal e Lisp, Fortran, Erlang, respectivamente).
Despois de debuxar unha pseudo-configuración nun anaco de papel, analízaa coidadosamente e, se todo está en orde, formatea en forma de ficheiro YAML válido.
6. O dilema das pestanas contra os espazos
Terás que resolver o dilema
En calquera editor de texto normal, pode configurar as pestanas de corrección automática para un número especificado de espazos, polo que a rebelión dos principais adherentes Aba non tes que ter medo.
Como todos os que odian YAML saben ben, non podes ver a diferenza entre as pestanas e os espazos na pantalla. E cando algo non é visible, adoita ser o último que recorda a xente, despois de resolver, comprobar e eliminar todos os demais problemas posibles. Unha hora de tempo dedicado a buscar unha curva de tabulación ou un bloque de espazos simplemente grita que precisa urxentemente para crear unha política para o uso dun ou outro e, a continuación, implementar unha comprobación de cumprimento do formigón armado (por exemplo, mediante un gancho Git para forzalo a través dun linter).
7. Menos é máis (ou máis é menos)
Algunhas persoas gústalles escribir en YAML porque enfatiza a estrutura. Ao mesmo tempo, usan activamente a sangría para resaltar bloques de datos. Esta é unha especie de estafa para imitar linguaxes de marcado que usan delimitadores explícitos.
Aquí tes un exemplo de tal estrutura de
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Para algúns, esta opción axúdalles a resolver a estrutura YAML na súa cabeza; para outros, pola contra, irritalles con moitas sangrías innecesarias, na súa opinión.
Pero se es o propietario do documento YAML e é responsable de mantelo, entón ti e só ti debe definir como usar a sangría. Se che molesta o acolchado grande, manténo ao mínimo posible segundo a especificación YAML. Por exemplo, o ficheiro anterior da documentación de Ansible pódese reescribir así sen ningunha perda:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Usa espazos en branco
Se repites constantemente os mesmos erros ao cubrir un ficheiro YAML, ten sentido inserir un modelo nel como comentario. A próxima vez pode simplemente copiar este modelo e introducir datos reais alí, por exemplo:
---
# - <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 diferente
Se a aplicación non ten un control sobre ti, pode valer a pena cambiar o YAML a un formato diferente. Co paso do tempo, os ficheiros de configuración poden superarse e entón é mellor convertelos en scripts sinxelos en Lua ou Python.
YAML é unha gran cousa que moitas persoas adoran polo seu minimalismo e sinxeleza, pero dista moito de ser a única ferramenta do teu arsenal. Así que ás veces podes rexeitalo. As bibliotecas de análise para YAML son fáciles de atopar, polo que se ofrece opcións de migración sinxelas, os usuarios sobrevivirán a este fallo de forma relativamente sen dor.
Se non podes prescindir de YAML, toma estes 10 consellos e supera a túa aversión por YAML dunha vez por todas.
Fonte: www.habr.com