Cu toții iubim Ansible, dar Ansible este YAML. Există multe formate pentru fișierele de configurare: liste de valori, perechi parametru-valoare, fișiere INI, YAML, JSON, XML și multe altele. Cu toate acestea, din mai multe motive dintre toate, YAML este adesea considerat deosebit de dificil. În special, în ciuda minimalismului său revigorant și a capabilităților impresionante de a lucra cu valori ierarhice, sintaxa YAML poate fi enervantă cu abordarea sa de tip Python a indentării.
Dacă YAML te enervează, poți – și ar trebui! – faceți următorii 10 pași pentru a vă reduce frustrarea la un nivel acceptabil și îndrăgostiți-vă de YAML. După cum se potrivește acestei liste, cele zece sfaturi ale noastre vor fi numerotate de la zero, vom adăuga meditație și practici spirituale după bunul plac 😉
0. Faceți-vă editorul să funcționeze
Nu contează ce editor de text aveți, probabil că există cel puțin un plugin pentru lucrul cu YAML. Dacă nu aveți unul, găsiți-l și instalați-l imediat. Timpul petrecut căutând și configurand va fi profitabil de mai multe ori de fiecare dată când va trebui să editați YAML.
De exemplu, editor
Emacs în modul YAML și afișează spații.
Dacă editorul tău preferat nu are un mod YAML, atunci unele dintre probleme pot fi rezolvate lucrând cu setările. De exemplu, editorul de text GNOME standard Gedit nu are un mod YAML, dar în mod implicit evidențiază sintaxa YAML și vă permite să configurați lucrul cu indentări:
Setarea indentărilor în Gedit.
Un plugin
Cu alte cuvinte, petrece timpul învățând despre editorul tău preferat. Aflați ce au de oferit el sau comunitatea sa de dezvoltare pentru a lucra cu YAML și utilizați aceste funcții. Cu siguranță nu vei regreta.
1. Folosiți un linter
În mod ideal, limbajele de programare și limbajele de marcare folosesc sintaxă previzibilă. Calculatoarele sunt bune la predictibilitate, motiv pentru care conceptul de
Instalare
$ sudo dnf install yamllint
Apoi pur și simplu rulați yamllint, trecându-i fișierul YAML pentru a verifica. Iată cum arată dacă treceți un fișier cu o eroare către linter:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
Numerele din stânga nu sunt ora, ci coordonatele erorii: numărul rândului și al coloanei. Este posibil ca descrierea erorii să nu vă spună nimic, dar știți exact unde se află. Uită-te la acest loc din cod și, cel mai probabil, totul va deveni clar.
Când yamllint nu găsește nicio eroare într-un fișier, nimic nu este imprimat pe ecran. Dacă o astfel de tăcere te sperie și vrei puțin mai mult feedback, atunci poți rula linter cu comanda ecou condiționat printr-un dublu ampersand (&&), astfel:
$ yamllint perfect.yaml && echo "OK"
OK
În POSIX, se declanșează un ampersand dublu dacă și numai dacă comanda anterioară returnează 0. Și yamllint returnează doar numărul de erori găsite, motiv pentru care întreaga construcție condiționată funcționează.
2. Scrieți în Python, nu YAML
Dacă YAML te enervează cu adevărat, pur și simplu nu scrie în el, la propriu. Se întâmplă ca YAML să fie singurul format pe care aplicația îl înțelege. Dar chiar și în acest caz, nu este necesar să creați un fișier YAML. Scrieți despre ceea ce vă place și apoi convertiți. De exemplu, există o bibliotecă grozavă pentru Python
Autoconversie
În acest caz, fișierul de date este, de asemenea, un script Python care generează YAML. Această metodă este cea mai potrivită pentru seturi mici de date. Pur și simplu scrieți datele JSON într-o variabilă Python, o prefațați cu o directivă de import și, la sfârșitul fișierului, adăugați trei linii pentru a implementa rezultatul.
#!/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
Acum rulăm acest fișier în Python și obținem fișierul 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
Acesta este YAML perfect valid, dar yamllint vă va avertiza că nu începe cu -. Ei bine, acest lucru poate fi corectat cu ușurință manual sau ușor modificat în scriptul Python.
Conversie prin scripturi
În acest caz, scriem mai întâi în JSON, apoi rulăm convertorul ca un script Python separat, care produce YAML ca ieșire. În comparație cu metoda anterioară, această metodă se scalează mai bine, deoarece conversia este separată de date.
Mai întâi, să creăm un fișier JSON example.json, de exemplu, din care îl puteți lua
{
"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"
}
}
}
}
}
Apoi vom crea un script de conversie simplu și îl vom salva sub numele json2yaml.py. Acest script importă atât modulele YAML, cât și JSON Python și încarcă un fișier JSON specificat de utilizator, efectuează conversia și scrie datele în fișierul 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()
Salvați acest script în calea de sistem și rulați-l după cum este necesar:
$ ~/bin/json2yaml.py example.json
3. Analizați mult și des
Uneori este util să privim o problemă dintr-un unghi diferit. Dacă întâmpinați probleme în a reprezenta relațiile dintre datele dvs. în YAML, le puteți transforma temporar în ceva mai familiar.
De exemplu, dacă vă simțiți confortabil să lucrați cu liste de dicționar sau JSON, puteți converti YAML în JSON cu doar două comenzi în shell-ul interactiv Python. Să presupunem că aveți un fișier YAML mydata.yaml, atunci așa ar arăta:
$ 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.'}
Puteți găsi multe alte exemple pe această temă. În plus, există multe convertoare online și analizoare locale disponibile. Așa că nu ezitați să reformatați datele când vedeți doar un amestec de neînțeles în ele.
4. Citiți specificațiile
Revenind la YAML după o pauză lungă, este util să vizitați
5. Pseudo-config
Când scrieți o carte sau un articol, este întotdeauna util să schițați mai întâi o schiță preliminară, cel puțin sub forma unui cuprins. Este la fel și cu YAML. Cel mai probabil, aveți o idee despre ce date trebuie scrise într-un fișier YAML, dar nu înțelegeți cu adevărat cum să le conectați unul cu celălalt. Prin urmare, înainte de a sculpta YAML, desenați o pseudo-config.
Pseudo-config este similar cu pseudo-codul, unde nu trebuie să vă faceți griji cu privire la structură sau indentare, relațiile părinte-copil, moștenire și imbricare. La fel este și aici: desenați iterații ale datelor pe măsură ce apar în capul vostru.
Programatori de listare pseudo-config (Martin și Tabitha) și abilitățile acestora (limbaje de programare: Python, Perl, Pascal și Lisp, Fortran, respectiv Erlang).
După ce desenați o pseudo-configurație pe o bucată de hârtie, analizați-o cu atenție și, dacă totul este în ordine, formatați-o sub forma unui fișier YAML valid.
6. Dilema Tabs vs. Spaces
Va trebui să rezolvi dilema
În orice editor de text normal, puteți configura file cu corectare automată la un număr specificat de spații, astfel încât rebeliunea aderenților cheie Tab nu trebuie să vă fie frică.
După cum știe bine toți cei care urăsc YAML, nu puteți vedea diferența dintre file și spații de pe ecran. Și când ceva nu este vizibil, este de obicei ultimul lucru pe care oamenii își amintesc, după ce au rezolvat, verificat și eliminat toate celelalte probleme posibile. O oră de timp petrecută căutând o curbă de tabulare sau un bloc de spații pur și simplu țipă că aveți nevoie urgentă pentru a crea o politică pentru utilizarea unuia sau a celuilalt și apoi implementați o verificare a betonului armat pentru respectarea acesteia (de exemplu, prin un cârlig Git pentru a-l forța printr-un linter).
7. Mai puțin este mai mult (sau mai mult este mai puțin)
Unora le place să scrie în YAML, deoarece accentuează structura. În același timp, folosesc în mod activ indentarea pentru a evidenția blocuri de date. Este un fel de înșelătorie pentru a imita limbaje de marcare care folosesc delimitatori expliciți.
Iată un exemplu de astfel de structură din
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Pentru unii, această opțiune îi ajută să rezolve structura YAML din cap; pentru alții, dimpotrivă, îi irită cu o mulțime de liniuțe inutile, în opinia lor.
Dar dacă sunteți proprietarul documentului YAML și sunteți responsabil pentru întreținerea acestuia, atunci tu si doar tu trebuie să definească modul de utilizare a indentării. Dacă sunteți enervat de căptușeala mare, păstrați-o la minimum posibil conform specificației YAML. De exemplu, fișierul de mai sus din documentația Ansible poate fi rescris astfel fără nicio pierdere:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Folosiți spații libere
Dacă repeți în mod constant aceleași greșeli atunci când completezi un fișier YAML, este logic să inserezi un șablon în el ca comentariu. Apoi, data viitoare, puteți pur și simplu să copiați acest șablon și să introduceți acolo date reale, de exemplu:
---
# - <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. Folosește ceva diferit
Dacă aplicația nu are un control asupra dvs., atunci ar putea merita să schimbați YAML într-un alt format. În timp, fișierele de configurare pot depăși singure și atunci este mai bine să le convertiți în scripturi simple în Lua sau Python.
YAML este un lucru grozav pe care mulți oameni îl iubesc pentru minimalismul și simplitatea sa, dar este departe de singurul instrument din arsenalul tău. Așa că uneori poți refuza. Bibliotecile de analiză sunt ușor de găsit pentru YAML, așa că dacă oferiți opțiuni de migrare ușoare, utilizatorii dvs. vor supraviețui acestui eșec relativ fără durere.
Dacă nu te poți descurca fără YAML, atunci ia aceste 10 sfaturi și învinge-ți antipatia față de YAML odată pentru totdeauna!
Sursa: www.habr.com