MÄs visi mÄ«lam Ansible, taÄu Ansible ir YAML. KonfigurÄcijas failiem ir daudz formÄtu: vÄrtÄ«bu saraksti, "atslÄga-vÄrtÄ«ba" pÄri, INI faili, YAML, JSON, XML un vÄl daudz citu. TomÄr vairÄkos iemeslos no visiem Å”iem formÄtiem YAML bieži tiek uzskatÄ«ts par Ä«paÅ”i sarežģītu. ÄŖpaÅ”i, neskatoties uz tÄ atsvaidzinoÅ”o minimÄlismu un ievÄrojamo spÄju strÄdÄt ar hierarhiskÄm vÄrtÄ«bÄm, YAML sintakse var kaitinÄt ar savu Python lÄ«dzÄ«go pieeju atkÄpÄm.

Ja jÅ«s kaitina YAML, jÅ«s varat ā un jums vajadzÄtu! ā veikt Å”os 10 nÄkamos soļus, lai samazinÄtu savu nepatiku lÄ«dz pieÅemamam lÄ«menim un iemÄ«lÄties YAML. KÄ Ä«stam sarakstam, mÅ«su desmit padomi tiks numurÄti no nulles, meditÄciju un garÄ«gÄs prakses pievienojam pÄc izvÄles š
0. PÄrlieciniet savu redaktoru strÄdÄt
Nav svarÄ«gi, kÄdu teksta redaktoru izmantojat ā tam noteikti ir vismaz viens spraudnis, lai strÄdÄtu ar YAML. Ja tÄda nav, nekavÄjoties atrodiet un instalÄjiet. Laiks, ko pavadÄ«siet meklÄjot un iestataot, tiks vairÄkkÄrt atgÅ«ts, katru reizi, kad nÄksies rediÄ£Ät YAML.
PiemÄram, redaktors atbalsta YAML pÄc noklusÄjuma, bet GNU Emacs gadÄ«jumÄ ir jÄsagatavo papildu pakotnes, piemÄram, .

Emacs YAML režīmÄ un attÄlojot atkÄpes.
Ja jÅ«su iecienÄ«tajÄ redaktorÄ nav YAML režīma, daļu problÄmu var atrisinÄt, strÄdÄjot ar iestatÄ«jumiem. PiemÄram, noklusÄjuma GNOME teksta redaktors Gedit nav YAML režīma, bet pÄc noklusÄjuma izceļ YAML sintaksi un ļauj iestatÄ«t atkÄpes:

