Mindenki szereti az Ansible-t, de az Ansible YAML. A konfigurációs fájlokhoz rengeteg formátum létezik: értékliste, „kulcs-érték” párok, INI-fájlok, YAML, JSON, XML és még sok más. Azonban néhány okból kifolyólag a YAML-t gyakran különösen nehéznek tartják. Különösen azért, mert a frissítő minimalizmusa és lenyűgöző hierarchikus értékkezelési lehetőségei ellenére a YAML szintaxisa frusztráló lehet Python-szerű behúzásaival.

Ha bosszant a YAML, akkor 10 lépést tehetsz – és kell is! – hogy csökkentsd a frusztrációdat egy elfogadható szintre és megszeresd a YAML-t. Mint a valódi listához illik, a tippjeink nullától kezdődnek, a meditációt és a spirituális gyakorlatokat pedig igény szerint hozzáadhatod 😉
0. Kényszerítsd a szerkesztődet dolgozni
Nem számít, milyen szövegszerkesztőt használsz – biztosan létezik legalább egy plug-in, amely a YAML-lal foglalkozik. Ha nincs, azonnal keresd meg és telepítsd. Az idő, amit a keresésre és a beállításokra fordítasz, többszörösen meg fog térülni, amikor YAML-t kell szerkesztened.
Például a szerkesztő alapértelmezetten támogatja a YAML-t, míg a GNU Emacs esetében további csomagokat kell telepíteni, például a .

Emacs YAML módban és szóközökkel való megjelenítéséhez.
Ha a kedvenc szerkesztőd nem rendelkezik YAML móddal, a beállításokon keresztül néhány problémát orvosolhatsz. Például a GNOME natív szövegszerkesztője, a Gedit, nem rendelkezik YAML móddal, de alapértelmezetten szintaxisszínezést biztosít a YAML-hoz, és lehetővé teszi a behúzások beállítását:

Behúzások beállítása a Geditben.
A plug-in a Gedithez a szóközöket pontokként jeleníti meg, ezáltal megszünteti a behúzási szintekkel kapcsolatos bizonytalanságokat.
Más szavakkal, szánj időt a kedvenc szerkesztőd megismerésére. Derítsd ki, hogy ő vagy a fejlesztőközössége mit kínál a YAML kezelésére, és használd ezeket a lehetőségeket. Biztosan nem fogsz csalódni.
1. Használj lint-ert
Ideális esetben a programozási nyelvek és a jelölőnyelvek előre megjósolható szintaxist használnak. A számítógépek jól boldogulnak a kiszámíthatósággal, ezért már 1978-ban megszületett a . Ha a 40 év alatt, amióta létezik, elkerült téged, és még mindig nem használsz YAML-lintert, most itt az ideje kipróbálni a yamllint.
Telepítse ez a Linux szokásos csomagkezelőjével lehetséges. Például, 8 vagy ezt így lehet megtenni:
$ sudo dnf install yamllint
Ezután egyszerűen futtathatja a yamllint-et, átadva neki a vizsgálni kívánt YAML fájlt. Így néz ki, ha egy hibás fájlt ad át a linternek:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error szintaxis hiba: itt nem engedélyezett mappaértékek
23:11 error felesleges szóközök (trailing-spaces)
A bal oldali számok nem időpontok, hanem a hiba koordinátái: a sor és az oszlop száma. A hiba leírása lehet, hogy nem mond Önnek semmit, de pontosan tudja, hol található. Csak nézze meg azt a részt a kódban, és valószínűleg minden világossá válik.
Amikor a yamllint nem talál hibákat a fájlban, nem jelenik meg semmi a képernyőn. Ha megijed a csendtől, és szeretne egy kicsivel több visszajelzést, indíthatja a lintet egy feltételes echo parancs segítségével, kettős ampersand (&&), így:
$ yamllint perfect.yaml && echo "OK"
OK
A POSIX alatt a kettős ampersand csak akkor működik, ha az azt megelőző parancs 0-t ad vissza. A yamllint pedig éppen a talált hibák számát adja vissza, így ez az egész feltételes szerkezet működik.
2. Írjon Pythonban, ne YAML-ban
Ha a YAML valóban zavarja, ne is írjon benne, szó szerint. Előfordulhat, hogy a YAML az egyetlen formátum, amelyet az alkalmazás elfogad. De még ilyen esetben sem szükséges YAML-fájlt létrehozni. Írjon abban, ami tetszik, majd konvertálja. Például a Pythonhoz van egy nagyszerű könyvtár, és egész pontosan két konvertálási mód: önkonvertálás és szkripten keresztüli konvertálás.
Önkonvertálás
Ebben az esetben az adatokat tartalmazó fájl egyúttal egy Python-szkript is, amely YAML-t generál. Ez a módszer a legjobban a kisebb adathalmazokhoz illik. Egyszerűen írja be a JSON-adatokat egy Python-változóba, előzze meg ezt egy import direktívával, és a fájl végén adjon hozzá három sort a kimenethez.
#!/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
Most futtassuk ezt a fájlt Pythonban, és a kimenet a output.yaml fájlt kapjuk:
$ python3 .\/example.json
$ cat output.yaml
glossary:
GlossDiv:
GlossList:
GlossEntry:
Abbrev: ISO 8879:1986
Acronym: SGML
GlossDef:
GlossSeeAlso: [GML, XML]
para: Egy meta-megjelölési nyelv, amelyet olyan megjelölési nyelvek létrehozására használnak, mint a DocBook.
GlossSee: markup
GlossTerm: Standard Generalized Markup Language
ID: SGML
SortAs: SGML
title: S
title: példa glosszárium
Ez teljesen helyes YAML, de a yamllint figyelmeztetést ad, hogy nem — jellel kezdődik. Nos, ezt könnyen meg lehet javítani kézzel, vagy a Python-szkripten egy kis módosítást végezhet.
Átírás skriptek segítségével
Ebben az esetben először JSON-ban írunk, majd elindítjuk az átalakítót, mint egy külön Python-skript, amely kimenetként YAML-t ad. Az előzőhöz képest ez a módszer jobban méretezhető, mivel az átalakítás az adatokat elválasztva történik.
Először létrehozunk egy example.json nevű JSON-fájlt, amelyet például innen szerezhetünk be: :
{
"glossary": {
"title": "példa szószedet",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "Egy meta-márkázási nyelv, amelyet olyan márkázási nyelvek létrehozására használnak, mint a DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "márkázás"
}
}
}
}
}
Ezután létrehozunk egy egyszerű átalakító skriptet, és elmentjük json2yaml.py néven. Ez a skript importálja mindkét modult — YAML és JSON Python — valamint betölti a felhasználó által megadott JSON-fájlt, végrehajtja az átalakítást és írja az adatokat az output.yaml fájlba.
#!/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()
Mentse el ezt a skriptet a rendszer útvonalába, és indítsa el szükség szerint:
$ ~/bin/json2yaml.py example.json
3. Parse-oljon sokat és gyakran
Néha hasznos más szemszögből ránézni a problémára. Ha nehezen tudja elképzelni az adatok közötti kapcsolatokat YAML-ban, ideiglenesen átalakíthatja őket valami ismerősebbé.
Például, ha kényelmesebben dolgozik szótári listákkal vagy JSON-nal, akkor a YAML könnyen átalakítható JSON-ra mindössze két parancs segítségével a Python interaktív terében. Tegyük fel, hogy van egy mydata.yaml nevű YAML-fája, akkor így néz ki:
$ 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': 'Jó cikk. Lehetett volna jobb.'}
Ezzel a témával kapcsolatban rengeteg egyéb példa található. Ezen kívül sok online átalakító és helyi elemző is elérhető. Így ne habozzon az adatok átalakításával, ha csak zűrzavart lát bennük.
4. Olvassa el a specifikációkat
Ha hosszú kihagyás után visszatér a YAML-hoz, hasznos lehet ellátogatni a -ra és újra elolvasni a specifikációkat. Ha nehézségei vannak a YAML-lal, de még nem jutott el a specifikációkig, ideje megoldani ezt a helyzetet. A specifikációk meglepően könnyen íródtak, és a szintaktikai követelményeket sok példa illusztrálja a .
5. Pseudo-konfigurációk
Egy könyv vagy cikk írása során mindig hasznos először egy vázlatot készíteni, legalább egy tartalomjegyzék formájában. Ugyanez vonatkozik a YAML-ra is. Valószínűleg tudja, hogy milyen adatokat kell beírni a YAML fájlba, de nem igazán érti, hogyan lehet azokat összekapcsolni. Ezért mielőtt nekilátna a YAML elkészítésének, rajzoljon egy álkonfigurációt.
Az álkonfiguráció hasonlít az álkódhoz, ahol nem kell aggódni a struktúráért, a behúzásokért, a "szülő-gyermek" kapcsolatokért, az öröklésért és a beágyazottságért. Ugyanez itt is: adatiterációkat rajzol, ahogy azok eszébe jutnak.

Az álkonfiguráció, amelyben programozók (Martin és Tabitha) és a készségeik (programozási nyelvek: Python, Perl, Pascal és Lisp, Fortran, Erlang) vannak felsorolva.
Miután az álkonfigurációt papíron megrajzolta, alaposan elemezze azt, és ha minden rendben van, alakítsa valid YAML fájlokká.
6. A "tabulátor vagy szóköz" dilemma
Meg kell oldania a dilemmát . Nem globális értelemben, csak a saját szervezetük, vagy legalább a projekt szintjén. Nem számít, hogy lesz-e utófeldolgozás sed szkripttel, szövegszerkesztők beállítása programozók gépein, vagy az irányelvek szigorú betartásáról való nyilatkozatok beszedése a kirúgás fenyegetése mellett, de csapatának minden tagjának, aki valamilyen módon érintett a YAML-ban, mindenképpen csak szóközöket kell használnia (ahogy azt a YAML specifikáció megköveteli).
Bármely normális szövegszerkesztőben beállíthatja a tabulátor szóközre való automatikus cserélését, ezért nem kell félni a tabulátor gomb híveinek lázadásától, Tab tudja, hogy nem kell félni.
Amint azt minden YAML-gyűlölő jól tudja, a képernyőn nem látható különbség a tabulátor és a szóközök között. És ha valami nem látható, arról általában utoljára szoktak eszébe jutni, miután átnézték, ellenőrizték és megszüntették az összes többi lehetséges problémát. Egy óra, amelyet egy elcsúszott tabulátor vagy szóközblokk keresésére költ, félelmetesen mutatja, hogy sürgősen létre kell hozni egy politikát annak használatáról, és aztán megvalósítani egy sziklaszilárd ellenőrzést a betartásáról (például egy Git-hookon keresztül kényszerített linter futtatásával).
7. Jobb a kevesebb, de jobb (vagy a több – az kevesebb)
Néhányan szeretik a YAML használatát, mert hangsúlyozza a struktúrát. Eközben aktívan használják a behúzásokat az adatblokkok kiemelésére. Ez egyfajta trükk a jelölőnyelvek utánzására, amelyek explicit elválasztókat használnak.
Íme egy példa az ilyen strukturalitásra a :
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Valakinek ez a lehetőség segít elrendezni a YAML struktúráját a fejében, másokat viszont éppen a sok, számukra felesleges behúzás idegesít.
De ha Ön a YAML-dokumentum tulajdonosa és felelős annak fenntartásáért, akkor csak Ön határozza meg, hogyan használja a behúzásokat. Ha a nagy behúzások idegesítik, csökkentse a lehető legkisebbre, ahogyan azt a YAML specifikációja megengedi. Például a fenti Ansible dokumentumból származó fájl bármilyen veszteség nélkül így átírható:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Használjon sablonokat.
Ha a YAML fájl kitöltésekor folyamatosan ugyanazokat a hibákat ismétli, érdemes megfontolni egy sablon használatát kommentként a fájlban. Akkor legközelebb egyszerűen másolhatja ezt a sablont és beírhatja a valós adatokat:
---
# - <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. Használjon valami mást.
Ha az alkalmazás nem tartja Önt szorosan, akkor érdemes lehet a YAML helyett egy másik formátumra váltani. Az idő múlásával a konfigurációs fájlok önállóvá válhatnak, akkor jobban átalakítani őket egyszerű Lua vagy Python szkriptekre.
A YAML nagyszerű dolog, amit sokan a minimalizmusa és egyszerűsége miatt szeretnek, de ez messze nem az egyetlen eszköz a tarsolyában. Tehát néha meg lehet válni tőle. A YAML-hoz könnyű parser könyvtárakat találni, így ha kényelmes migrálási lehetőségeket kínál, a felhasználói viszonylag fájdalommentesen átvészelik az ilyen lemondást.
Ha viszont a YAML-t elkerülni nem lehet, akkor vegye elő ezeket a 10 tippet, és győzze le a YAML iránti averszióját egyszer s mindenkorra!
Forrás: habr.com
