Me kĂ”ik armastame Ansible'i, kuid Ansible on YAML. Konfiguratsioonifailide jaoks on mitmeid vormate: vÀÀrtuste loendid, paarid "parameeter-vÀÀrtus", INI-failid, YAML, JSON, XML ja paljud teised. Kuid mitmel pĂ”hjusel peetakse YAML-i tihti kĂ”ige keerulisemaks. Eriti, vaatamata selle vĂ€rskendavale minimalismile ja muljetavaldavatele vĂ”imalustele hierarhiliste vÀÀrtustega töötamiseks, vĂ”ib YAML-i sĂŒntaks olla pikaajaline, andes tunde, et see kuidagi ei sobi kokku Pythoniga.

Kui YAML teid Ă€rritab, siis saate - ja peate! - astuma jĂ€rgmised 10 sammu, et vĂ€hendada oma Ă€rritust talutavale tasemele ja Ă”ppida YAML-i armastama. Nagu tĂ”elisele nimekirjale kohane, nummerdame meie soovitused nullist, mediteerimise ja vaimsete praktikate vĂ”ite lisada vastavalt soovile đ
0. Sundige oma redigeerijat töötama
Pole tĂ€htis, milline tekstiredaktor teil on - kindlasti on sellele olemas vĂ€hemalt ĂŒks plugin YAML-i töötlemiseks. Kui teil seda ei ole, leidke ja installige see viivitamatult. Otsimisele ja seadistamisele kulutatud aeg tasub end Ă€ra iga kord, kui peate YAML-i redigeerima.
NÀiteks redigeerija toetab YAML-i vaikekohaselt, kuid GNU Emacsi jaoks peate installima tÀiendavad paketid, nÀiteks .

Emacs YAML-reĆŸiimis ja tĂŒhikute kuvamisega.
Kui teie lemmikredaktoril ei ole YAML-i reĆŸiimi, saab osa probleemidest lahendada seadete kohandamisega. NĂ€iteks GNOME'i vaikereeditor Gedit ei oma YAML-i reĆŸiimi, kuid toetab vaikimisi YAML-i sĂŒntaksi esiletĂ”stmist ja vĂ”imaldab tĂŒhikute töötlemist kohandada:

TĂŒhikute seadistamine Geditis.
Ja Geditile mĂ”eldud plugin nĂ€itab tĂŒhikuid punktidena, eemaldades segaduse sissetĂ”mbe tasemetest.
TeisisÔnu, kulutage aega oma lemmikredaktori uurimisele. Uurige, mida teie redaktor vÔi selle arendajate kogukond pakub YAML-i töötlemiseks ja kasutage neid vÔimalusi. Te ei kahetse seda.
1. Kasutage linte (linter)
Ideaalis kasutavad programmeerimiskeeled ja mĂ€rgistuskeeled ettearvatavat sĂŒntaksit. Arvutid saavad ettearvatavusega vĂ€ga hĂ€sti hakkama, seega sĂŒndis juba 1978. aastal linte kontseptsioon. . Kui see on 40 aasta jooksul teid mööda lĂ€inud ja te ei kasuta endiselt YAML-i linterit, siis on viimane aeg proovida yamllint'i.
Installi seda saab installida Linuxi vaikimenĂŒĂŒst. NĂ€iteks, 8 vĂ”i see tehakse nii:
$ sudo dnf install yamllint
SeejÀrel kÀivitage lihtsalt yamllint, edastades sellele kontrollimiseks YAML-faili. Nii see vÀlja nÀeb, kui edastate linterile faili, mis sisaldab viga:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 viga sĂŒntaksiviga: siinse vÀÀrtuste mÀÀramine pole lubatud
23:11 viga lĂ”pp-tĂŒhikud (trailing-spaces)
Numbrid vasakul ei tÀhenda aega, vaid vea koordinaate: rea ja veeru numbri. Vea kirjeldus ei pruugi teile midagi öelda, kuid tÀpselt teate, kus see asub. Vaadake selle koha peale koodis ja tÔenÀoliselt on kÔik selge.
Kui yamllint ei leia failist vigu, ei kuvata ekraanile midagi. Kui teid hirmutab selline vaikus ja soovite natuke rohkem tagasisidet, siis vÔite linterit kÀivitada tingimusliku kÀsuga echo kahekordse ampersand'i (&&) kaudu, nii:
$ yamllint perfect.yaml && echo "OK"
OK
POSIX-is kehtib, et kahekordne ampersand aktiveerub ainult siis, kui eelnev kÀsk tagastab 0. Ja yamllint tagastab tÀpselt leitud vigade arvu, seega toimib kogu see tingimuslik konstruktsioon.
2. Kirjutage Pythonis, mitte YAML-is
Kui YAML tÔeliselt Àrritab, kirjutage seda lihtsalt mitte, sÔnasÔnaliselt. Juhtub, et YAML on ainus formaat, mida rakendus toetab. Kuid isegi siis ei ole tingimata vajalik YAML-faili loomine. Kirjutage seda, mis teile meeldib, ja konverteerige see hiljem. NÀiteks Pythonile on olemas suurepÀrane teek ja tervelt kaks konverteerimise meetodit: automaatne konverteerimine ja skriptide kaudu konverteerimine.
Automaatne konverteerimine
Selle meetodi jaoks on andmefail samal ajal ka Python-i skript, mis genereerib YAML-i. See lÀhenemine sobib kÔige paremini vÀikeste andmekogumite jaoks. Te kirjutate lihtsalt JSON-andmed Python-i muutuja, eeldades seda import-direktiiviga ja faili lÔppu lisate kolm rida vÀljundi rakendamiseks.
#!/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
SeejÀrel kÀivitage see fail Pythonis ja vÀljundiks on fail 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Àrgistuskeel, mida kasutatakse mÀrkistuskeelte loomiseks, nagu DocBook.
GlossSee: mÀrkistus
GlossTerm: Standardiseeritud Ăldine MĂ€rgistuskeel
ID: SGML
SortAs: SGML
title: S
title: nÀidis glossarium
See on tĂ€iesti korrektne YAML, kuid yamllint annab hoiatusi, et see ei alga â. Seda saab kergesti kĂ€sitsi parandada vĂ”i vĂ€ikeseid muudatusi teha Python-i skriptis.
Konverteerimine skriptide kaudu
Sell juhul kirjutame esmalt JSON-is ja seejÀrel kÀivitame eraldi Python-skripti, mis tagastab YAML-i. See meetod on eelmisest paremini skaleeritav, kuna konvertimine on eraldatud andmetest.
Alustuseks loome JSON-faili example.json, nÀiteks vÔite selle vÔtta aadressilt :
{
"glossary": {
"title": "nÀidis sÔnastik",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standardiseeritud Ăldine Markup Keel",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "Meta-markup keel, mida kasutatakse mÀrgenduskeelte, nÀiteks DocBook, loomiseks.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
SeejÀrel loome lihtsa konverteerimis-skripti ja salvestame selle nimega json2yaml.py. See skript impordib mÔlemad moodulid - YAML ja JSON Pythonis ning laadib kasutaja mÀÀratud JSON-faili, viib lÀbi konverteerimise ja kirjutab andmed failiks 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 teele ja kĂ€ivita seda vastavalt vajadusele:
$ ~/bin/json2yaml.py example.json
3. Parsige palju ja sageli
MÔnikord on probleemile hea vaadata teise nurga alt. Kui teil on raske nÀha andmete vahelisi seoseid YAML-is, vÔite need ajutiselt muuta millekski tuttavamaks.
NÀiteks, kui Teile meeldivad sÔnalist nimekirjad vÔi JSON, siis saab YAML-i konverteerida JSON-iks vaid kahe kÀsu abil Python-i interaktiivses konsoolis. Oletame, et Teie YAML-fail on mydata.yaml, siis nÀeb see vÀlja jÀrgmiselt:
$ 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': 'Hea artikkel. Saaks paremini.'}
Selle kohta on saadaval suur hulk teisi nĂ€iteid. Samuti on internetis palju online-konvertereid ja kohalikke parsereid. Seega Ă€rge kartke andmete ĂŒmbervormimist, kui nĂ€ete neis vaid arusaamatut segu.
4. Loe spetsiifikatsioone
YAML-i juurde tagasi tulles on kasulik kĂŒlastada ja tutvuda spetsiifikatsioonidega. Kui teil on YAML-i osas raskusi, kuid spetsiifitseeritud kĂ€ed ei ole veel ulatunud, siis on aeg see olukord parandada. Spetsiifikatsioonid on ĂŒllatavalt lihtsalt koostatud ja sĂŒntaksinĂ”uded on illustreeritud suure hulga nĂ€idetega .
5. Pseudokonfiguratsioonid
Raamatu vÔi artikli kirjutamisel on alati kasulik kÔigepealt koostada esialgne plaan, vÀhemalt sisukorra kujul. Sama kehtib ka YAML-i puhul. TÔenÀoliselt teate, millised andmed tuleb YAML-faili salvestada, kuid ei tea tÀpselt, kuidas nad omavahel seonduda. SeetÔttu, enne kui hakata YAML-i sepistama, joonistage pseudokonfiguratsioon.
Pseudokonfiguratsioon sarnaneb pseudokoodiga, kus ei pea muretsema struktuuri vĂ”i sisestuste, vanemate ja lasteseoste, pĂ€rimise ja pesakonna ĂŒle. Nii on ka siin: joonistate andmete iteratsioonid, kui need Teie mĂ”tetesse jsse tulevad.

Pseudokonfiguratsioon, kus loetletakse programmeerijad (Martin ja Tabitha) ja nende oskused (programmeerimiskeeled: Python, Perl, Pascal ja Lisp, Fortran, Erlang, vastavalt).
PĂ€rast pseudokonfiguratsiooni joonistamist paberile analĂŒĂŒsige seda pĂ”hjalikult ja kui kĂ”ik on korras, vormistage see korrektseks YAML-failiks.
6. Dilemma "tabulatsioon vĂ”i tĂŒhikud"
Te peate lahendama dilemmat . Mitte globaalsetes mĂ”tetes, vaid ainult teie organisatsiooni vĂ”i vĂ€hemalt projekti tasandil. Pole tĂ€htis, kas selleks kasutatakse jĂ€lgimiskirju, seadistatakse tekstiredaktoreid programmeerijate masinates vĂ”i nĂ”utakse striktselt kinnitusi linteri juhiste jĂ€rgimise kohta, kuid kĂ”ik teie tiimi liikmed, kes puutuvad YAML-iga kokku, peavad kindlasti kasutama ainult tĂŒhikuid (nagu YAML-i spetsifikatsioon nĂ”uab).
Igas normaalses tekstiredaktoris on vĂ”imalik seadistada automaatne tabulatsiooni asendamine mÀÀratud tĂŒhikute arvuga, seega ei pea kartma tabulatsiooni toetajate ĂŒlestĂ”usu. Tab nupu suhtes.
Kuidas igasugustele YAML-i vaenuvĂ€gedele on hĂ€sti teada, ekraanil ei ole vahet tabulatsiooni ja tĂŒhikute vahel. Ja kui midagi ei ole nĂ€htav, siis tavaliselt meenutatakse seda viimases jĂ€rjekorras, pĂ€rast seda, kui on vaadatud, kontrollitud ja kĂ”rvaldatud kĂ”ik muud vĂ”imalikud probleemid. Tund, mis on raisatud vale tabulatsiooni vĂ”i tĂŒhikubloki leidmiseks, lihtsalt karjub, et teil on kiiresti vaja luua poliitika kas selle vĂ”i teise kasutamiseks ja seejĂ€rel rakendada raudbetooni kontrolli selle jĂ€rgimise ĂŒle (nĂ€iteks lĂ€bi Git-huki, et sundida linteri kasutamist).
7. VÀhem on rohkem (vÔi rohkem on vÀhem)
MÔned inimesed eelistavad kirjutada YAML-is, kuna see toob esile struktuuri. Nad kasutavad aktiivselt sissetÔmbeid, et eristada andmeplokke. See on omamoodi petmine markeerimiskeelte jÀljendamiseks, kus kasutatakse silmnÀhtavaid eraldajaid.
Siin on nÀide sellisest struktureerituse nÀitest :
# 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 see variant mÔelda YAML-i struktuurile, teisi aga hÀirib see liigsete, nende arvates, sissetÔmmete tÔttu.
Kui aga te olete YAML-dokumendi omanik ja vastutate selle hoolduse eest, siis ainult teie peate mÀÀrama, kuidas sissetĂ”mbeid kasutada. Kui suured sissetĂ”mbed teid hĂ€irivad, vĂ€hendage need miinimumini, mis on vastavalt YAML-i spetsifikatsioonile vĂ”imalik. NĂ€iteks vĂ”ib eespool mainitud faili Ansible'i dokumentatsioonist ilma igasuguste kaotusteta ĂŒmber kirjutada 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 malle
Kui tÀidate YAML-faili ja teete pidevalt samu vigu, on mÔistlik lisada sinna malli kommentaarina. Sel juhul saab jÀrgmine kord lihtsalt selle malli 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 kinni, siis vĂ”ib-olla tasub YAMLi asemel valida mĂ”ni teine formaat. Aja jooksul vĂ”ivad konfiguratsioonifailid end ĂŒletada ja siis on parem need muuta lihtsateks skriptideks Lua-s vĂ”i Pythonis.
YAML on suurepÀrane asi, mida paljud hindavad minimalismi ja lihtsuse tÔttu, kuid see pole ainus tööriist teie arsenalis. Nii et mÔnikord vÔib sellest loobuda. YAMLi jaoks on lihtne leida parsimise teeke, seega kui pakute mugavaid migreerimisvÔimalusi, suudavad teie kasutajad sellist loobumist suhteliselt valutult taluda.
Kuid kui YAMList on tÀiesti vÔimatu loobuda, siis vÔtke need 10 nÔuannet kasutusele ja vÔitke oma vastumeelsus YAMLi vastu kord ja kÔik!
Allikas: habr.com
