10 pași către YAML Zen

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.

10 pași către YAML Zen

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 Atom acceptă YAML în mod implicit, dar pentru GNU Emacs va trebui să instalați pachete suplimentare, de exemplu, modul yaml.

10 pași către YAML Zen

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:

10 pași către YAML Zen

Setarea indentărilor în Gedit.

Un plugin spații de trasare pentru Gedit, afișează spațiile ca puncte, eliminând ambiguitățile cu nivelurile de indentare.

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 lintera. Dacă în cei 40 de ani de existență a trecut pe lângă tine și încă nu folosești un linter YAML, atunci este timpul să încerci yamllint.

Instalare yamllint Puteți utiliza managerul standard de pachete Linux. De exemplu, în Red Hat Enterprise Linux 8 sau Fedora se face astfel:

$ 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 pyyaml și două metode de conversie: autoconversie și conversie prin scripturi.

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 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"
			}
		  }
		}
	  }
	}

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 yaml.org și recitiți specificațiile (specificațiile). Dacă aveți dificultăți cu YAML, dar nu ați ajuns la specificație, atunci este timpul să corectați această situație. Specificațiile sunt surprinzător de ușor de scris, iar cerințele de sintaxă sunt ilustrate cu un număr mare de exemple în capitolul 6.

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.

10 pași către YAML Zen

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 „file sau spații?”. Nu într-un sens global, ci doar la nivelul organizației tale, sau cel puțin un proiect. Nu contează dacă aceasta implică utilizarea post-procesării cu un script sed, configurarea de editori de text pe mașinile programatorilor sau primirea universală a chitanțelor de respectare strictă a instrucțiunilor linter-ului sub amenințarea de demitere, dar toți membrii echipei dvs. care în într-un fel sau altul se referă la YAML trebuie să utilizeze numai spații (după cum este cerut de specificația YAML).

Î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 Documentație Ansible:

# 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

Adauga un comentariu