Vsi imamo radi Ansible, vendar je Ansible YAML. Obstaja veliko formatov za konfiguracijske datoteke: seznami vrednosti, pari parameter-vrednost, datoteke INI, YAML, JSON, XML in mnogi drugi. Vendar se YAML zaradi več razlogov od vseh pogosto šteje za posebej težkega. Kljub svojemu osvežujočemu minimalizmu in impresivnim zmožnostim za delo s hierarhičnimi vrednostmi je sintaksa YAML lahko moteča s svojim Pythonu podobnim pristopom k zamiku.
Če vas YAML razjezi, lahko – in bi morali! – naredite naslednjih 10 korakov, da zmanjšate svoje frustracije na sprejemljivo raven in se zaljubite v YAML. Kot se za ta seznam spodobi, bo naših deset nasvetov oštevilčenih od začetka, dodajali bomo meditacije in duhovne prakse po želji 😉
0. Naj vaš urejevalnik deluje
Ni pomembno, kateri urejevalnik besedila imate, verjetno obstaja vsaj en vtičnik za delo z YAML. Če ga nimate, ga takoj poiščite in namestite. Čas, porabljen za iskanje in nastavitev, se vam bo večkrat povrnil vsakič, ko boste morali urejati YAML.
Na primer urednik
Emacs v načinu YAML in prikaz presledkov.
Če vaš najljubši urejevalnik nima načina YAML, lahko nekatere težave rešite z delom z nastavitvami. Na primer, standardni urejevalnik besedil GNOME Gedit nima načina YAML, vendar privzeto osvetli sintakso YAML in vam omogoča konfiguracijo dela z zamiki:
Nastavitev zamikov v Geditu.
Vtičnik
Z drugimi besedami, porabite čas za učenje o svojem najljubšem urejevalniku. Ugotovite, kaj on ali njegova razvojna skupnost ponuja za delo z YAML, in uporabite te funkcije. Zagotovo vam ne bo žal.
1. Uporabite linter
V idealnem primeru programski jeziki in označevalni jeziki uporabljajo predvidljivo sintakso. Računalniki so dobri v predvidljivosti, zato je koncept
Namestite
$ sudo dnf install yamllint
Nato preprosto zaženete yamllint in mu posredujete datoteko YAML v preverjanje. Tako je videti, če linterju posredujete datoteko z napako:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
Številke na levi niso čas, temveč koordinate napake: številka vrstice in stolpca. Opis napake vam morda ne pove ničesar, vendar točno veste, kje je. Samo poglejte to mesto v kodi in najverjetneje bo vse jasno.
Ko yamllint v datoteki ne najde napak, se nič ne natisne na zaslon. Če vas takšna tišina prestraši in želite malo več povratnih informacij, potem lahko linter zaženete z ukazom pogojnega odmeva prek dvojnega znaka & (&&), takole:
$ yamllint perfect.yaml && echo "OK"
OK
V POSIX-u se dvojni ampersand sproži, če in samo če prejšnji ukaz vrne 0. In yamllint samo vrne število najdenih napak, zato ta celotna pogojna konstrukcija deluje.
2. Pišite v Pythonu, ne v YAML
Če vas YAML res razjezi, preprosto ne pišite vanj, dobesedno. Zgodi se, da je YAML edini format, ki ga aplikacija razume. Toda tudi v tem primeru ni treba ustvariti datoteke YAML. Napišite, kar vam je všeč, in nato pretvorite. Na primer, obstaja odlična knjižnica za Python
Samospreobrnjenje
V tem primeru je podatkovna datoteka tudi skript Python, ki generira YAML. Ta metoda je najbolj primerna za majhne nize podatkov. Podatke JSON preprosto zapišete v spremenljivko Python, jim predpišete uvozno direktivo in na koncu datoteke dodate tri vrstice za izvedbo izhoda.
#!/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
Zdaj zaženemo to datoteko v Pythonu in dobimo datoteko 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
To je popolnoma veljaven YAML, vendar vas bo yamllint opozoril, da se ne začne z -. No, to je mogoče enostavno popraviti ročno ali rahlo spremeniti v skriptu Python.
Pretvorba preko skript
V tem primeru najprej pišemo v JSON, nato pa zaženemo pretvornik kot ločen skript Python, ki ustvari YAML kot izhod. V primerjavi s prejšnjo metodo se ta metoda bolje skalira, saj je pretvorba ločena od podatkov.
Najprej ustvarimo datoteko JSON example.json, iz katere jo lahko na primer vzamete
{
"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"
}
}
}
}
}
Nato bomo ustvarili preprost pretvorniški skript in ga shranili pod imenom json2yaml.py. Ta skript uvozi oba modula YAML in JSON Python ter naloži uporabniško določeno datoteko JSON, izvede pretvorbo in zapiše podatke v datoteko 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()
Shranite ta skript na sistemsko pot in ga po potrebi zaženite:
$ ~/bin/json2yaml.py example.json
3. Razčlenjujte veliko in pogosto
Včasih je koristno pogledati na problem z drugega zornega kota. Če imate težave s predstavljanjem odnosov med svojimi podatki v YAML, jih lahko začasno spremenite v nekaj bolj znanega.
Če na primer ne znate delati s seznami slovarjev ali JSON, lahko YAML pretvorite v JSON s samo dvema ukazoma v interaktivni lupini Python. Recimo, da imate datoteko YAML mydata.yaml, potem bi izgledala takole:
$ 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 to temo lahko najdete veliko drugih primerov. Poleg tega je na voljo veliko spletnih pretvornikov in lokalnih razčlenjevalcev. Zato ne odlašajte s preoblikovanjem podatkov, ko v njih vidite samo nerazumljivo zmešnjavo.
4. Preberite specifikacije
Ob vrnitvi na YAML po dolgem premoru je koristno obiskati
5. Psevdokonfiguracije
Ko pišete knjigo ali članek, je vedno koristno najprej skicirati predhodni oris, vsaj v obliki kazala. Enako je z YAML. Najverjetneje imate predstavo o tem, katere podatke je treba zapisati v datoteko YAML, vendar v resnici ne razumete, kako jih povezati med seboj. Zato pred oblikovanjem YAML narišite psevdokonfiguracijo.
Pseudo-config je podoben psevdo-kodi, kjer vam ni treba skrbeti za strukturo ali zamik, odnose med staršem in otrokom, dedovanje in gnezdenje. Tukaj je enako: rišete iteracije podatkov, ko se pojavijo v vaši glavi.
Pseudo-config navaja programerje (Martin in Tabitha) in njihove veščine (programski jeziki: Python, Perl, Pascal in Lisp, Fortran, Erlang).
Ko na list papirja narišete psevdokonfiguracijo, jo natančno analizirajte in, če je vse v redu, formatirajte v obliki veljavne datoteke YAML.
6. Dilema med zavihki in presledki
Dilemo boste morali rešiti
V katerem koli običajnem urejevalniku besedila lahko nastavite samopopravne zavihke na določeno število presledkov, tako da upor ključnih privržencev Tab ni se ti treba bati.
Kot dobro ve vsak sovražnik YAML, na zaslonu ne vidite razlike med zavihki in presledki. In ko nekaj ni vidno, je to največkrat zadnje, česar se ljudje spomnijo, potem ko so preuredili, preverili in odpravili vse morebitne težave. Ena ura časa, porabljenega za iskanje tabelarne krivulje ali bloka presledkov, preprosto kriči, da morate nujno ustvariti pravilnik za uporabo enega ali drugega in nato izvesti armiranobetonsko preverjanje skladnosti z njim (na primer prek kavelj Git, da ga vsili skozi linter).
7. Manj je več (ali več je manj)
Nekateri ljudje radi pišejo v YAML, ker poudarja strukturo. Hkrati aktivno uporabljajo zamik za poudarjanje blokov podatkov. To je neke vrste prevara za posnemanje označevalnih jezikov, ki uporabljajo eksplicitna ločila.
Tukaj je primer takšne 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
Nekaterim ta možnost pomaga urediti strukturo YAML v svojih glavah, druge pa, nasprotno, razdraži s številnimi nepotrebnimi, po njihovem mnenju, alinejami.
Če pa ste lastnik dokumenta YAML in ste odgovorni za njegovo vzdrževanje, potem ti in samo ti mora določiti, kako uporabljati zamik. Če vas moti veliko oblazinjenje, naj bo čim manjše glede na specifikacijo YAML. Na primer, zgornjo datoteko iz dokumentacije Ansible je mogoče prepisati takole brez izgube:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Uporabite praznine
Če pri izpolnjevanju datoteke YAML nenehno ponavljate iste napake, je smiselno vanjo vstaviti predlogo kot komentar. Potem lahko naslednjič preprosto kopirate to predlogo in vanjo vnesete prave podatke, na primer:
---
# - <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. Uporabite nekaj drugačnega
Če vas aplikacija ne zadavi, bi bilo morda vredno spremeniti YAML v drugo obliko. Sčasoma lahko konfiguracijske datoteke prerastejo same sebe in takrat jih je bolje pretvoriti v preproste skripte v Lua ali Python.
YAML je odlična stvar, ki jo mnogi obožujejo zaradi minimalizma in preprostosti, vendar še zdaleč ni edino orodje v vašem arzenalu. Zato ga včasih lahko zavrnete. Knjižnice za razčlenjevanje za YAML je enostavno najti, tako da če ponudite enostavne možnosti selitve, bodo vaši uporabniki relativno neboleče preživeli to napako.
Če ne morete brez YAML-ja, potem upoštevajte teh 10 nasvetov in enkrat za vselej premagajte svojo odpor do YAML-ja!
Vir: www.habr.com