10 krokov k YAML Zen

Všetci milujeme Ansible, ale Ansible je YAML. Existuje mnoho formátov pre konfiguračné súbory: zoznamy hodnôt, páry parameter-hodnota, INI súbory, YAML, JSON, XML a mnohé ďalšie. Z niekoľkých dôvodov zo všetkých sa však YAML často považuje za obzvlášť náročný. Najmä syntax YAML, napriek svojmu osviežujúcemu minimalizmu a pôsobivým schopnostiam práce s hierarchickými hodnotami, môže byť nepríjemná s prístupom k odsadzovaniu podobným Pythonu.

10 krokov k YAML Zen

Ak vás YAML naštve, môžete – a mali by ste! – urobte nasledujúcich 10 krokov, aby ste znížili svoju frustráciu na prijateľnú úroveň a zamilovali si YAML. Ako sa na tento zoznam patrí, našich desať tipov bude očíslovaných od nuly, meditáciu a duchovné praktiky pridáme podľa ľubovôle 😉

0. Nechajte svoj editor fungovať

Nezáleží na tom, aký textový editor máte, pravdepodobne existuje aspoň jeden doplnok pre prácu s YAML. Ak ho nemáte, okamžite ho vyhľadajte a nainštalujte. Čas strávený hľadaním a nastavovaním sa vám pri každej úprave YAML mnohonásobne vráti.

Napríklad redaktor Atóm štandardne podporuje YAML, ale pre GNU Emacs budete musieť nainštalovať ďalšie balíčky, napr. režim yaml.

10 krokov k YAML Zen

Emacs v režime YAML a zobrazovanie medzier.

Ak váš obľúbený editor nemá režim YAML, niektoré problémy sa dajú vyriešiť prácou s nastaveniami. Napríklad štandardný textový editor GNOME Gedit nemá režim YAML, ale štandardne zvýrazňuje syntax YAML a umožňuje vám konfigurovať prácu s odsadením:

10 krokov k YAML Zen

Nastavenie zarážok v Gedit.

Doplnok čerpacie priestory pre Gedit zobrazuje medzery ako bodky, čím eliminuje nejednoznačnosti s úrovňami odsadenia.

Inými slovami, trávte čas učením sa o svojom obľúbenom editore. Zistite, čo môže on alebo jeho vývojárska komunita ponúknuť pre prácu s YAML, a použite tieto funkcie. Určite neoľutujete.

1. Použite linter

V ideálnom prípade programovacie jazyky a značkovacie jazyky používajú predvídateľnú syntax. Počítače sú dobré v predvídateľnosti, a preto koncept lintera. Ak vás za 40 rokov svojej existencie minul a stále nepoužívate YAML linter, potom je čas vyskúšať yamllint.

zriadiť yamllint Môžete použiť štandardného správcu balíkov Linux. Napríklad v Red Hat Enterprise Linux 8 alebo Fedora je to takto:

$ sudo dnf install yamllint

Potom jednoducho spustíte yamllint a odošlete mu súbor YAML na kontrolu. Takto to vyzerá, ak do linteru odovzdáte súbor s chybou:

$ yamllint errorprone.yaml
errorprone.yaml
23:10     error    syntax error: mapping values are not allowed here
23:11     error    trailing spaces  (trailing-spaces)

Čísla vľavo nie sú časom, ale súradnicami chyby: číslo riadku a stĺpca. Popis chyby vám možno nič nepovie, ale presne viete, kde sa nachádza. Stačí sa pozrieť na toto miesto v kóde a s najväčšou pravdepodobnosťou bude všetko jasné.

Keď yamllint nenájde žiadne chyby v súbore, nič sa nevytlačí na obrazovku. Ak vás takéto ticho desí a chcete trochu viac spätnej väzby, môžete spustiť linter pomocou príkazu podmienenej odozvy cez dvojitý ampersand (&&), takto:

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

V POSIX sa dvojitý ampersand spustí vtedy a len vtedy, ak predchádzajúci príkaz vráti 0. A yamllint len ​​vráti počet nájdených chýb, čo je dôvod, prečo celá táto podmienená konštrukcia funguje.

2. Píšte v Pythone, nie v YAML

