10 lépés a YAML zenhez

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.

10 lépés a YAML zenhez

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ő Atom alapértelmezetten támogatja a YAML-t, míg a GNU Emacs esetében további csomagokat kell telepíteni, például a yaml-mode.

10 lépés a YAML zenhez

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:

10 lépés a YAML zenhez

Behúzások beállítása a Geditben.

A drawspaces 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 linter. 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 yamllint ez a Linux szokásos csomagkezelőjével lehetséges. Például, Red Hat Enterprise Linux 8 vagy Fedora 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, pyyaml é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: json.org:

{
	"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 yaml.org -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 6. Fejezetben.

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.

10 lépés a YAML zenhez

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 "tabulátor vagy szóköz?". 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 Ansible dokumentációjából.:

# 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

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster