Me kĂ”ik armastame Ansible't, kuid Ansible on YAML. Konfiguratsioonifailide jaoks on olemas palju formaate: vÀÀrtuste loendid, paarid âparameeter-vÀÀrtusâ, INI-failid, YAML, JSON, XML ja palju teisi. Kuid mitmel pĂ”hjusel peetakse YAML-i sageli eriti keeruliseks. EelkĂ”ige, hoolimata selle vĂ€rskendavast minimalismist ja muljetavaldavatest vĂ”imalustest hierarhiliste vÀÀrtustega töötamisel, vĂ”ib YAML-i sĂŒntaks oma Pythonilaadse lĂ€henemise tĂ”ttu taandele olla tĂŒlikas.

Kui YAML ajab teid nĂ€rvi, saate â ja peaksite! â astuma jĂ€rgmised 10 sammu, et oma Ă€rritust talutavasse tasemesse alandada ja YAML-i armastama hakata. Nagu tĂ”elisele loetelule kohane, numbreerime meie kĂŒmme nĂ”uannet nullist, mediteerimise ja vaimsete praktikate lisamine on vabatahtlik đ
0. Sundige oma redaktorit töötama
Ei ole tĂ€htis, milline tekstiredaktor teil on â tĂ”enĂ€oliselt on sellele vĂ€hemalt ĂŒks plugin YAML-i töötluseks. Kui teil sellist ei ole, leidke ja installige see kohe. Aeg, mis kulub otsimisele ja seadistamisele, tasub end mitmekordselt Ă€ra iga kord, kui peate YAML-i redigeerima.
NÀiteks toimetaja toetab YAML-i vaikimisi, kuid GNU Emacs'i jaoks tuleb installida tÀiendavad paketid, nÀiteks .

Emacsi YAML-reĆŸiimis ja tĂŒhikute kuvamisel.
Kui teie lemmikredaktoris ei ole YAML-reĆŸiimi, saab osa probleemidest lahendada seadistustega töötades. NĂ€iteks GNOME'i vaikimisi tekstiredaktor Gedit ei toeta YAML-reĆŸiimi, kuid tavalised YAML-i sĂŒntaksi esiletĂ”stmine ja tĂŒhikute seadistamine on seda vĂ”imaldanud:

