Svi volimo Ansible, ali Ansible je YAML. Postoje mnogi formati za konfiguracijske datoteke: popisi vrijednosti, parovi parametar-vrijednost, INI datoteke, YAML, JSON, XML i mnogi drugi. Međutim, zbog nekoliko razloga od svih, YAML se često smatra posebno teškim. Konkretno, unatoč svom osvježavajućem minimalizmu i impresivnim mogućnostima za rad s hijerarhijskim vrijednostima, YAML sintaksa može smetati svojim pristupom uvlačenju nalik Pythonu.
Ako vas YAML ljuti, možete — i trebali biste! – Poduzmite sljedećih 10 koraka kako biste svoju frustraciju sveli na prihvatljivu razinu i zaljubili se u YAML. Kako i priliči ovoj listi, naših deset savjeta bit će numerirani ispočetka, dodavat ćemo meditacije i duhovne prakse po želji 😉
0. Neka vaš urednik radi
Nije važno koji uređivač teksta imate, vjerojatno postoji barem jedan dodatak za rad s YAML-om. Ako ga nemate, odmah ga pronađite i instalirajte. Vrijeme potrošeno na traženje i postavljanje višestruko će se isplatiti svaki put kada budete morali uređivati YAML.
Na primjer, urednik
Emacs u YAML modu i prikaz razmaka.
Ako vaš omiljeni uređivač nema YAML način, tada se neki od problema mogu riješiti radom s postavkama. Na primjer, standardni GNOME uređivač teksta Gedit nema YAML način rada, ali prema zadanim postavkama ističe YAML sintaksu i omogućuje vam da konfigurirate rad s uvlakama:
Postavljanje uvlaka u Geditu.
Dodatak
Drugim riječima, provedite vrijeme učeći o svom omiljenom uredniku. Saznajte što on ili njegova razvojna zajednica nudi za rad s YAML-om i upotrijebite te značajke. Sigurno nećete požaliti.
1. Koristite linter
U idealnom slučaju, programski jezici i označni jezici koriste predvidljivu sintaksu. Računala su dobra u predvidljivosti, zbog čega je koncept
uspostaviti
$ sudo dnf install yamllint
Zatim jednostavno pokrenete yamllint, prosljeđujući mu YAML datoteku na provjeru. Ovako to izgleda ako linteru proslijedite datoteku s greškom:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
Brojevi s lijeve strane nisu vrijeme, već koordinate pogreške: broj retka i stupca. Opis greške vam možda ništa ne govori, ali točno znate gdje je. Samo pogledajte ovo mjesto u kodu i najvjerojatnije će sve postati jasno.
Kada yamllint ne pronađe greške u datoteci, ništa se ne ispisuje na ekranu. Ako vas takva tišina plaši i želite malo više povratnih informacija, onda možete pokrenuti linter s uvjetnom echo naredbom preko dvostrukog znaka & (&&), ovako:
$ yamllint perfect.yaml && echo "OK"
OK
U POSIX-u, dvostruki ampersand aktivira se ako i samo ako prethodna naredba vrati 0. A yamllint samo vraća broj pronađenih pogrešaka, zbog čega cijela ova uvjetna konstrukcija funkcionira.
2. Pišite u Pythonu, a ne u YAML-u
Ako vas YAML stvarno ljuti, samo nemojte pisati u njemu, doslovno. Događa se da je YAML jedini format koji aplikacija razumije. Ali čak ni u ovom slučaju nije potrebno izraditi YAML datoteku. Pišite ono što želite, a zatim pretvorite. Na primjer, postoji izvrsna biblioteka za Python
Samoobraćenje
U ovom slučaju, podatkovna datoteka također je Python skripta koja generira YAML. Ova metoda je najprikladnija za male skupove podataka. Jednostavno upišete JSON podatke u Python varijablu, prethodite im direktivom za uvoz i na kraju datoteke dodate tri retka za implementaciju izlaza.
#!/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
Sada pokrećemo ovu datoteku u Pythonu i dobivamo datoteku 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
Ovo je savršeno valjan YAML, ali yamllint će vas upozoriti da ne počinje s -. Pa, ovo se može lako ispraviti ručno ili malo modificirati u Python skripti.
Konverzija putem skripti
U ovom slučaju, prvo pišemo u JSON-u, a zatim pokrećemo pretvarač kao zasebnu Python skriptu, koja proizvodi YAML kao izlaz. U usporedbi s prethodnom metodom, ova se metoda bolje mjeri jer je konverzija odvojena od podataka.
Prvo, stvorimo JSON datoteku example.json, na primjer, iz koje je možete preuzeti
{
"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"
}
}
}
}
}
Zatim ćemo izraditi jednostavnu skriptu pretvarača i spremiti je pod imenom json2yaml.py. Ova skripta uvozi YAML i JSON Python module i učitava JSON datoteku koju je odredio korisnik, izvodi konverziju i zapisuje podatke u datoteku 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()
Spremite ovu skriptu na put sustava i pokrenite je po potrebi:
$ ~/bin/json2yaml.py example.json
3. Raščlanjujte puno i često
Ponekad je korisno sagledati problem iz drugog kuta. Ako imate problema s predstavljanjem odnosa između svojih podataka u YAML-u, možete ih privremeno transformirati u nešto poznatije.
Na primjer, ako vam je ugodno raditi s popisima rječnika ili JSON-om, možete pretvoriti YAML u JSON sa samo dvije naredbe u interaktivnoj Python ljusci. Recimo da imate YAML datoteku mydata.yaml, onda bi to izgledalo ovako:
$ 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.'}
Možete pronaći mnoge druge primjere na ovu temu. Osim toga, dostupni su mnogi mrežni pretvarači i lokalni parseri. Stoga nemojte oklijevati ponovno formatirati podatke kada u njima vidite samo neshvatljivu zbrku.
4. Pročitajte specifikacije
Povratak na YAML nakon duge pauze, korisno je posjetiti
5. Pseudo-konfiguracije
Kada pišete knjigu ili članak, uvijek je korisno prvo skicirati preliminarni nacrt, barem u obliku tablice sadržaja. Isto je i s YAML-om. Najvjerojatnije imate ideju koje podatke treba zapisati u YAML datoteku, ali zapravo ne razumijete kako ih međusobno povezati. Stoga, prije oblikovanja YAML-a, nacrtajte pseudo-konfiguraciju.
Pseudo-config je sličan pseudo-kodu, gdje ne morate brinuti o strukturi ili uvlačenju, odnosima roditelj-dijete, nasljeđivanju i gniježđenju. Ovdje je isto: crtate iteracije podataka kako se pojavljuju u vašoj glavi.
Pseudo-config popis programera (Martin i Tabitha) i njihovih vještina (programski jezici: Python, Perl, Pascal i Lisp, Fortran, Erlang, redom).
Nakon što nacrtate pseudokonfiguraciju na komadu papira, pažljivo je analizirajte i, ako je sve u redu, formatirajte je u obliku valjane YAML datoteke.
6. Dilema tabulatori protiv razmaka
Morat ćete riješiti dilemu
U bilo kojem normalnom uređivaču teksta možete konfigurirati kartice s automatskim ispravljanjem na određeni broj razmaka, tako da pobuna ključnih pristaša Tabulator ne moraš se bojati.
Kao što svaki mrzitelj YAML-a dobro zna, ne možete vidjeti razliku između tabova i razmaka na ekranu. A kada se nešto ne vidi, obično je to zadnje čega se ljudi sjete, nakon što su sredili, provjerili i otklonili sve ostale moguće probleme. Sat vremena provedenog u potrazi za tabelarnom krivuljom ili blokom razmaka jednostavno vrišti da morate hitno izraditi politiku za korištenje jednog ili drugog, a zatim provesti armiranobetonsku provjeru usklađenosti s njom (na primjer, kroz Git kuka za prolazak kroz linter).
7. Manje je više (ili više je manje)
Neki ljudi vole pisati u YAML-u jer naglašava strukturu. Istodobno, oni aktivno koriste uvlačenje za isticanje blokova podataka. Ovo je neka vrsta prijevare da se oponašaju označni jezici koji koriste eksplicitne graničnike.
Evo primjera takve strukture iz
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Nekima ova opcija pomaže da razvrstaju YAML strukturu u svojim glavama; za druge, naprotiv, iritira ih puno nepotrebnih, po njihovom mišljenju, uvlaka.
Ali ako ste vlasnik YAML dokumenta i odgovorni ste za njegovo održavanje, onda ti i samo ti mora definirati kako koristiti uvlačenje. Ako vas živcira veliko ispunjavanje, svedite ga na najmanju moguću mjeru prema YAML specifikaciji. Na primjer, gornja datoteka iz Ansible dokumentacije može se prepisati ovako bez ikakvih gubitaka:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Koristite praznine
Ako stalno ponavljate iste pogreške prilikom ispunjavanja YAML datoteke, ima smisla umetnuti predložak u nju kao komentar. Zatim sljedeći put jednostavno kopirajte ovaj predložak i tamo unesite stvarne podatke, na primjer:
---
# - <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. Koristite nešto drugačije
Ako vas aplikacija ne drži, možda bi bilo vrijedno promijeniti YAML u drugi format. S vremenom konfiguracijske datoteke mogu prerasti same sebe i tada ih je bolje pretvoriti u jednostavne skripte u Lua ili Python.
YAML je sjajna stvar koju mnogi ljudi vole zbog svog minimalizma i jednostavnosti, ali daleko od toga da je jedini alat u vašem arsenalu. Tako da ga ponekad možete odbiti. Lako je pronaći biblioteke parsiranja za YAML, pa ako ponudite jednostavne opcije migracije, vaši će korisnici relativno bezbolno preživjeti ovaj kvar.
Ako ne možete bez YAML-a, poslušajte ovih 10 savjeta i nadvladajte svoju nesklonost YAML-u jednom zauvijek!
Izvor: www.habr.com