Todos nós amamos o Ansible, mas Ansible é YAML. Existem muitos formatos para arquivos de configuração: listas de valores, pares parâmetro-valor, arquivos INI, YAML, JSON, XML e muitos outros. No entanto, por vários motivos, o YAML é frequentemente considerado particularmente difícil. Em particular, apesar de seu minimalismo refrescante e capacidades impressionantes para trabalhar com valores hierárquicos, a sintaxe YAML pode ser irritante com sua abordagem de indentação semelhante ao Python.
Se o YAML te irrita, você pode – e deve! – siga as 10 etapas a seguir para reduzir sua frustração a um nível aceitável e se apaixonar pelo YAML. Como convém a esta lista, nossas dez dicas serão numeradas do zero, adicionaremos meditação e práticas espirituais à vontade 😉
0. Faça seu editor funcionar
Não importa qual editor de texto você possui, provavelmente existe pelo menos um plugin para trabalhar com YAML. Se você não tiver um, encontre-o e instale-o imediatamente. O tempo gasto na pesquisa e configuração será recompensado muitas vezes sempre que você precisar editar o YAML.
Por exemplo, redator
Emacs no modo YAML e exibindo espaços.
Se o seu editor favorito não tiver o modo YAML, alguns dos problemas podem ser resolvidos trabalhando com as configurações. Por exemplo, o editor de texto GNOME padrão Gedit não possui um modo YAML, mas por padrão destaca a sintaxe YAML e permite configurar o trabalho com recuos:
Configurando recuos no Gedit.
Um plug-in
Em outras palavras, passe algum tempo aprendendo sobre seu editor favorito. Descubra o que ele ou sua comunidade de desenvolvimento tem a oferecer para trabalhar com YAML e use esses recursos. Você definitivamente não vai se arrepender.
1. Use um linter
Idealmente, as linguagens de programação e de marcação usam sintaxe previsível. Os computadores são bons em previsibilidade, e é por isso que o conceito de
Instalar
$ sudo dnf install yamllint
Então você simplesmente executa o yamllint, passando o arquivo YAML para verificação. Isto é o que acontece se você passar um arquivo com erro para o 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 à esquerda não são a hora, mas as coordenadas do erro: número da linha e da coluna. A descrição do erro pode não lhe dizer nada, mas você sabe exatamente onde ele está. Basta olhar para este local no código e provavelmente tudo ficará claro.
Quando o yamllint não encontra erros em um arquivo, nada é impresso na tela. Se esse silêncio assusta você e você deseja um pouco mais de feedback, você pode executar o linter com o comando de eco condicional por meio de um e comercial duplo (&&), assim:
$ yamllint perfect.yaml && echo "OK"
OK
No POSIX, um E comercial duplo é acionado se e somente se o comando anterior retornar 0. E o yamllint apenas retorna o número de erros encontrados, e é por isso que toda essa construção condicional funciona.
2. Escreva em Python, não em YAML
Se o YAML realmente te irrita, simplesmente não escreva nele, literalmente. Acontece que YAML é o único formato que a aplicação entende. Mas mesmo neste caso não é necessário criar um arquivo YAML. Escreva o que você gosta e depois converta. Por exemplo, existe uma ótima biblioteca para Python
Autoconversão
Neste caso, o arquivo de dados também é um script Python que gera YAML. Este método é mais adequado para pequenos conjuntos de dados. Você simplesmente escreve os dados JSON em uma variável Python, prefacia-os com uma diretiva de importação e, no final do arquivo, adiciona três linhas 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 arquivo em Python e obtemos o arquivo 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 é um YAML perfeitamente válido, mas o yamllint irá avisá-lo de que não começa com -. Bem, isso pode ser facilmente corrigido manualmente ou ligeiramente modificado no script Python.
Conversão via scripts
Nesse caso, primeiro escrevemos em JSON e depois executamos o conversor como um script Python separado, que produz YAML como saída. Comparado ao método anterior, este método é melhor dimensionado, pois a conversão é separada dos dados.
Primeiro, vamos criar um arquivo JSON example.json, por exemplo, você pode pegá-lo em
{
"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"
}
}
}
}
}
Em seguida, criaremos um script conversor simples e o salvaremos com o nome json2yaml.py. Este script importa módulos YAML e JSON Python e carrega um arquivo JSON especificado pelo usuário, executa a conversão e grava os dados no arquivo 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()
Salve este script no caminho do sistema e execute-o conforme necessário:
$ ~/bin/json2yaml.py example.json
3. Analise muito e com frequência
Às vezes é útil olhar para um problema de um ângulo diferente. Se estiver com problemas para representar os relacionamentos entre seus dados em YAML, você poderá transformá-los temporariamente em algo mais familiar.
Por exemplo, se você se sentir confortável trabalhando com listas de dicionário ou JSON, poderá converter YAML em JSON com apenas dois comandos no shell Python interativo. Digamos que você tenha um arquivo YAML mydata.yaml, então seria assim:
$ 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.'}
Você pode encontrar muitos outros exemplos sobre este tópico. Além disso, existem muitos conversores online e analisadores locais disponíveis. Portanto, não hesite em reformatar os dados quando vir apenas uma confusão incompreensível neles.
4. Leia as especificações
Voltando ao YAML após uma longa pausa, é útil visitar
5. Pseudo-configurações
Ao escrever um livro ou artigo, é sempre útil esboçar primeiro um esboço preliminar, pelo menos na forma de um índice. É o mesmo com YAML. Provavelmente, você tem uma ideia de quais dados precisam ser gravados em um arquivo YAML, mas não entende realmente como conectá-los. Portanto, antes de esculpir o YAML, desenhe uma pseudoconfiguração.
A pseudoconfiguração é semelhante ao pseudocódigo, onde você não precisa se preocupar com estrutura ou indentação, relacionamentos pai-filho, herança e aninhamento. É a mesma coisa aqui: você desenha iterações dos dados conforme eles surgem na sua cabeça.
Programadores de listagem de pseudo-configuração (Martin e Tabitha) e suas habilidades (linguagens de programação: Python, Perl, Pascal e Lisp, Fortran, Erlang, respectivamente).
Após desenhar uma pseudoconfiguração em um pedaço de papel, analise-a cuidadosamente e, se tudo estiver em ordem, formate-a na forma de um arquivo YAML válido.
6. O dilema das guias versus espaços
Você terá que resolver o dilema
Em qualquer editor de texto normal, você pode configurar guias de correção automática para um número específico de espaços, para que a rebelião dos principais adeptos Aba você não precisa ter medo.
Como todo odiador de YAML sabe bem, você não consegue ver a diferença entre tabulações e espaços na tela. E quando algo não está visível, geralmente é a última coisa que as pessoas lembram, depois de terem resolvido, verificado e eliminado todos os outros possíveis problemas. Uma hora gasta procurando uma curva de tabulação ou um bloco de espaços simplesmente grita que você precisa criar urgentemente uma política para o uso de um ou de outro e, em seguida, implementar uma verificação de concreto armado para conformidade com ela (por exemplo, por meio de um gancho Git para forçá-lo através de um linter).
7. Menos é mais (ou mais é menos)
Algumas pessoas gostam de escrever em YAML porque enfatiza a estrutura. Ao mesmo tempo, eles usam ativamente o recuo para destacar blocos de dados. Isso é uma espécie de golpe para imitar linguagens de marcação que usam delimitadores explícitos.
Aqui está um 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 alguns, esta opção ajuda-os a resolver a estrutura YAML na sua cabeça, para outros, pelo contrário, irrita-os com muitos recuos desnecessários, na sua opinião.
Mas se você é o proprietário do documento YAML e é responsável por mantê-lo, então tu e apenas tu deve definir como usar o recuo. Se você se incomoda com o preenchimento grande, mantenha-o no mínimo possível de acordo com a especificação YAML. Por exemplo, o arquivo acima da documentação do Ansible pode ser reescrito assim sem qualquer perda:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Use espaços em branco
Se você repetir constantemente os mesmos erros ao preencher um arquivo YAML, faz sentido inserir um modelo nele como comentário. Da próxima vez, você pode simplesmente copiar este modelo e inserir dados reais nele, 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. Use algo diferente
Se o aplicativo não tiver controle sobre você, talvez valha a pena alterar o YAML para um formato diferente. Com o tempo, os arquivos de configuração podem crescer e então é melhor convertê-los em scripts simples em Lua ou Python.
YAML é algo excelente que muitas pessoas adoram por seu minimalismo e simplicidade, mas está longe de ser a única ferramenta em seu arsenal. Então às vezes você pode recusar. Bibliotecas de análise são fáceis de encontrar para YAML, portanto, se você oferecer opções fáceis de migração, seus usuários sobreviverão a essa falha de forma relativamente fácil.
Se você não consegue viver sem o YAML, siga estas 10 dicas e supere sua antipatia pelo YAML de uma vez por todas!
Fonte: habr.com