Geditis tĂŒhikute seadistamine.
Ja plugin Geditile kuvab tĂŒhikud punktidena, kĂ”rvaldades ebaselgused taande tasemete osas.
TeisisĂ”nu, vĂ”tke aega oma lemmikredaktori uurimiseks. Uurige, mida see ise vĂ”i selle arendusĂŒritus pakub YAML-iga töötamiseks, ja kasutage neid vĂ”imalusi. Te ei kahetse seda.
1. Kasutage lintrit
Ideaalis kasutavad programmeerimiskeeled ja mĂ€rgistuskeeled etteennustatavat sĂŒntaksit. Arvutid saavad etteennustatavuse hĂ€sti hakkama, seetĂ”ttu tekkis juba 1978. aastal kontseptsioon . Kui see 40 aasta jooksul teid mööda on lĂ€inud ja te siiani YAML-lintrit ei kasuta, on Ăige aeg proovida yamllinti.
Paigaldada seda saab kasutada Linuxi vaikimisi pakihalduri kaudu. NÀiteks 8 vÔi see tehakse nii:
$ sudo dnf install yamllint
K seejÀrel lihtsalt kÀivitate yamllint, edastades talle veekontrollimiseks YAML-faili. NÀete, milline see vÀlja nÀeb, kui edastate lintimisele vale faili:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 viga sĂŒntaksiviga: kaardistamise vÀÀrtused ei ole siin lubatud
23:11 viga lisaruumid (trailing-spaces)
Vasakul asuvad numbrid ei ole ajad, vaid vea koordinaadid: rida ja veeru number. Veakirjeldus vÔib teile mitte midagi öelda, kuid teate tÀpselt, kus see asub. Vaadake lihtsalt seda kohta koodis ja tÔenÀoliselt on kÔik selge.
Kui yamllint ei leia failis vigu, ei kuvata ekraanile midagi. Kui selline vaikimine hirmutab ja soovite natuke rohkem tagasisidet, siis saate lintimist kÀivitada tingimusliku kÀsklusega echo topelt-amperandiga (&&), nii:
$ yamllint perfect.yaml && echo "OK"
OK
POSIX-is töötab topelt-amperand ainult siis, kui eelnev kÀsk tagastab 0. Ja yamllint tagastab just leitud vigade arvu, seetÔttu see tingimuslik konstruktsioon töötab.
2. Kirjutage Pythonis, mitte YAML-is
Kui YAML tÔeliselt hÀirib, Àrge kirjutage sellel, sÔnasÔnaliselt. Olukordades, kus YAML on ainus formaat, mis rakenduse poolt tuntud, ei pea te sellegipoolest YAML-faili looma. Kirjutage selles, mis teile meeldib, ja seejÀrel konverteerige. NÀiteks Pythonile on suurepÀrane teek ja kaks viisi konverteerimiseks: automaatne konverteerimine ja konverteerimine skriptide kaudu.
Automaatne konverteerimine
Sel juhul on andmefail ĂŒhtlasi ka Python-skript, mis genereerib YAML. See meetod sobib kĂ”ige paremini vĂ€ikeste andmehulkade jaoks. Kirjutate lihtsalt JSON-andmed Pythonis muutujasse, eeldate seda import-mĂ€rgisega ning lisate faili lĂ”ppu kolm rida vĂ€ljundi teostamiseks.
#!/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
KĂ€ivitame nĂŒĂŒd selle faili Pythonis ja vĂ€ljundiks saame faili output.yaml:
$ python3 ./example.json
$ cat output.yaml
glossary:
GlossDiv:
GlossList:
GlossEntry:
Abbrev: ISO 8879:1986
Acronym: SGML
GlossDef:
GlossSeeAlso: [GML, XML]
para: meta-mÀrgistus keel, mida kasutatakse selliste mÀrgistuskeelte loomiseks nagu DocBook.
GlossSee: mÀrgistus
GlossTerm: Ăldine standardiseeritud mĂ€rgistuskeel
ID: SGML
SortAs: SGML
title: S
title: nÀidis sÔnastik
See on tÀiesti korrektne YAML, kuid yamllint annab hoiatuse, et see ei alga -. Mis siis, seda saab kergesti kÀsitsi parandada vÔi Python-skripti veidi kohandada.
Skriptide kaudu konverteerimine
Selles olukorras kirjutame esmalt JSON-is ja seejÀrel kÀivitame konverterina eraldi Python-skripti, mis vÀljastab YAML-i. See meetod on vÔrreldes eelneva meetodiga paremini skaleeritav, kuna andmete konverteerimine on eraldatud.
Alguses loome JSON-faili example.json; nÀiteks vÔite selle vÔtta aadressilt :
{
"glossary": {
"title": "nÀidisglossaar",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standardiseeritud ĂŒldine mĂ€rgistamise keel",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "MetamÀrgistuskeel, mida kasutatakse selliste mÀrgistamiskeelte loomiseks nagu DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "mÀrgistamine"
}
}
}
}
}
SeejĂ€rel loome lihtsa konverteerimis-skripti ja salvestame selle nimega json2yaml.py. See skript importib mĂ”lemad moodulid â YAML ja JSON Pythonis ning laadib kasutaja mÀÀratud JSON-faili, viib lĂ€bi konverteerimise ja kirjutab andmed faili 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()
Salvesta see skript sĂŒsteemi teekonda ja kĂ€ivita vastavalt vajadusele:
$ ~/bin/json2yaml.py example.json
3. Parsige tihti ja palju
MĂ”nikord on probleemile hea vaadata teisest kĂŒljest. Kui on raske ette kujutada andmete seoseid YAML-is, vĂ”ite need ajutiselt konverteerida millegi tuttavama vastu.
NÀiteks, kui teile meeldib töötada sÔnastike loendite vÔi JSON-iga, siis saab YAML-i muuta JSON-iks vaid kahe kÀsuga Python'i interaktiivses shell'is. Oletame, et teil on YAML-fail mydata.yaml, nii et vaadake, kuidas see vÀlja nÀeb:
$ 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 Road', 'city': 'Brooklyn', 'state': 'Wellington', 'postal': 6021, 'country': 'NZ'}}, 'words': 938, 'comments': 'Hea artikkel. VÔiks olla parem.'}
Selle teema kohta on saadaval palju muid nĂ€iteid. Lisaks on olemas palju veebipĂ”hiseid konvertereid ja kohalikke parsereid. Seega Ă€rge kartke andmete ĂŒmberformaatimist, kui nĂ€ete neid vaid segadusena.
4. Loe spetsifikatsioone
Kui naasete pĂ€rast pikka pausi YAML-i juurde, on kasulik kĂŒlastada ja lugeda spetsifikatsioone. Kui teil on YAML-iga raskusi, kuid spetsifikatsioonideni ei ole jĂ”udnud, siis on aeg see olukord parandada. Spetsifikatsioonid on ĂŒllatavalt selgelt kirjutatud ja sĂŒntaksi nĂ”udeid illustreeritakse hulga nĂ€idetega .
5. Pseudokonfiguratsioonid
Raamatute vÔi artiklite kirjutamisel on alati kasulik kÔigepealt koostada eelnev plaan, vÀhemalt sisukorra kujul. Nii on ka YAML-i puhul. TÔenÀoliselt kujutate ette, millised andmed tuleb YAML-faili salvestada, kuid ei saa tÀpselt aru, kuidas neid omavahel seostada. SeetÔttu joonistage YAML-i koostamise enne vÀlja pseudokonfiguratsioon.
Pseudokonfiguratsioon sarnaneb pseudokoodiga, kus ei pea muretsema struktuuri vĂ”i sisu, «vanem-laps» suhete, pĂ€rimise ja pesastatuse ĂŒle. Sel juhul joonistate andmete iteratsioonid nii, nagu need teie peas ilmnevad.

