Vsi imamo radi Ansible, vendar je Ansible – YAML. Za konfiguracijske datoteke obstaja veliko formatov: sezname vrednosti, pare "parameter-vrednost", INI-datoteke, YAML, JSON, XML in še mnoge druge. Kljub temu pa je iz več razlogov YAML pogosto obravnavan kot še posebej težaven. Zlasti, kljub njegovi osvežilni minimalistični naravi in impresivnim zmogljivostim za delo s hierarhičnimi vrednostmi, lahko sintaksa YAML razjezi s svojim pristopom k zamikom, ki je podoben Pythonu.

Če vas YAML jezdi, lahko – in bi morali! – sprejeti 10 naslednjih korakov, da zmanjšate svoje nelagodje na sprejemljivo raven in vzljubite YAML. Tako kot pravi seznam, bo naših deset nasvetov začelo z ničlo, meditacijo in duhovne prakse dodajte po želji 😉
0. Prisilite svoj urejevalnik, da deluje
Ni važno, kateri besedilni urejevalnik imate – za njega zagotovo obstaja vsaj en vtičnik za delo z YAML. Če ga nimate, takoj poiščite in namestite. Čas, porabljen za iskanje in nastavitev, se bo večkrat povrnil vsakič, ko boste morali urejati YAML.
Na primer, urejevalnik privzeto podpira YAML, za GNU Emacs pa boste morali namestiti dodatne pakete, na primer, .

Emacs v načinu YAML in prikazovanju prostorov.
Če vaš najljubši urejevalnik nima YAML načina, lahko del težav rešite z nastavitvami. Na primer, privzeti GNOME besedilni urejevalnik Gedit nima YAML načina, vendar privzeto poudarja sintakso YAML in omogoča prilagoditev dela z zamiki:

