10 pași către zen-ul YAML

Toți 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, YAML este adesea considerat deosebit de greu de utilizat. În special, în ciuda minimalismului său revigorant și a capacităților impresionante de a lucra cu valori ierarhice, sintaxa YAML poate fi enervantă prin abordarea sa asemănătoare cu Python în privința indentării.

10 pași către zen-ul YAML

Dacă te enervează YAML, poți – și ar trebui! – să urmezi următorii 10 pași pentru a-ți reduce iritarea la un nivel acceptabil și a îndrăgi YAML. Așa cum se cuvine unui adevărat listă, cele zece sfaturi vor fi numerotate de la zero, meditația și practicile spirituale pot fi adăugate la dorință 😉

0. Fă să funcționeze editorul tău

Indiferent ce editor text ai, există cu siguranta cel puțin un plugin pentru a lucra cu YAML. Dacă nu ai unul, găsește-l și instalează-l imediat. Timpul petrecut în căutarea și configurarea acestuia îți va aduce beneficii de multe ori de fiecare dată când va trebui să editezi YAML.

De exemplu, editorul Atom suportă YAML în mod implicit, în timp ce pentru GNU Emacs va trebui să instalezi pachete suplimentare, cum ar fi yaml-mode.

10 pași către zen-ul YAML

Emacs în modul YAML și vizualizarea spațiilor.

Dacă editorul tău preferat nu are un mod YAML, unele probleme pot fi rezolvate prin ajustarea setărilor. De exemplu, editorul de text Gedit, implicit pentru GNOME, nu are un mod YAML, dar evidențiază sintaxa YAML implicit și permite configurarea indentărilor:

10 pași către zen-ul YAML

Configurarea indentărilor în Gedit.

Iar pluginul drawspaces pentru Gedit afișează spațiile sub formă de puncte, eliminând neclaritățile legate de nivelele de indentare.

Cu alte cuvinte, petrece timp studând editorul tău preferat. Află ce îți oferă acesta sau comunitatea sa de dezvoltare pentru a lucra cu YAML și folosește aceste funcționalități. Nu vei regreta acest lucru.

1. Utilizează un linter

În ideal, limbajele de programare și cele de marcare folosesc o sintaxă previzibilă. Calculatoarele se descurcă bine cu previzibilitatea, de aceea, încă din 1978 a apărut conceptul linter-ului.Dacă acest concept a trecut pe lângă tine în cei 40 de ani de existență și nu utilizezi în continuare un linter pentru YAML, acum este momentul să încerci yamllint.

Instalează yamllint se poate face cu ajutorul managerului de pachete standard Linux. De exemplu, în Red Hat Enterprise Linux 8 sau Fedora asta se face astfel:

$ sudo dnf install yamllint

Apoi, trebuie să rulați simplesmente yamllint, trecându-i fișierul YAML pentru verificare. Iată cum arată atunci când îi transmiteți un fișier cu erori:

$ yamllint errorprone.yaml
errorprone.yaml
23:10     eroare    eroare de sintaxă: valorile de mapare nu sunt permise aici
23:11     eroare    spații finale  (trailing-spaces)

Numerele din stânga nu reprezintă timpul, ci coordonatele erorii: numărul liniei și coloanei. Descrierea erorii poate să nu însemne nimic pentru dumneavoastră, dar cu siguranță știți unde se află. Pur și simplu verificați acea locație în cod și, cel mai probabil, totul va deveni clar.

Când yamllint nu găsește erori în fișier, nimic nu este afișat pe ecran. Dacă vă sperie acestă tăcere și doriți un pic mai mult feedback, puteți rula linterna cu comanda condițională echo prin dublu și (&&), așa:

$ yamllint perfect.yaml && echo "OK"
OK

În POSIX, dublul și se activează atunci și doar atunci când comanda precedentă returnează 0. Iar yamllint returnează exact numărul erorilor găsite, așa că toată această construcție condițională funcționează.

2. Scrieți în Python, nu în YAML

