Mindannyian szeretjük az Ansible-t, de az Ansible a YAML. A konfigurációs fájloknak számos formátuma létezik: értéklisták, paraméter-érték párok, INI-fájlok, YAML, JSON, XML és még sok más. Azonban ezek közül több okból is a YAML-t gyakran különösen nehéznek tartják. Az üdítő minimalizmus és a hierarchikus értékekkel való munka lenyűgöző képességei ellenére a YAML szintaxis bosszantó lehet a behúzás Python-szerű megközelítésével.
Ha a YAML feldühít, megteheti – és meg kell tennie! – Tedd meg a következő 10 lépést, hogy elfogadható szintre csökkentsd a frusztrációdat, és megszeresd a YAML-t. Ahogy ehhez a listához illik, tíz tippünk a nulláról lesz számozva, meditációt és spirituális gyakorlatokat tetszés szerint adunk hozzá 😉
0. Tegye működőképessé a szerkesztőjét
Nem számít, milyen szövegszerkesztővel rendelkezik, valószínűleg van legalább egy bővítmény a YAML-lel való együttműködéshez. Ha nem rendelkezik ilyennel, azonnal keresse meg és telepítse. A keresésre és beállításra fordított idő többszörösen megtérül minden alkalommal, amikor szerkesztenie kell a YAML-t.
Például szerkesztő
Emacs YAML módban és szóközök megjelenítésével.
Ha kedvenc szerkesztője nem rendelkezik YAML móddal, akkor néhány probléma megoldható a beállításokkal. Például a szabványos GNOME szövegszerkesztő Gedit nem rendelkezik YAML móddal, de alapértelmezés szerint kiemeli a YAML szintaxist, és lehetővé teszi a behúzásokkal végzett munka konfigurálását:
Behúzások beállítása Geditben.
Egy plugin
Más szóval, töltsön időt kedvenc szerkesztője megismerésével. Tudja meg, mit kínál ő vagy fejlesztői közössége a YAML-lel való együttműködéshez, és használja ezeket a szolgáltatásokat. Biztosan nem fogja megbánni.
1. Használjon lintert
Ideális esetben a programozási nyelvek és a jelölőnyelvek kiszámítható szintaxist használnak. A számítógépek jók a kiszámíthatóságban, ezért a koncepció a
megállapítása
$ sudo dnf install yamllint
Ezután egyszerűen futtassa a yamllint, és átadja neki a YAML fájlt az ellenőrzéshez. Így néz ki, ha hibás fájlt ad át a linternek:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
A bal oldali számok nem az időt, hanem a hiba koordinátáit jelentik: sor- és oszlopszám. Lehet, hogy a hiba leírása nem mond semmit, de pontosan tudja, hol van. Csak nézze meg ezt a helyet a kódban, és valószínűleg minden világossá válik.
Ha a yamllint nem talál hibát egy fájlban, a rendszer semmit sem nyomtat a képernyőre. Ha ez a csend megrémít, és egy kicsit több visszajelzést szeretne, akkor a feltételes echo paranccsal futtathatja a lintert egy dupla és (&&) jellel, így:
$ yamllint perfect.yaml && echo "OK"
OK
A POSIX-ben a dupla „és” jel akkor és csak akkor aktiválódik, ha az előző parancs 0-val tér vissza. A yamllint pedig csak a talált hibák számát adja vissza, ezért működik ez az egész feltételes konstrukció.
2. Pythonban írj, ne YAML-ban
Ha a YAML nagyon feldühít, csak szó szerint ne írj bele. Előfordul, hogy a YAML az egyetlen formátum, amelyet az alkalmazás megért. De még ebben az esetben sem szükséges YAML fájlt létrehozni. Írj rá, ami tetszik, majd alakítsd át. Például van egy nagyszerű könyvtár a Python számára
Önkonverzió
Ebben az esetben az adatfájl egy Python-szkript is, amely YAML-t generál. Ez a módszer a legalkalmasabb kis adathalmazokhoz. Egyszerűen írja be a JSON-adatokat egy Python-változóba, írja be az importálási direktívát, és a fájl végéhez adjon hozzá három sort a kimenet megvalósításához.
#!/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 futtatjuk ezt a fájlt Pythonban, és megkapjuk az output.yaml fájlt:
$ 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
Ez tökéletesen érvényes YAML, de a yamllint figyelmezteti Önt, hogy nem - karakterrel kezdődik. Nos, ez könnyen kijavítható manuálisan, vagy kissé módosítható a Python szkriptben.
Konverzió szkripteken keresztül
Ebben az esetben először JSON-ban írunk, majd külön Python-szkriptként futtatjuk a konvertert, amely kimenetként YAML-t állít elő. Az előző módszerhez képest ez a módszer jobban skálázódik, mivel a konverzió elkülönül az adatoktól.
Először hozzunk létre egy example.json JSON-fájlt, amelyből például átveheti
{
"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"
}
}
}
}
}
Ezután létrehozunk egy egyszerű konverter szkriptet, és elmentjük json2yaml.py néven. Ez a szkript a YAML és a JSON Python modulokat is importálja, és betölt egy felhasználó által megadott JSON-fájlt, végrehajtja az átalakítást, és az adatokat az output.yaml fájlba írja.
#!/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 ezt a szkriptet a rendszer elérési útjába, és szükség szerint futtassa:
$ ~/bin/json2yaml.py example.json
3. Sokat és gyakran elemezzen
Néha hasznos, ha egy problémát más szemszögből nézünk. Ha problémái vannak az adatok közötti kapcsolatok YAML-ben való megjelenítésével, átmenetileg átalakíthatja őket valami ismerősebbé.
Ha például jól érzi magát a szótárlistákkal vagy a JSON-nal, akkor az interaktív Python-héjban mindössze két paranccsal konvertálhatja a YAML-t JSON-ba. Tegyük fel, hogy van egy mydata.yaml YAML-fájlja, akkor ez így fog kinézni:
$ 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.'}
Sok más példát is találhat ebben a témában. Ezen kívül számos online konverter és helyi elemző is elérhető. Tehát ne habozzon újraformázni az adatokat, ha csak egy érthetetlen zagyvaságot lát benne.
4. Olvassa el a specifikációkat
Hosszú szünet után visszatérve a YAML-hez, érdemes meglátogatni
5. Álkonfigok
Egy könyv vagy cikk írásakor mindig hasznos először felvázolni egy előzetes vázlatot, legalább tartalomjegyzék formájában. Ugyanez a helyzet a YAML-lel. Valószínűleg van fogalma arról, hogy milyen adatokat kell beírni egy YAML-fájlba, de nem igazán érti, hogyan kapcsolja össze őket. Ezért a YAML formázása előtt rajzoljon egy pszeudo-konfigurációt.
A pszeudo-konfig hasonló a pszeudo-kódhoz, ahol nem kell aggódnia a szerkezet vagy a behúzás, a szülő-gyermek kapcsolatok, az öröklődés és a beágyazás miatt. Ugyanez itt is: megrajzolja az adatok iterációit, ahogy azok a fejedben keletkeznek.
Álkonfig listázó programozók (Martin és Tabitha) és képességeik (programozási nyelvek: Python, Perl, Pascal és Lisp, Fortran, Erlang).
Miután rajzolt egy pszeudo-konfigot egy papírra, alaposan elemezze azt, és ha minden rendben van, formázza érvényes YAML fájl formájában.
6. A Tabulátorok és a szóközök dilemma
Meg kell oldanod a dilemmát
Bármely normál szövegszerkesztőben beállíthatja az automatikus javító tabulátorokat meghatározott számú szóközhöz, így a kulcsfontosságú hívek lázadása Tab nem kell félned.
Amint azt minden YAML-gyűlölő jól tudja, nem lehet látni a különbséget a tabulátorok és a szóközök között a képernyőn. És ha valami nem látható, az általában az utolsó dolog, amire az emberek emlékeznek, miután az összes többi lehetséges problémát átválogatták, ellenőrizték és kiküszöbölték. Egy óra táblázatos görbe vagy szóköztömb keresésével eltöltött idő egyszerűen azt kiabálja, hogy sürgősen létre kell hoznia egy szabályzatot az egyik vagy a másik használatára vonatkozóan, majd végre kell hajtania egy vasbeton ellenőrzést annak betartására (például egy Git horog, hogy átnyomja egy szálon).
7. A kevesebb több (vagy a több kevesebb)
Vannak, akik szeretnek YAML nyelven írni, mert az hangsúlyozza a szerkezetet. Ugyanakkor aktívan használják a behúzást az adatblokkok kiemelésére. Ez egyfajta átverés az explicit elválasztójeleket használó jelölőnyelvek utánzására.
Itt van egy példa egy ilyen szerkezetre
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Egyesek számára ez a lehetőség segít rendezni a YAML-struktúrát a fejében, másokat éppen ellenkezőleg, sok, véleményük szerint felesleges behúzással irritálja.
De ha Ön a YAML-dokumentum tulajdonosa, és felelős a karbantartásáért, akkor te és csak te meg kell határoznia a behúzás használatának módját. Ha bosszantja a nagy párnázás, tartsa a lehető legkisebbre a YAML specifikáció szerint. Például a fenti fájl az Ansible dokumentációból veszteség nélkül átírható így:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Használjon üreseket
Ha folyamatosan ismétli ugyanazokat a hibákat egy YAML-fájl kitöltésekor, akkor érdemes megjegyzésként sablont beszúrni abba. Majd legközelebb egyszerűen másolhatja ezt a sablont, és valós adatokat írhat be, például:
---
# - <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álj valami mást
Ha az alkalmazás nem rendelkezik fojtogatóval, akkor érdemes lehet a YAML-t másik formátumra cserélni. Idővel a konfigurációs fájlok kinőhetik magukat, és jobb, ha egyszerű szkriptekké konvertálják őket Lua vagy Python nyelven.
A YAML egy nagyszerű dolog, amelyet sokan szeretnek minimalizmusa és egyszerűsége miatt, de messze nem az egyetlen eszköz a fegyvertárban. Szóval néha megtagadhatod. Az elemző könyvtárakat könnyű megtalálni a YAML számára, így ha egyszerű migrációs lehetőségeket kínál, a felhasználók viszonylag fájdalommentesen túlélik ezt a hibát.
Ha nem tudsz meglenni a YAML nélkül, akkor fogadd meg ezt a 10 tippet, és győzd le végleg a YAML iránti ellenszenvét!
Forrás: will.com