Nastavitev zamikov v Gedit.
In vtičnik za Gedit prikazuje prostore v obliki pika, kar odpravlja nejasnosti glede ravni zamika.
Z drugimi besedami, porabite čas za raziskovanje svojega najljubšega urejevalnika. Ugotovite, kaj ponuja sam ali njegova razvojna skupnost za delo z YAML, in izkoristite te možnosti. Gotovo vam ne bo žal.
1. Uporabite linter
Idejno bi morali programski jeziki in jeziki označevanja uporabljati predvidljivo sintakso. Računalniki se dobro spopadajo s predvidljivostjo, zato je že leta 1978 nastala koncept . Če vas ta koncept ni prehitel v 40 letih njegovega obstoja in še vedno ne uporabljate YAML- lintra, je zdaj pravi čas, da preizkusite yamllint.
Namestiti lahko preko privzetega upravljalnika paketov Linux. Na primer, v 8 ali to se stori takole:
$ sudo dnf install yamllint
Potem preprosto zaženete yamllint, mu predate YAML datoteko za preverjanje. Tako izgleda, če mu predate datoteko z napako:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 napaka napaka sintakse: vrednosti za preslikavo niso dovoljene tu
23:11 napaka odvečni presledki (trailing-spaces)
Številke na levi niso čas, temveč koordinate napake: številka vrstice in stolpca. Opis napake vam morda ne bo pomenil veliko, vendar točno veste, kje se nahaja. Preprosto poglejte to mesto v kodi in zelo verjetno boste vse razumeli.
Ko yamllint ne najde napak v datoteki, na zaslonu ne izpiše ničesar. Če vas ta tišina prestraši in si želite nekoliko več povratnih informacij, ga lahko zaženete z drugimi ukazi echo s podvojeno ampersand (&&), takole:
$ yamllint perfect.yaml && echo "OK"
OK
V POSIX se podvojena ampersand aktivira šele, ko prejšnji ukaz vrne 0. Yamllint pa vrne število najdenih napak, zato deluje celotna konstrukcija.
2. Pisanje v Pythonu, ne pa v YAML-u
Če vas YAML resnično moti, preprosto ne pišite z njim, v dobesednem smislu. Včasih je YAML edini format, ki ga aplikacija razume. Vendar v tem primeru ni nujno ustvariti YAML datoteke. Pišite v tistem, kar vam je všeč, in nato pretvorite. Na primer, za Python obstaja odlična knjižnica in kar dva načina pretvorbe: samopretvorba in pretvorba preko skriptov.
Samopretvorba
V tem primeru je datoteka z podatki obenem tudi Python skript, ki generira YAML. Ta način je najbolj primeren za majhne nize podatkov. Preprosto napišete JSON podatke v Python spremenljivko, pred njo dodate direktivo import, na koncu datoteke pa dodate tri vrstice za izvajanje 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ženite to datoteko na Pythonu in na izhodu dobite datoteko output.yaml:
$ python3 .\/example.json
$ cat output.yaml
glossary:
GlossDiv:
GlossList:
GlossEntry:
Abbrev: ISO 8879:1986
Acronym: SGML
GlossDef:
GlossSeeAlso: [GML, XML]
para: Meta-markup jezik, ki se uporablja za ustvarjanje markup jezikov, kot je DocBook.
GlossSee: markup
GlossTerm: Standard Generalized Markup Language
ID: SGML
SortAs: SGML
title: S
title: preglednica primerov
To je popolnoma veljaven YAML, vendar bo yamllint opozoril, da se ne začne z —. Dobro, to lahko enostavno popravite ročno ali rahlo predelate Python skript.
Pretvorba preko skriptov
V tem primeru najprej pišemo v JSON-u, nato pa zagnamo pretvornik kot ločen Python skript, ki na izhodu daje YAML. V primerjavi s prejšnjo je ta način bolj razširljiv, saj je pretvorba podatkov ločena.
Najprej ustvarimo JSON-datoteko example.json, na primer, lahko jo vzamemo s :
{
"glossary": {
"title": "primer slovarja",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standardni generalizirani označevalni jezik",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "Meta-označevalni jezik, ki se uporablja za ustvarjanje označevalnih jezikov, kot je DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "označevanje"
}
}
}
}
}
Nato bomo ustvarili preprost skript-pretvornik in ga shranili pod imenom json2yaml.py. Ta skript uvozi oba modula — YAML in JSON Python ter naloži datoteko JSON, ki jo uporabnik izbere, 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()
Shranjevanje tega skripta v sistemsko pot in ga lahko po potrebi zaženete:
$ ~/bin/json2yaml.py example.json
3. Pogosto analizirajte
Včasih je koristno na problem pogledati z drugega kota. Če vam je težko predstavljati povezave med podatki v YAML-u, jih lahko začasno pretvorite v nekaj bolj običajnega.
Na primer, če vam je lažje delati s seznami besednikov ali z JSON-om, lahko YAML pretvorite v JSON v dveh preprostih ukazih v interaktivnem Python okolju. Recimo, da imate YAML datoteko mydata.yaml, takole bo izgledalo:
$ 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': 'Dober članek. Lahko bi bil boljši.'}
Na to temo lahko najdete še številne druge primere. Poleg tega je na voljo veliko spletnih pretvornikov in lokalnih parserjev. Zato se ne bojte preoblikovati podatkov, kadar vidite le zmedo.
4. Berite specifikacije
Ko se po dolgem času vrnete k YAML-u, je koristno obiskati in prebrati specifikacije. Če imate težave z YAML-om, vendar še niste uspeli priti do specifikacij, je čas, da to situacijo odpravite. Specifikacije so presenetljivo lahko napisane, zahteve po sintaksi pa so ilustrirane s številnimi primeri v .
5. Psevdo-konfiguracije
При написании книги или статьи всегда полезно сперва набросать предварительный план, хотя бы в виде оглавления. Так же и с YAML. Скорее всего, вы представляете, какие данные надо записать в файл YAML, но не очень понимаете, как связать их друг с другом. Поэтому прежде чем ваять YAML, нарисуйте псевдоконфиг.
Псевдоконфиг похож на псевдокод, где не надо заботиться о структуре или отступах, отношениях «родитель-потомок», наследовании и вложенности. Так и здесь: вы рисуете итерации данных по мере того, как они возникают у вас в голове.