Dacă vă enervează cu adevărat YAML, pur și simplu nu scrieți în el, în sensul literal. Uneori, YAML este singurul format pe care aplicația îl acceptă. Dar chiar și în acest caz, nu este necesar să creați un fișier YAML. Scrieți în ceea ce vă place și apoi convertirii. De exemplu, pentru Python există o bibliotecă excelentă pyyaml și două metode de conversie: auto-conversie și conversie prin scripturi.

Auto-conversie

În acest caz, fișierul cu datele 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, precedându-l cu directiva import, iar la sfârșitul fișierului adăugați trei linii pentru a realiza ieșirea.

#!/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: O limbaj de metadate, folosit pentru a crea limbaje de marcare, cum ar fi DocBook.
		GlossSee: markup
		GlossTerm: Limbaj Standardizat Generalizat de Marcare
		ID: SGML
		SortAs: SGML
	title: S
  title: glossar exemplu

Aceasta este un YAML absolut corect, dar yamllint va emite un avertisment că nu începe cu —. Ei bine, acest lucru se poate corecta ușor manual sau se poate ajusta puțin scriptul Python.

Conversia prin scripturi

În acest caz, mai întâi scriem în JSON, apoi rulăm convertorul sub formă de script Python separat, care va produce YAML. Comparat cu metoda anterioară, aceasta se scalabilizează mai bine, deoarece conversia este separată de date.

Mai întâi, să creăm un fișier JSON numit example.json, de exemplu, putem lua unul de pe json.org:

{
	"glossary": {
	  "title": "glosar exemplu",
	  "GlossDiv": {
		"title": "S",
		"GlossList": {
		  "GlossEntry": {
			"ID": "SGML",
			"SortAs": "SGML",
			"GlossTerm": "Limbaj Standardizat de Marcaj Generalizat",
			"Acronym": "SGML",
			"Abbrev": "ISO 8879:1986",
			"GlossDef": {
			  "para": "O meta-limbaj de marcaj, folosit pentru a crea limbaje de marcaj precum DocBook.",
			  "GlossSeeAlso": ["GML", "XML"]
			  },
			"GlossSee": "marcaj"
			}
		  }
		}
	  }
	}

Apoi, vom crea un script de conversie simplu și îl vom salva sub numele json2yaml.py. Acest script importă ambele module - YAML și JSON din Python, încarcă fișierul JSON specificat de utilizator, realizează 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 sistemului și rulați-l după cum este necesar:

$ ~/bin/json2yaml.py example.json

3. Parsează mult și des

Uneori, este util să privim problema dintr-un unghi diferit. Dacă îți este greu să îți imaginezi relațiile dintre datele în YAML, le poți transforma temporar în ceva mai familiar.

De exemplu, dacă îți este mai ușor să lucrezi cu liste de dicționare sau cu JSON, atunci YAML poate fi convertit în JSON cu doar două comenzi în interfața interactivă Python. Să presupunem că ai un fișier YAML mydata.yaml, iată cum ar putea 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': 'Articol bun. Ar putea fi mai bun.'}

Pe această temă poți găsi o mulțime de alte exemple. În plus, există multe convertizoare online și parsere locale disponibile. Așa că nu ezita să reformatezi datele atunci când le consideri o amestecătură confuză.

4. Citește specificațiile

Revenind la YAML după o pauză lungă, este util să vizitați yaml.org și să recitiți specificațiile. Dacă aveți dificultăți cu YAML, dar nu ați ajuns încă la specificație, e timpul să corectați această situație. Specificațiile sunt surprinzător de bine scrise, iar cerințele de sintaxă sunt ilustate cu multe exemple în Capitolul 6.

5. Pseudoconfiguri

Atunci când scrieți o carte sau un articol, este întotdeauna util să schițați mai întâi un plan preliminar, măcar sub formă de cuprins. La fel și cu YAML. Este foarte probabil să aveți o idee despre ce date trebuie să scrieți în fișierul YAML, dar să nu știți exact cum să le legați între ele. De aceea, înainte de a crea YAML, desenati un pseudoconfig.

Pseudoconfigurația este similară cu pseudocodul, unde nu trebuie să vă faceți griji cu privire la structură sau la indentare, relațiile „părinți-copii”, moștenire și imbricare. Aici, de asemenea, desenați iterațiile datelor în timp ce vă vin în minte.

10 pași către zen-ul YAML

Pseudoconfigurația enumeră programatorii (Martin și Tabitha) și abilitățile lor (limbajele de programare: Python, Perl, Pascal și Lisp, Fortran, Erlang, respectiv).

După ce ați desenat pseudoconfigurația pe o foaie de hârtie, analizați-o cu atenție și, dacă totul este în regulă, transformați-o într-un fișier YAML valid.

6. Dilema „tabulatoare sau spații”

Va trebui să rezolvați dilema „tabulatoare sau spații?”. Nu în sens global, ci doar la nivelul organizației dvs. sau, măcar, al proiectului. Indiferent dacă utilizați un script sed pentru preprocesare, configurați editorii de text pe mașinile programatorilor sau luați declarații ferme de respectare a indicațiilor lintern din amenințarea concedierii, toți membrii echipei dvs. care au de-a face cu YAML trebuie să folosească obligatoriu doar spații (așa cum necesită specificația YAML).

În orice editor de text normal, puteți configura înlocuirea automată a tabulatorilor cu un număr prestabilit de spații, deci nu trebuie să vă temeți de rebeliunea susținătorilor tastei Tab .

După cum știe fiecare dușman al YAML, pe ecran nu se vede nicio diferență între tabulatoare și spații. Atunci când ceva nu se vede, de obicei, se acordă mai puțin atenție, după ce s-au verificat și rezolvat toate celelalte probleme posibile. O oră de timp pierdută căutând un tabulator greșit sau un bloc de spații stricăci, strigă cu disperare pentru a crea o politică clară de utilizare a uneia sau alteia și pentru a implementa un control riguros al respectării acesteia (de exemplu, printr-un Git Hook pentru un control forțat prin linterna).

7. Mai bine mai puțin dar mai bine (sau mai mult – asta este mai puțin)

Unii oameni preferă să scrie în YAML, deoarece evidențiază structura. Aceștia folosesc activ indentarea pentru a delimita blocurile de date. Este un fel de truc pentru a imita limbajele de marcare care utilizează delimitatori evidenți.

Iată un exemplu de structurare din documentația 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ă variantă ajută la organizarea structurii YAML în minte, în timp ce altele, dimpotrivă, îi deranjează din cauza numărului mare de indentări, pe care le consideră inutile.

Dar dacă ești proprietarul documentului YAML și răspunzi de întreținerea lui, atunci tu și doar tu trebuie să stabilești cum să folosești indentările. Dacă te deranjează indentările mari, redu-le la minimul 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. Folosește șabloane

Dacă la completarea fișierului YAML repeți constant aceleași greșeli, merită să incluzi un șablon în formă de comentariu. Așa că, data viitoare, poți pur și simplu să copiezi acest șablon și să introduci datele 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 altceva

Dacă aplicația nu te ține cu forța, ar putea merita să schimbi YAML cu un alt format. În timp, fișierele de configurare pot depăși scopul și atunci e mai bine să le transformi în scripturi simple în Lua sau Python.

YAML este un instrument excelent, pe care mulți îl iubesc pentru minimalism și simplitate, dar nu este singurul instrument din arsenalul tău. Așadar, uneori poți renunța la el. Este ușor să găsești biblioteci de parsare pentru YAML, așa că, dacă oferi opțiuni de migrare convenabile, utilizatorii tăi vor supraviețui relativ ușor unei astfel de renunțări.

Dacă, totuși, nu poți evita YAML, ia în considerare aceste 10 sfaturi și învinge-ți aversiunea față de YAML odată pentru totdeauna!

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster