10 lépés a YAML Zenhez

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.

10 lépés a YAML Zenhez

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ő atom alapértelmezés szerint támogatja a YAML-t, de a GNU Emacs esetén további csomagokat kell telepítenie, például yaml-mód.

10 lépés a YAML Zenhez

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:

10 lépés a YAML Zenhez

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

Egy plugin húzóterek A Gedit esetében a szóközöket pontként jeleníti meg, kiküszöbölve a kétértelműségeket a behúzási szintekkel.

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 lintera. Ha fennállásának 40 éve alatt elment, és még mindig nem használ YAML lintert, akkor ideje kipróbálni a yamllint.

megállapítása yamllint Használhatja a szabványos Linux csomagkezelőt. Például be Red Hat Enterprise Linux 8 vagy Fedora így történik:

$ 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 pyyaml és két konverziós módszer: önkonverzió és konverzió szkripteken keresztül.

Ö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 json.org:

{
	"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 yaml.org és olvassa el újra a specifikációkat (specifikációkat). Ha nehézségei vannak a YAML-lel, de nem érte el a specifikációt, akkor ideje kijavítani ezt a helyzetet. A specifikációkat meglepően könnyű megírni, a szintaktikai követelményeket pedig számos példa illusztrálja 6. fejezet.

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.

10 lépés a YAML Zenhez

Á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 "Tabulátor vagy szóköz?". Nem globális értelemben, hanem csak a szervezete, vagy legalábbis egy projekt szintjén. Nem számít, hogy ez magában foglalja-e a sed-szkripttel végzett utófeldolgozást, a szövegszerkesztők beállítását a programozók gépein, vagy az elbocsátással fenyegetőzött univerzális nyugták átvételét a linter utasításainak szigorú betartásáról, hanem a csapat minden tagja, aki így vagy úgy, hogy a YAML-hez kapcsolódik, csak szóközt kell használnia (a YAML specifikációjának megfelelően).

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 Lehetséges dokumentáció:

# 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

Hozzászólás