Ak vás YAML naozaj naštve, jednoducho doň nepíšte, doslova. Stáva sa, že YAML je jediný formát, ktorému aplikácia rozumie. Ale ani v tomto prípade nie je potrebné vytvárať súbor YAML. Napíšte na to, čo sa vám páči, a potom to preveďte. Existuje napríklad skvelá knižnica pre Python pyyaml a dve metódy konverzie: samokonverzia a konverzia pomocou skriptov.

Sebakonverzia

V tomto prípade je dátový súbor tiež skript Python, ktorý generuje YAML. Táto metóda je najvhodnejšia pre malé súbory údajov. Údaje JSON jednoducho zapíšete do premennej Pythonu, predpíšete im smernicu importu a na koniec súboru pridáte tri riadky na implementáciu výstupu.

#!/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

Teraz spustíme tento súbor v Pythone a získame súbor 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

Toto je úplne platný YAML, ale yamllint vás upozorní, že nezačína na -. Toto sa dá ľahko opraviť ručne alebo mierne upraviť v skripte Python.

Konverzia pomocou skriptov

V tomto prípade najprv napíšeme v JSON a potom spustíme konvertor ako samostatný skript Python, ktorý produkuje YAML ako výstup. V porovnaní s predchádzajúcou metódou je táto metóda škálovateľnejšia, pretože konverzia je oddelená od údajov.

Najprv si vytvorte súbor JSON example.json, z ktorého si ho môžete vziať 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"
			}
		  }
		}
	  }
	}

Potom vytvoríme jednoduchý skript prevodníka a uložíme ho pod názvom json2yaml.py. Tento skript importuje moduly YAML aj JSON Python a načíta užívateľom špecifikovaný súbor JSON, vykoná konverziu a zapíše údaje do súboru 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()

Uložte tento skript do systémovej cesty a spustite ho podľa potreby:

$ ~/bin/json2yaml.py example.json

3. Rozoberajte veľa a často

Niekedy je užitočné pozrieť sa na problém z iného uhla. Ak máte problémy s reprezentáciou vzťahov medzi vašimi údajmi v YAML, môžete ich dočasne transformovať na niečo známejšie.

Ak vám napríklad vyhovuje práca so zoznamami slovníkov alebo JSON, môžete previesť YAML na JSON iba dvoma príkazmi v interaktívnom prostredí Pythonu. Povedzme, že máte súbor YAML mydata.yaml, potom by to vyzeralo takto:

$ 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.'}

Na túto tému nájdete mnoho ďalších príkladov. Okrem toho je k dispozícii veľa online konvertorov a lokálnych analyzátorov. Neváhajte teda dáta preformátovať, keď v nich vidíte len nepochopiteľnú spleť.

4. Prečítajte si špecifikácie

Keď sa po dlhej prestávke vraciame do YAML, je užitočné navštíviť yaml.org a znovu si prečítajte špecifikácie (špecifikácie). Ak máte problémy s YAML, ale nedostali ste sa k špecifikácii, potom je čas túto situáciu napraviť. Špecifikácie sa prekvapivo ľahko píšu a požiadavky na syntax sú ilustrované veľkým počtom príkladov v Kapitola 6.

5. Pseudokonfigurácie

Pri písaní knihy alebo článku je vždy užitočné najskôr načrtnúť predbežnú osnovu, aspoň vo forme obsahu. Rovnako je to aj s YAML. S najväčšou pravdepodobnosťou máte predstavu o tom, aké údaje je potrebné zapísať do súboru YAML, ale v skutočnosti nerozumiete, ako ich navzájom prepojiť. Preto pred vyrezávaním YAML nakreslite pseudokonfiguráciu.

Pseudo-config je podobný pseudokódu, kde sa nemusíte starať o štruktúru ani odsadenie, vzťahy rodič-dieťa, dedenie a vnorenie. Tu je to rovnaké: kreslíte iterácie údajov tak, ako vznikajú vo vašej hlave.

10 krokov k YAML Zen

Pseudo-config zoznam programátorov (Martin a Tabitha) a ich zručnosti (programovacie jazyky: Python, Perl, Pascal a Lisp, Fortran, Erlang, v tomto poradí).

Po nakreslení pseudokonfigurácie na kus papiera ju dôkladne analyzujte a ak je všetko v poriadku, naformátujte ju do podoby platného súboru YAML.

6. Dilema karty verzus priestory

Budete musieť vyriešiť dilemu "tabulátory alebo medzery?". Nie v globálnom zmysle, ale len na úrovni vašej organizácie, alebo aspoň projektu. Nezáleží na tom, či ide o použitie postprocesingu pomocou sed skriptu, nastavenie textových editorov na programátorských strojoch alebo univerzálne prevzatie potvrdení o prísnom dodržiavaní pokynov linter pod hrozbou prepustenia, ale všetci členovia vášho tímu, ktorí v tak či onak súvisiace s YAML musia používať iba medzery (ako to vyžaduje špecifikácia YAML).

V akomkoľvek bežnom textovom editore môžete nakonfigurovať automatické opravy tabulátorov na zadaný počet medzier, takže vzbura kľúčových prívržencov Tab nemusíš sa báť.

Ako každý neprajník YAML dobre vie, na obrazovke nevidíte rozdiel medzi kartami a medzerami. A keď niečo nie je viditeľné, je to zvyčajne to posledné, na čo si ľudia pamätajú, keď si pretriedili, skontrolovali a odstránili všetky ostatné možné problémy. Hodina času strávená hľadaním tabuľkovej krivky alebo bloku medzier jednoducho kričí, že musíte súrne vytvoriť politiku na používanie jedného alebo druhého a potom implementovať železobetónovú kontrolu jej dodržiavania (napríklad prostredníctvom hák Git, ktorý ho pretlačí cez linter).

7. Menej je viac (alebo viac je menej)

Niektorí ľudia radi píšu v YAML, pretože kladie dôraz na štruktúru. Zároveň aktívne využívajú odsadenie na zvýraznenie blokov údajov. Toto je druh podvodu na napodobňovanie značkovacích jazykov, ktoré používajú explicitné oddeľovače.

Tu je príklad takejto štruktúry z Prípustná dokumentácia:

# Employee records
-  martin:
        name: Martin D'vloper
        job: Developer
        skills:
            - python
            - perl
            - pascal
-  tabitha:
        name: Tabitha Bitumen
        job: Developer
        skills:
            - lisp
            - fortran
            - erlang

Niekomu táto možnosť pomáha utriediť si v hlave štruktúru YAML, iného naopak dráždi množstvom zbytočných, podľa nich, zarážok.

Ale ak ste vlastníkom dokumentu YAML a ste zodpovední za jeho udržiavanie, potom ty a len ty musí definovať, ako používať odsadenie. Ak vás štve veľké polstrovanie, obmedzte ho na minimum podľa špecifikácie YAML. Napríklad vyššie uvedený súbor z dokumentácie Ansible možno prepísať takto bez straty:

---
- martin:
   name: Martin D'vloper
   job: Developer
   skills:
   - python
   - perl
   - pascal
- tabitha:
   name: Tabitha Bitumen
   job: Developer
   skills:
   - lisp
   - fortran
   - erlang

8. Použite polotovary

Ak pri vypĺňaní YAML súboru neustále opakujete tie isté chyby, má zmysel vložiť doň šablónu ako komentár. Potom nabudúce môžete jednoducho skopírovať túto šablónu a zadať tam skutočné údaje, napríklad:

---
# - <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. Použite niečo iné

Ak vás aplikácia nedrží, možno by stálo za to zmeniť YAML na iný formát. Konfiguračné súbory môžu časom prerásť samy a potom je lepšie ich previesť na jednoduché skripty v Lua alebo Pythone.

YAML je skvelá vec, ktorú mnohí ľudia milujú pre jej minimalizmus a jednoduchosť, no zďaleka to nie je jediný nástroj vo vašom arzenáli. Takže niekedy to môžete odmietnuť. Knižnice analýzy sa dajú ľahko nájsť pre YAML, takže ak ponúknete jednoduché možnosti migrácie, vaši používatelia prežijú toto zlyhanie relatívne bezbolestne.

Ak sa bez YAML nezaobídete, vezmite si týchto 10 tipov a prekonajte svoju nechuť k YAML raz a navždy!

Zdroj: hab.com

Pridať komentár