Mums visiem patÄ«k Ansible, bet Ansible ir YAML. KonfigurÄcijas failiem ir daudz formÄtu: vÄrtÄ«bu saraksti, parametru-vÄrtÄ«bu pÄri, INI faili, YAML, JSON, XML un daudzi citi. TomÄr vairÄku iemeslu dÄļ YAML bieži tiek uzskatÄ«ts par Ä«paÅ”i sarežģītu. Jo Ä«paÅ”i, neskatoties uz tÄs atsvaidzinoÅ”o minimÄlismu un iespaidÄ«gajÄm iespÄjÄm strÄdÄt ar hierarhiskÄm vÄrtÄ«bÄm, YAML sintakse var bÅ«t kaitinoÅ”a ar tÄs Python lÄ«dzÄ«go pieeju atkÄpei.
Ja YAML jÅ«s sadusmo, jÅ«s varat ā un jums vajadzÄtu! - Veiciet tÄlÄk norÄdÄ«tÄs 10 darbÄ«bas, lai samazinÄtu savu neapmierinÄtÄ«bu lÄ«dz pieÅemamam lÄ«menim un iemÄ«lÄtu YAML. KÄ jau Å”im sarakstam pienÄkas, mÅ«su desmit padomi tiks numurÄti no nulles, pÄc vÄlÄÅ”anÄs pievienosim meditÄciju un garÄ«gÄs prakses š
0. Padariet savu redaktoru darbu
Nav svarÄ«gi, kÄds teksta redaktors jums ir, iespÄjams, ir vismaz viens spraudnis darbam ar YAML. Ja jums tÄda nav, nekavÄjoties atrodiet un instalÄjiet to. MeklÄÅ”anai un iestatÄ«Å”anai pavadÄ«tais laiks atmaksÄsies daudzkÄrt ikreiz, kad bÅ«s jÄrediÄ£Ä YAML.
PiemÄram, redaktors
Emacs YAML režīmÄ un parÄda atstarpes.
Ja jÅ«su iecienÄ«tÄkajam redaktoram nav YAML režīma, dažas problÄmas var atrisinÄt, strÄdÄjot ar iestatÄ«jumiem. PiemÄram, standarta GNOME teksta redaktoram Gedit nav YAML režīma, bet pÄc noklusÄjuma tas izceļ YAML sintaksi un ļauj konfigurÄt darbu ar atkÄpÄm:
AtkÄpju iestatÄ«Å”ana GeditÄ.
Spraudnis
Citiem vÄrdiem sakot, veltiet laiku, lai uzzinÄtu par savu iecienÄ«tÄko redaktoru. Uzziniet, ko viÅÅ” vai viÅa izstrÄdÄtÄju kopiena var piedÄvÄt darbam ar YAML, un izmantojiet Ŕīs funkcijas. JÅ«s noteikti to nenožÄlosiet.
1. Izmantojiet linteri
IdeÄlÄ gadÄ«jumÄ programmÄÅ”anas valodas un iezÄ«mÄÅ”anas valodas izmanto paredzamu sintaksi. Datoriem ir laba paredzamÄ«ba, tÄpÄc tiek izmantots jÄdziens
InstalÄt
$ sudo dnf install yamllint
PÄc tam vienkÄrÅ”i palaidiet yamllint, nododot tam YAML failu, lai pÄrbaudÄ«tu. Å Ädi izskatÄs, ja nododat failu ar kļūdu linteram:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
KreisajÄ pusÄ esoÅ”ie skaitļi ir nevis laiks, bet kļūdas koordinÄtas: rindas un kolonnas numurs. Kļūdas apraksts var jums neko nepateikt, taÄu jÅ«s precÄ«zi zinÄt, kur tÄ atrodas. Paskatieties uz Å”o vietu kodÄ, un visticamÄk viss kļūs skaidrs.
Ja yamllint failÄ neatrod kļūdas, ekrÄnÄ nekas netiek izdrukÄts. Ja Å”Äds klusums jÅ«s biedÄ un vÄlaties saÅemt vairÄk atsauksmju, varat palaist linteru ar nosacÄ«jumu atbalss komandu, izmantojot dubulto &&, piemÄram:
$ yamllint perfect.yaml && echo "OK"
OK
SistÄmÄ POSIX dubultÄ un tikai tad, ja iepriekÅ”ÄjÄ komanda atgriež 0. Un yamllint tikai atgriež atrasto kļūdu skaitu, tÄpÄc visa Ŕī nosacÄ«juma konstrukcija darbojas.
2. Rakstiet Python, nevis YAML
Ja YAML jÅ«s patieÅ”Äm kaitina, vienkÄrÅ”i nerakstiet tajÄ burtiski. GadÄs, ka YAML ir vienÄ«gais formÄts, ko lietojumprogramma saprot. Bet pat Å”ajÄ gadÄ«jumÄ nav nepiecieÅ”ams izveidot YAML failu. Uzrakstiet to, kas jums patÄ«k, un pÄc tam konvertÄjiet. PiemÄram, Python ir lieliska bibliotÄka
PaÅ”pÄrvÄrÅ”anÄs
Å ajÄ gadÄ«jumÄ datu fails ir arÄ« Python skripts, kas Ä£enerÄ YAML. Å Ä« metode ir vislabÄk piemÄrota mazÄm datu kopÄm. JÅ«s vienkÄrÅ”i ierakstiet JSON datus Python mainÄ«gajÄ, ievadiet to ar importÄÅ”anas direktÄ«vu un faila beigÄs pievienojiet trÄ«s rindiÅas, lai ieviestu izvadi.
#!/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
Tagad mÄs palaižam Å”o failu programmÄ Python un iegÅ«stam failu output.yaml:
$ 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
Tas ir pilnÄ«gi derÄ«gs YAML, taÄu yamllint brÄ«dinÄs, ka tas nesÄkas ar -. To var viegli labot manuÄli vai nedaudz mainÄ«t Python skriptÄ.
KonvertÄÅ”ana, izmantojot skriptus
Å ajÄ gadÄ«jumÄ mÄs vispirms rakstÄm JSON un pÄc tam palaižam pÄrveidotÄju kÄ atseviŔķu Python skriptu, kas kÄ izvadi rada YAML. SalÄ«dzinot ar iepriekÅ”Äjo metodi, Ŕī metode mÄrogojas labÄk, jo konvertÄÅ”ana notiek atseviŔķi no datiem.
Vispirms izveidosim JSON failu example.json, piemÄram, varat to Åemt no
{
"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"
}
}
}
}
}
PÄc tam mÄs izveidosim vienkÄrÅ”u pÄrveidotÄja skriptu un saglabÄsim to ar nosaukumu json2yaml.py. Å is skripts importÄ gan YAML, gan JSON Python moduļus un ielÄdÄ lietotÄja norÄdÄ«tu JSON failu, veic konvertÄÅ”anu un ieraksta datus failÄ 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()
SaglabÄjiet Å”o skriptu sistÄmas ceÄ¼Ä un palaidiet to pÄc vajadzÄ«bas:
$ ~/bin/json2yaml.py example.json
3. ParsÄjiet daudz un bieži
Dažreiz ir lietderÄ«gi paskatÄ«ties uz problÄmu no cita leÅÄ·a. Ja jums ir problÄmas attÄlot attiecÄ«bas starp jÅ«su datiem YAML, varat Ä«slaicÄ«gi pÄrveidot tos par kaut ko pazÄ«stamÄku.
PiemÄram, ja jums patÄ«k strÄdÄt ar vÄrdnÄ«cu sarakstiem vai JSON, varat konvertÄt YAML par JSON, izmantojot tikai divas komandas interaktÄ«vajÄ Python ÄaulÄ. PieÅemsim, ka jums ir YAML fails mydata.yaml, tad tas izskatÄs Å”Ädi:
$ 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.'}
JÅ«s varat atrast daudzus citus piemÄrus par Å”o tÄmu. TurklÄt ir pieejami daudzi tieÅ”saistes pÄrveidotÄji un vietÄjie parsÄtÄji. TÄpÄc nevilcinieties pÄrformatÄt datus, kad redzat tikai nesaprotamu jucekli.
4. Izlasiet specifikÄcijas
Atgriežoties YAML pÄc ilgÄka pÄrtraukuma, ir lietderÄ«gi apmeklÄt
5. PseidokonfigurÄcijas
Rakstot grÄmatu vai rakstu, vienmÄr ir lietderÄ«gi vispirms ieskicÄt iepriekÅ”Äju izklÄstu, vismaz satura rÄdÄ«tÄja veidÄ. Tas pats ir ar YAML. VisticamÄk, jums ir priekÅ”stats par to, kÄdi dati ir jÄieraksta YAML failÄ, taÄu jÅ«s Ä«sti nesaprotat, kÄ tos savienot savÄ starpÄ. TÄpÄc pirms YAML veidoÅ”anas uzzÄ«mÄjiet pseidokonfigurÄciju.
PseidokonfigurÄcija ir lÄ«dzÄ«ga pseidokodam, kur jums nav jÄuztraucas par struktÅ«ru vai atkÄpi, vecÄku un bÄrnu attiecÄ«bÄm, mantoÅ”anu un ligzdoÅ”anu. Å eit ir tas pats: jÅ«s zÄ«mÄjat datu iterÄcijas, kad tie rodas jÅ«su galvÄ.
Pseido-konfigurÄciju uzskaites programmÄtÄji (Martin un Tabitha) un viÅu prasmes (programmÄÅ”anas valodas: attiecÄ«gi Python, Perl, Pascal un Lisp, Fortran, Erlang).
PÄc pseidokonfigurÄcijas uzzÄ«mÄÅ”anas uz papÄ«ra rÅ«pÄ«gi analizÄjiet to un, ja viss ir kÄrtÄ«bÄ, formatÄjiet to derÄ«ga YAML faila formÄ.
6. CilÅu un atstarpu dilemma
Jums bÅ«s jÄatrisina dilemma
JebkurÄ parastÄ teksta redaktorÄ jÅ«s varat konfigurÄt automÄtiskÄs laboÅ”anas ciļÅus noteiktam atstarpju skaitam, tÄdÄjÄdi novÄrÅ”ot galveno piekritÄju sacelÅ”anos. Tab tev nav jÄbaidÄs.
KÄ katrs YAML nÄ«dÄjs labi zina, jÅ«s nevarat redzÄt atŔķirÄ«bu starp cilnÄm un atstarpÄm ekrÄnÄ. Un, kad kaut kas nav redzams, tas parasti ir pÄdÄjais, ko cilvÄki atceras pÄc tam, kad viÅi ir sakÄrtojuÅ”i, pÄrbaudÄ«juÅ”i un novÄrsuÅ”i visas citas iespÄjamÄs problÄmas. Stunda laika, kas pavadÄ«ts, meklÄjot tabulas lÄ«kni vai atstarpju bloku, vienkÄrÅ”i kliedz, ka steidzami jÄizveido politika viena vai otra izmantoÅ”anai un pÄc tam jÄveic dzelzsbetona atbilstÄ«bas pÄrbaude (piemÄram, caur a Git ÄÄ·is, lai ar spÄku izspiestu to caur lÄ«nijmalu).
7. MazÄk ir vairÄk (vai vairÄk ir mazÄk)
Dažiem cilvÄkiem patÄ«k rakstÄ«t YAML, jo tas uzsver struktÅ«ru. TajÄ paÅ”Ä laikÄ viÅi aktÄ«vi izmanto atkÄpi, lai izceltu datu blokus. Å Ä« ir sava veida krÄpniecÄ«ba, lai atdarinÄtu iezÄ«mÄÅ”anas valodas, kurÄs tiek izmantoti skaidri norobežotÄji.
Å eit ir Å”Ädas struktÅ«ras piemÄrs no
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Dažiem Ŕī iespÄja palÄ«dz sakÄrtot YAML struktÅ«ru savÄ galvÄ, citus, gluži pretÄji, tas kaitina ar daudziem, viÅuprÄt, nevajadzÄ«giem ievilkumiem.
Bet, ja esat YAML dokumenta Ä«paÅ”nieks un esat atbildÄ«gs par tÄ uzturÄÅ”anu, tad tu un tikai tu jÄdefinÄ, kÄ izmantot atkÄpi. Ja jÅ«s kaitina lielais polsterÄjums, samaziniet to lÄ«dz minimumam saskaÅÄ ar YAML specifikÄciju. PiemÄram, iepriekÅ” minÄto failu no Ansible dokumentÄcijas bez zaudÄjumiem var pÄrrakstÄ«t Å”Ädi:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Izmantojiet sagataves
Ja, aizpildot YAML failu, pastÄvÄ«gi atkÄrtojat tÄs paÅ”as kļūdas, ir lietderÄ«gi tajÄ ievietot veidni kÄ komentÄru. NÄkamreiz varat vienkÄrÅ”i nokopÄt Å”o veidni un ievadÄ«t tur reÄlus datus, piemÄram:
---
# - <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. Izmantojiet kaut ko citu
Ja lietojumprogramma jums nav bloÄ·Äta, iespÄjams, ir vÄrts mainÄ«t YAML uz citu formÄtu. Laika gaitÄ konfigurÄcijas faili var pÄraugt paÅ”i par sevi, un tad labÄk tos pÄrvÄrst vienkÄrÅ”os skriptos programmÄ Lua vai Python.
YAML ir lieliska lieta, kas daudziem patÄ«k tÄs minimÄlisma un vienkÄrŔības dÄļ, taÄu tÄ nebÅ«t nav vienÄ«gais rÄ«ks jÅ«su arsenÄlÄ. TÄpÄc dažreiz jÅ«s varat to atteikties. ParsÄÅ”anas bibliotÄkas YAML ir viegli atrast, tÄdÄļ, ja piedÄvÄsit vienkÄrÅ”as migrÄcijas iespÄjas, lietotÄji salÄ«dzinoÅ”i nesÄpÄ«gi pÄrdzÄ«vos Å”o kļūmi.
Ja nevarat iztikt bez YAML, izmantojiet Å”os 10 padomus un uz visiem laikiem pÄrvarÄjiet savu nepatiku pret YAML!
Avots: www.habr.com