AtkÄpes iestatīŔana Gedit.
Un spraudnis Gedit attÄlo atkÄpes kÄ punktus, novÄrÅ”ot neskaidrÄ«bas attiecÄ«bÄ uz atkÄpju lÄ«meÅiem.
Citiem vÄrdiem sakot, veltiet laiku, lai izpÄtÄ«tu savu iecienÄ«to redaktoru. Noskaidrojiet, ko tas pats vai tÄ izstrÄdÄtÄju kopiena piedÄvÄ darbam ar YAML, un izmantojiet Ŕīs iespÄjas. JÅ«s tieÅ”Äm to nenožÄlosiet.
1. Izmantojiet linters
IdeÄlÄ gadÄ«jumÄ programmÄÅ”anas un marÄ·ÄÅ”anas valodÄm ir paredzamas sintakses. Datori labi tiek galÄ ar paredzamÄ«bu, tÄdÄļ jau 1978. gadÄ radÄs linters koncepcija. to var izdarÄ«t, izmantojot noklusÄjuma Linux pakotÅu pÄrvaldnieku. PiemÄram,
UzstÄdÄ«t in 8 vai to tiek darÄ«ts Å”Ädi:
$ sudo dnf install yamllint
Tad jÅ«s vienkÄrÅ”i palaidÄ«siet yamllint, nododot tam YAML failu pÄrbaudei. LÅ«k, kÄ tas izskatÄs, ja nododat linternim failu ar kļūdu:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 kļūda sintakses kļūda: mapping values nav atļauti Ŕeit
23:11 kļūda pÄdÄjie atstarpes (trailing-spaces)
Skaitļi pa kreisi ā tas nav laiks, bet kļūdas koordinÄtas: rindu un kolonnu numuri. Kļūdas apraksts var jums neko neteikt, bet jÅ«s precÄ«zi zinÄt, kur tÄ atrodas. VienkÄrÅ”i aplÅ«kojiet Å”o vietu kodÄ, un, iespÄjams, viss kļūs skaidrs.
Kad yamllint neatrod kļūdas failÄ, ekrÄnÄ nekas netiek izvadÄ«ts. Ja jÅ«s uztrauc Ŕī klusÄÅ”ana un vÄlaties nedaudz vairÄk atsauksmju, varat palaist linterni ar nosacÄ«tu komandu echo, izmantojot dubultu ampersandu (&&), tÄdÄ veidÄ:
$ yamllint perfect.yaml && echo "OK"
OK
POSIX dubultais ampersands darbojas tad, kad tieÅ”i iepriekÅ”ÄjÄ komanda atgriež 0. Un yamllint tieÅ”i atgriež atrasto kļūdu skaitu, tÄdÄļ visa Ŕī nosacÄ«juma konstrukcija arÄ« darbojas.
2. Rakstiet PythonÄ, nevis YAML
Ja jÅ«s tieÅ”Äm tracina YAML, tad vienkÄrÅ”i nerakstiet to, burtiski. Ir gadÄ«jumi, kad YAML ir vienÄ«gais formÄts, ko lieto lietojumprogramma. Bet pat Å”ajÄ gadÄ«jumÄ nav obligÄti jÄveido YAML fails. Rakstiet tajÄ, kas jums patÄ«k, un vÄlÄk konvertÄjiet. PiemÄram, PythonÄ ir izcila bibliotÄka un veseli divi veidi konvertÄÅ”anai: paÅ”konvertÄÅ”ana un konvertÄÅ”ana caur skriptiem.
PaÅ”konvertÄÅ”ana
Å ajÄ gadÄ«jumÄ datu fails ir arÄ« Python skripts, kas Ä£enerÄ YAML. Å Ä« metode vislabÄk der nelieliem datu kopÄm. JÅ«s vienkÄrÅ”i rakstÄt JSON datus Python mainÄ«gajÄ, ievadiet to ar import direktÄ«vu, un faila beigÄs pievienojat trÄ«s rindiÅas izvadei.
#!/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 palaidÄ«sim Å”o failu PythonÄ, un izejÄ iegÅ«sim failu 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Äkoni valoda, ko izmanto, lai izveidotu mÄkoni valodas, piemÄram, DocBook.
GlossSee: mÄkonÄ«ga
GlossTerm: Standarta Ä£enerÄta mÄkoni valoda
ID: SGML
SortAs: SGML
title: S
title: piemÄra vÄrdnÄ«ca
Tas ir pilnÄ«gi pareizs YAML, bet yamllint izsniegs brÄ«dinÄjumu, ka tas nesÄkas ar ā. Nu, to ir viegli salabot manuÄli vai nedaudz uzlabojot Python skriptu.
KonvertÄÅ”ana caur skriptiem
Å ajÄ gadÄ«jumÄ vispirms rakstÄm JSON formÄtÄ, pÄc tam palaidÄ«sim pÄrveidotÄju kÄ atseviŔķu Python skriptu, kas gala rezultÄtÄ nodroÅ”ina YAML. SalÄ«dzinÄjumÄ ar iepriekÅ”Äjo, Ŕī metode labÄk pielÄgojas, jo pÄrveidoÅ”ana ir atdalÄ«ta no datiem.
Vispirms izveidosim JSON failu example.json, piemÄram, to var Å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": "Meta-markup valoda, ko izmanto, lai izveidotu markup valodas, piemÄram, DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
PÄc tam izveidosim vienkÄrÅ”u pÄrveidotÄja skriptu un saglabÄsim to ar nosaukumu json2yaml.py. Å is skripts importÄ abus moduļus ā YAML un JSON Python, kÄ arÄ« ielÄdÄ lietotÄja norÄdÄ«to JSON failu, veic pÄrveidoÅ”anu un raksta 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, kad nepiecieÅ”ams:
$ ~/bin/json2yaml.py example.json
3. ApstrÄdÄjiet daudz un bieži
Dažreiz uz problÄmu ir noderÄ«gi paskatÄ«ties no cita leÅÄ·a. Ja jums ir grÅ«ti iedomÄties attiecÄ«bas starp datiem YAML, to var pagaidu pÄrvÄrst par kaut ko ierastÄku.
PiemÄram, ja jums patÄ«k strÄdÄt ar vÄrdnÄ«cu sarakstiem vai JSON, tad YAML var pÄrvÄrst JSON tikai ar divÄm komandÄm Python interaktÄ«vajÄ saskarÄ. PieÅemsim, ka jums ir YAML fails mydata.yaml, tad lÅ«k, kÄ tas izskatÄ«sies:
$ 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': 'Labi raksts. VarÄtu bÅ«t labÄks.'}
Par Å”o tÄmu var atrast daudz citu piemÄru. TurklÄt pieejami daudzi tieÅ”saistes pÄrveidotÄji un lokÄlie parseri. TÄdÄļ nebaidieties pÄrveidot datus, kad redzat tajos tikai neskaidru jucekli.
4. Lasiet specifikÄcijas
Atgriežoties pie YAML pÄc ilgÄ pÄrtraukuma, noderÄ«gi ir apmeklÄt un pÄrlasÄ«t specifikÄcijas (specifikÄcijas). Ja jums ir grÅ«tÄ«bas ar YAML, bet lÄ«dz specifikÄciju izlasīŔanai vÄl neesat ticis, tad ir laiks to labot. SpecifikÄcijas ir pÄrsteidzoÅ”i viegli uzrakstÄ«tas, un sintakses prasÄ«bas ir ilustrÄtas ar lielu skaitu piemÄru. .
5. PseudokonfigurÄcijas
Rakstot grÄmatu vai rakstu, vienmÄr ir noderÄ«gi vispirms izveidot sÄkotnÄju plÄnu, vismaz tÄdu kÄ satura rÄdÄ«tÄju. ArÄ« YAML gadÄ«jumÄ ir tÄpat. VisdrÄ«zÄk jÅ«s zinÄt, kÄdi dati jÄieraksta YAML failÄ, bet neesat droÅ”i, kÄ tos savienot savÄ starpÄ. TÄpÄc pirms YAML rakstīŔanas, uzzÄ«mÄjiet pseido konfigurÄciju.
Pseido konfigurÄcija ir lÄ«dzÄ«ga pseido kodam, kur nav jÄuztraucas par struktÅ«ru vai atkÄpÄm, attiecÄ«bÄm 'vecÄks-bÄrns', mantoÅ”anu un iedziļinÄÅ”anu. ArÄ« Å”eit: jÅ«s zÄ«mÄjat datu iterÄcijas, kad tÄs rodas jÅ«su prÄtÄ.

Pseido konfigurÄcija ar programmÄtÄju sarakstu (Martin un Tabitha) un viÅu prasmÄm (programmÄÅ”anas valodÄs: Python, Perl, Pascal un Lisp, Fortran, Erlang, attiecÄ«gi).
UzzÄ«mÄjot pseido konfigurÄciju uz papÄ«ra, uzmanÄ«gi to analizÄjiet un, ja viss ir kÄrtÄ«bÄ, sakÄrtot to derÄ«gÄ YAML failÄ.
6. Dilemma 'tabulÄcija vai atstarpes'
Jums nÄksies izŔķirt dilemma . Ne globÄlÄ nozÄ«mÄ, bet tikai jÅ«su organizÄcijas lÄ«menÄ«, vai vismaz projekta ietvaros. Nav svarÄ«gi, vai tajÄ tiks izmantota sed skriptu pÄcapstrÄde, programmÄtÄju tekstu redaktoru konfigurÄcija vai vispÄrÄja parakstu vÄkÅ”ana par stingru lintra norÄdÄ«jumu ievÄroÅ”anu lÄ«dz darba zaudÄÅ”anai, bet visiem jÅ«su komandas locekļiem, kuri kaut kÄdÄ veidÄ saskaras ar YAML, obligÄti jÄizmanto tikai atstarpes (kÄ to prasa YAML specifikÄcija).
JebkurÄ normÄlÄ tekstu redaktorÄ var iestatÄ«t automÄtisko tabulÄcijas aizvietoÅ”anu ar noteiktu atstarpu skaitu, tÄpÄc nav jÄbaidÄs no sacelÅ”anÄs piekritÄjiem taustiÅam Tab nav jÄsatraucas.
KÄ katram YAML antipatijam ir labi zinÄms, ekrÄnÄ nav redzamas atŔķirÄ«bas starp tabulÄciju un atstarpÄm. Un, ja kaut kas nav redzams, parasti to atceras pÄdÄjÄ brÄ«dÄ«, pÄc tam, kad ir pÄrbaudÄ«tas un novÄrstas visas citas iespÄjamas problÄmas. Stundas laikÄ, kas iztÄrÄta, meklÄjot nepareizu tabulÄciju vai atstarpu bloku, skaidri liecina, ka jums steidzami jÄizveido politiku attiecÄ«bÄ uz tÄ izmantoÅ”anu, un pÄc tam jÄrealizÄ stingra tÄs ievÄroÅ”anas pÄrbaude (piemÄram, ar Git hook, kas parÄda, caur lintru).
7. LabÄk mazÄk, bet labÄk (vai vairÄk ā tas ir mazÄk)
Daži cilvÄki mÄ«l rakstÄ«t YAML, jo tas uzsver struktÅ«ru. TajÄ paÅ”Ä laikÄ viÅi aktÄ«vi izmanto atkÄpes, lai izceltu datu blokos. Tas ir sava veida krÄpÅ”anÄs, lai imitÄtu atzÄ«mÄÅ”anas valodas, kurÄs tiek izmantoti skaidri atdalÄ«tÄji.
Å eit ir Å”Ädas strukturÄtÄ«bas 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
KÄdam Å”Äda iespÄja palÄ«dz sakÄrtot YAML struktÅ«ru prÄtÄ, citiem tÄ gluži pretÄji izraisa diskomfortu ar bezjÄdzÄ«gajiem, viÅuprÄt, atkÄpÄm.
Bet, ja jÅ«s esat YAML dokumenta Ä«paÅ”nieks un atbildat par tÄ uzturÄÅ”anu, tad jÅ«s un tikai jÅ«s jums jÄnosaka, kÄ izmantot atkÄpes. Ja jÅ«s kaitina lielas atkÄpes, samaziniet tÄs lÄ«dz minimumam, kas ir iespÄjams saskaÅÄ ar YAML specifikÄciju. PiemÄram, iepriekÅ” minÄto failu no Ansible dokumentÄcijas bez jebkÄdiem zaudÄjumiem var pÄrveidot Å”Ädi:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Izmantojiet Ŕablonus
Ja, aizpildot YAML failu, jÅ«s pastÄvÄ«gi atkÄrtojat vienas un tÄs paÅ”as kļūdas, ir jÄga iekļaut tajÄ veidni komentÄra veidÄ. TÄdÄjÄdi nÄkamreiz varÄsiet vienkÄrÅ”i kopÄt Å”o Å”ablonu un ierakstÄ«t tur reÄlos 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 nenotur jÅ«s cieÅ”i rokÄs, tad, iespÄjams, ir vÄrts nomainÄ«t YAML uz citu formÄtu. Laika gaitÄ konfigurÄcijas faili var pÄraugt sevi, un tad labÄk ir tos pÄrveidot par vienkÄrÅ”iem skriptiem Lua vai Python.
YAML ir lieliska lieta, ko daudzi novÄrtÄ par minimÄlismu un vienkÄrŔību, taÄu tas nav vienÄ«gais instruments jÅ«su arsenÄlÄ. TÄpÄc dažreiz no tÄ var atteikties. YAML ir viegli atrast parsÄÅ”anas bibliotÄkas, tÄpÄc, ja jÅ«s piedÄvÄsiet Ärtas migrÄcijas iespÄjas, jÅ«su lietotÄji relatÄ«vi nesÄpÄ«gi piedzÄ«vos Å”Ädu atteikÅ”anos.
Ja bez YAML nevar iztikt, tad paÅemiet vÄrÄ Å”os 10 padomus un uzvariet savu nepatiku pret YAML reiz un uz visiem laikiem!
Avots: habr.com
