Všichni milujeme Ansible, ale Ansible je YAML. Existuje mnoho formátů pro konfigurační soubory: seznamy hodnot, páry parametr-hodnota, INI soubory, YAML, JSON, XML a mnoho dalších. Z několika důvodů, ze všech, je však YAML často považován za obzvláště obtížný. Zejména syntaxe YAML může i přes svůj osvěžující minimalismus a působivé možnosti práce s hierarchickými hodnotami otravovat svým přístupem k odsazení jako v Pythonu.
Pokud vás YAML naštve, můžete – a měli byste! - udělejte dalších 10 kroků, abyste snížili své podráždění na přijatelnou úroveň a milovali YAML. Jak se na tento seznam sluší a patří, našich deset tipů bude očíslováno od nuly, podle přání přidáme meditaci a duchovní praktiky 😉
0. Nechte svůj editor fungovat
Nezáleží na tom, jaký textový editor máte, pravděpodobně pro něj existuje alespoň jeden YAML plugin. Pokud žádný nemáte, okamžitě jej najděte a nainstalujte. Čas, který strávíte hledáním a přizpůsobováním, se vám mnohonásobně vrátí pokaždé, když budete potřebovat upravit YAML.
Například editor
Emacs v režimu YAML a zobrazování mezer.
Pokud váš oblíbený editor nemá režim YAML, pak lze některé problémy vyřešit prací s nastavením. Například výchozí textový editor pro GNOME, Gedit, nemá režim YAML, ale ve výchozím nastavení zvýrazňuje syntaxi YAML a umožňuje vám přizpůsobit odsazení:
Nastavení odsazení v Gedit.
Plugin
Jinými slovy, věnujte čas tomu, abyste se naučili svůj oblíbený editor. Zjistěte, co může on nebo jeho vývojová komunita nabídnout pro práci s YAML, a využijte těchto příležitostí. Rozhodně nebudete litovat.
1. Použijte linter
V ideálním případě programovací jazyky a značkovací jazyky používají předvídatelnou syntaxi. Počítače jsou dobré v předvídatelnosti, což je důvod, proč koncept
Chcete-li nainstalovat
$ sudo dnf install yamllint
Poté jednoduše spustíte yamllint a předáte mu soubor YAML k testování. Takto to vypadá, když linteru předáte soubor 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 vlevo nejsou čas, ale souřadnice chyby: číslo řádku a sloupce. Popis chyby vám možná nic neřekne, ale vy přesně víte, kde se nachází. Stačí se podívat na toto místo v kódu a s největší pravděpodobností bude vše jasné.
Když yamllint nenajde v souboru žádné chyby, nic se na obrazovku nevytiskne. Pokud vás takové ticho děsí a chcete trochu více zpětné vazby, můžete spustit linter s podmíněným příkazem echo přes dvojitý ampersand (&&), takto:
$ yamllint perfect.yaml && echo "OK"
OK
V POSIX se dvojitý ampersand spustí tehdy a pouze tehdy, když předchozí příkaz vrátí 0. A yamllint vrací pouze počet nalezených chyb, což je důvod, proč celá tato podmíněná konstrukce funguje.
2. Pište v Pythonu, ne v YAML
Pokud vás YAML opravdu štve, prostě do něj nepište, doslova. Stává se, že YAML je jediný formát, který aplikace akceptuje. V tomto případě však není nutné vytvářet soubor YAML. Pište na to, co se vám líbí, a pak převeďte. Existuje například skvělá knihovna pro Python
Samopřeměna
V tomto případě je datovým souborem také skript Python, který generuje YAML. Tato metoda je nejlepší pro malé datové sady. Jednoduše zapíšete data JSON do proměnné Pythonu, předpíšete ji direktivou importu a na konec souboru přidáte tři řádky pro implementaci 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
Nyní spustíme tento soubor v Pythonu a získáme soubor output.yaml jako výstup:
$ 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 dokonale platný YAML, ale yamllint vás upozorní, že nezačíná znakem -. To lze snadno opravit ručně nebo mírně upravit pomocí skriptu Python.
Konverze pomocí skriptů
V tomto případě nejprve zapíšeme v JSON a poté spustíme převodník jako samostatný skript Python, který jako výstup vytvoří YAML. Ve srovnání s předchozí metodou je tato metoda škálovatelná lépe, protože konverze je oddělená od dat.
Nejprve si vytvořte soubor JSON example.json, ze kterého si jej můžete vzít
{
"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"
}
}
}
}
}
Dále vytvoříme jednoduchý skript převodníku a uložíme jej jako json2yaml.py. Tento skript importuje moduly YAML i JSON Python, načte uživatelem zadaný soubor JSON, provede konverzi a zapíše data do souboru 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émové cesty a spusťte jej podle potřeby:
$ ~/bin/json2yaml.py example.json
3. Parsujte hodně a často
Někdy je užitečné podívat se na problém z jiného úhlu. Pokud máte potíže s reprezentací vztahů mezi vašimi daty v YAML, můžete je dočasně převést na něco známějšího.
Pokud vám například vyhovuje práce se seznamy slovníků nebo JSON, pak lze YAML převést na JSON pomocí pouhých dvou příkazů v interaktivním prostředí Pythonu. Řekněme, že máte soubor YAML mydata.yaml, pak by to vypadalo 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.'}
Existuje mnoho dalších příkladů na toto téma. Kromě toho je k dispozici mnoho online konvertorů a místních analyzátorů. Data tedy klidně přeformátujte, když v nich vidíte jen nesrozumitelný mišmaš.
4. Přečtěte si specifikace
Když se po dlouhé přestávce vracíme do YAML, je užitečné navštívit
5. Pseudokonfigurace
Při psaní knihy nebo článku je vždy dobré si nejprve načrtnout předběžnou osnovu, alespoň v podobě obsahu. To samé s YAML. S největší pravděpodobností máte představu o tom, jaká data by měla být zapsána do souboru YAML, ale ve skutečnosti nerozumíte tomu, jak je vzájemně propojit. Proto před vyřezáváním YAML nakreslete pseudo-config.
Pseudoconfig je jako pseudokód, kde se nemusíte starat o strukturu nebo odsazení, vztahy rodič-dítě, dědičnost a vnořování. Tak je to tady: kreslíte iterace dat tak, jak se objevují ve vaší hlavě.
Pseudoconfig seznam programátorů (Martin a Tabitha) a jejich dovednosti (programovací jazyky: Python, Perl, Pascal a Lisp, Fortran, Erlang, v tomto pořadí).
Po nakreslení pseudo-konfigurace na kus papíru ji pečlivě analyzujte, a pokud je vše v pořádku, naformátujte ji jako platný soubor YAML.
6. Dilema tabulátorů nebo mezer
Musíte vyřešit dilema
V každém normálním textovém editoru si můžete nastavit automatické nahrazování tabulátorů pro daný počet mezer, takže vzpoura vyznavačů klíče Tab nemůžete se bát.
Jak každý hater YAML dobře ví, mezi kartami a mezerami na obrazovce není žádný rozdíl. A když něco není vidět, pamatuje se to zpravidla jako poslední, až se to vytřídí, zkontroluje a odstraní všechny ostatní možné problémy. Hodina času promarněného hledáním karty nebo bloku mezer jen křičí, že naléhavě potřebujete vytvořit politiku pro používání jednoho nebo druhého a poté implementovat železobetonovou kontrolu jejich souladu (například pomocí háčku Git vynutit běh přes linter).
7. Méně je lepší (nebo více je méně)
Někteří lidé rádi píší v YAML, protože klade důraz na strukturu. Zároveň aktivně využívají odsazení ke zvýraznění bloků dat. Je to druh podvodu, který napodobuje značkovací jazyky, které používají explicitní oddělovače.
Zde je příklad takové struktury z
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Někomu tato možnost pomáhá rozložit strukturu YAML v hlavě, jiného naopak otravuje spoustou zbytečných, dle jejich názoru, odsazení.
Ale pokud jste vlastníkem dokumentu YAML a jste odpovědní za jeho údržbu, pak ty a jen ty by měl určit, jak používat odsazení. Pokud vás obtěžuje velké odsazení, omezte jej na minimum možné podle specifikace YAML. Například výše uvedený soubor z dokumentace Ansible lze přepsat takto bez jakékoli ztráty:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Použijte polotovary
Pokud při vyplňování YAML souboru stále opakujete stejné chyby, má smysl do něj jako komentář vložit prázdnou šablonu. Příště pak můžete toto prázdné místo jednoduše zkopírovat a zadat tam skutečná data, napří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žijte něco jiného
Pokud na vás aplikace netlačí, může být vhodné změnit YAML na jiný formát. Konfigurační soubory mohou časem přerůst samy a pak je lepší je převést na jednoduché skripty Lua nebo Python.
YAML je skvělá věc, kterou mnoho lidí miluje pro její minimalismus a jednoduchost, ale není to zdaleka jediný nástroj ve vašem arzenálu. Někdy to tedy můžete odmítnout. Je snadné najít parsovací knihovny pro YAML, takže pokud nabídnete pohodlné možnosti migrace, vaši uživatelé takové odmítnutí přežijí relativně bezbolestně.
Pokud se bez YAML neobejdete, pak využijte těchto 10 tipů a porazte svou nechuť k YAML jednou provždy!
Zdroj: www.habr.com