Псевдоконфиг с перечислением программистов (Martin и Tabitha) и их навыков (языков программирования: Python, Perl, Pascal и Lisp, Fortran, Erlang, соответственно).
Нарисовав псевдоконфиг на листе бумаги, внимательно проанализируйте его и, если все в порядке, оформите в виде валидного YAML-файла.
6. Дилемма «табуляция или пробелы»
Вам придется решить дилемму . Не в глобальном смысле, а лишь на уровне вашей организации, или хотя бы проекта. Неважно, будет ли при этом использоваться пост-обработка скриптом sed, настройка текстовых редакторов на машинах программистов или же поголовное взятие расписок о строгом соблюдении указаний линтера под угрозой увольнения, но все члены вашей команды, которые так или иначе касаются YAML, в обязательном порядке должны использовать только пробелы (как того требует спецификация YAML).
В любом нормальном текстовом редакторе можно настроить автозамену табуляции на заданное количество пробелов, поэтому бунта приверженцев клавиши Tab можно не бояться.
Как хорошо известно каждому ненавистнику YAML, на экране не видно разницы между табуляцией и пробелами. А когда чего-то не видно, об этом, как правило, вспоминают в последнюю очередь, после того, как перебрали, проверили и устранили все остальные возможные проблемы. Час времени, убитый на поиск кривой табуляции или блока пробелов, просто вопиет о том, что вам над срочно создать политику использования того или другого, а затем реализовать железобетонную проверку ее соблюдения (например, через Git-хук для принудительного прогона через линтер).
7. Лучше меньше да лучше (или больше – это меньше)
Nekateri ljudje radi pišejo v YAML, ker izpostavlja strukturo. Pri tem aktivno uporabljajo zamike, da označijo podatkovne bloke. To je nekakšna goljufija za posnemanje markup jezikov, ki uporabljajo jasne ločilne znake.
Tukaj je primer takšne strukturiranosti iz :
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Nekomu ta različica pomaga razložiti strukturo YAML, druge pa nasprotno moti z množico odvečnih zamikov, ki se jim zdijo nepotrebni.
Toda če ste lastnik dokumenta YAML in ste odgovorni za njegovo vzdrževanje, potem ste samo vi tisti, ki bi morali določiti, kako uporabljati zamike. Če vas motijo veliki zamiki, jih zmanjšajte na minimum, ki je mogoč glede na specifikacijo YAML. Na primer, zgornjo datoteko iz dokumentacije Ansible je mogoče brez kakršnekoli izgube prepisati takole:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Uporabite predloge
Če pri izpolnjevanju datoteke YAML nenehno ponavljate iste napake, je smiselno vstaviti vanjo predlogo v obliki komentarja. Tako boste lahko naslednjič preprosto kopirali to predlogo in vanjo vnesli 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 drugega
Če vas aplikacija ne drži v hladnem objemu, potem morda velja preiti z YAML na drug format. Sčasoma lahko konfiguracijske datoteke prerastejo samo sebe in takrat je bolje, da jih pretvorite v preproste skripte v Luu ali Pythonu.
YAML je super stvar, ki jo mnogi obožujejo zaradi minimalizma in preprostosti, vendar to ni edino orodje v vašem arzenalu. Tako da ga lahko občasno opustite. Za YAML lahko enostavno najdete knjižnice za razčlenjevanje, zato, če ponudite priročne možnosti migracije, bodo vaši uporabniki to spremembo relativno brez bolečin prenesli.
Če pa brez YAML ne morete, se oborite s temi 10 nasveti in premagajte svojo antipatijo do YAML enkrat za vselej!
Izvor: habr.com