Pseudokonfiguratsioon, kus on loetletud programmeerijad (Martin ja Tabitha) ja nende oskused (programmeerimiskeeled: Python, Perl, Pascal ja Lisp, Fortran, Erlang, vastavalt).
Pseudokonfiguratsiooni paberile joonistades analĂŒĂŒsige seda hoolikalt ja kui kĂ”ik on korras, vormistage see kehtiva YAML-failina.
6. Dilemma «tĂŒhikut vĂ”i tabulatsiooni»
Te peate otsustama dilemmas . Mitte globaalses mĂ”ttes, vaid ainult teie organisatsiooni tasandil vĂ”i vĂ€hemalt projekti tasandil. Ei ole oluline, kas selleks kasutatakse sed-skripti, programmide tekstiredaktorite seadistamist vĂ”i ainult selleks, et kasutada nĂ”uete jĂ€rgimise rĂ”hutamiseks ultimatume, et kĂ”ik teie meeskonna liikmed, kes tegelevad YAML-iga, peavad kindlasti kasutama ainult tĂŒhikuid (nagu YAML-i spetsifikatsioon nĂ”uab).
Igas normaalses tekstiredaktoris saab seadistada automaatse tabulatsiooni asendamise mÀÀratud arvu tĂŒhikutega, seega ei ole vaja karta kapriisse tabulatsiooni pooldajaid. Tab pole millegi pĂ€rast muretseda.
Nagu iga YAML-i vihkaja hĂ€sti teab, ei paista ekraanil tabulatsiooni ja tĂŒhikute vahel vahet. Ja kui midagi ei paista, meenutatakse seda tavaliselt viimases jĂ€rjekorras, peale seda, kui on vĂ€lja peetud, kontrollitud ja kĂ”rvaldatud kĂ”ik teised vĂ”imalikud probleemid. Tunni aeg, mis kulutatakse vale tabulatsiooni vĂ”i tĂŒhikute ploki leidmiseks, kutsub hĂ€dasti esile vajalikkuse luua poliitika selle kasutamise osas ning seejĂ€rel rakendada selle jĂ€rgimise stoilist kontrolli (nt Git-hook'i kaudu, et sundida linters lĂ€bi vaatama).
7. Parem vĂ€hem, aga paremini (vĂ”i rohkem â see on vĂ€hem)
MÔned inimesed armastavad kirjutada YAML-is, kuna see toob esile struktuuri. Nad kasutavad aktiivselt sisestusi, et eristada andmebloke. See on omamoodi petmine, et jÀljendada, nagu markeerimiskeel, kus kasutatakse selgeid eraldajaid.
Siin on sellise struktuursuse nÀide :
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
MÔnele inimesele aitab selline variandistruktuur YAML-i peas paremini seada, teisi aga Àrritab see liigsete, nende arvates, sisestustega.
Kuid kui olete YAML-dokumendi omanik ja vastutate selle ĂŒle, siis teie ja ainult teie peate mÀÀrama, kuidas kasutada sisestusi. Kui suured sisestused teid Ă€rritavad, siis viige need miinimumini, mis on vĂ”imalikult vĂ€ike YAML-i spetsifikatsiooni kohaselt. NĂ€iteks vĂ”ib ĂŒlaltoodud fail Ansible'i dokumentatsioonist kirjutada ĂŒmber jĂ€rgmiselt:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Kasutage mallide
Kui tÀidate YAML-faili ja kordate pidevalt samu vigu, on mÔistlik lisada sinna malli nÀidis kommentaarina. Siis jÀrgmine kord saate lihtsalt see mall kopeerida ja sinna reaalsed andmed sisestada, nÀiteks:
---
# - <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. Kasutage midagi muud
Kui rakendus ei hoia teid enda kĂŒljes, siis vĂ”ib-olla tasub YAML asendada mĂ”ne teise formaadiga. Aja jooksul vĂ”ivad konfiguratsioonifailid muutuda ja siis on parem need lihtsalt lihtsateks Lua vĂ”i Python skriptideks ĂŒmber kujundada.
YAML on suurepÀrane asi, mida paljud hindavad minimalistlikkuse ja lihtsuse tÔttu, kuid see pole kaugeltki ainus tööriist teie arsenalis. Seega mÔnikord vÔib sellest loobuda. YAML-i jaoks on lihtne leida parsimisraamatukogusid, seega kui pakute mugavaid migratsioonivÔimalusi, taluvad teie kasutajad selle loobumist suhteliselt valulikult.
Kuid kui YAML-ist ei pÀÀse, siis vÔtke kasutusele need 10 nÔuannet ja vÔitke oma vastumeelsus YAML-i vastu kord ja kÔik!
Allikas: habr.com
