Mes visi mėgstame Ansible, bet Ansible yra YAML. Yra daug konfigūracijos failų formatų: reikšmių sąrašai, parametrų ir reikšmių poros, INI failai, YAML, JSON, XML ir daugelis kitų. Tačiau dėl kelių priežasčių YAML dažnai laikoma ypač sudėtinga. Visų pirma, nepaisant gaivaus minimalizmo ir įspūdingų galimybių dirbti su hierarchinėmis reikšmėmis, YAML sintaksė gali erzinti dėl savo Python tipo įtraukos.
Jei YAML jus erzina, galite – ir turėtumėte! – Atlikite šiuos 10 žingsnių, kad sumažintumėte savo nusivylimą iki priimtino lygio ir įsimylėtumėte YAML. Kaip ir dera šiame sąraše, mūsų dešimt patarimų bus suskaičiuoti nuo nulio, mes įtrauksime meditaciją ir dvasines praktikas pagal valią 😉
0. Padarykite savo redaktorių darbą
Nesvarbu, kokį teksto rengyklę turite, tikriausiai yra bent vienas papildinys darbui su YAML. Jei jo neturite, nedelsdami suraskite ir įdiekite. Laikas, praleistas ieškant ir nustatant, atsipirks daug kartų kiekvieną kartą, kai turėsite redaguoti YAML.
Pavyzdžiui, redaktorius
„Emacs“ veikia YAML režimu ir rodo tarpus.
Jei jūsų mėgstamiausias redaktorius neturi YAML režimo, kai kurias problemas galima išspręsti dirbant su nustatymais. Pavyzdžiui, standartinė GNOME teksto rengyklė Gedit neturi YAML režimo, tačiau pagal numatytuosius nustatymus paryškina YAML sintaksę ir leidžia konfigūruoti darbą su įtraukomis:
Įtraukų nustatymas Gedite.
Papildinys
Kitaip tariant, praleiskite laiką mokydamiesi apie savo mėgstamą redaktorių. Sužinokite, ką jis arba jo kūrėjų bendruomenė gali pasiūlyti darbui su YAML, ir naudokite šias funkcijas. Tikrai nepasigailėsite.
1. Naudokite liniją
Idealiu atveju programavimo kalbos ir žymėjimo kalbos naudoja nuspėjamą sintaksę. Kompiuteriai yra gerai nuspėjami, todėl tokia koncepcija
Įdiekite
$ sudo dnf install yamllint
Tada tiesiog paleiskite yamllint, perduodami jam YAML failą, kad patikrintumėte. Štai kaip atrodo, jei failą su klaida perduodate linteriui:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
Skaičiai kairėje yra ne laikas, o klaidos koordinatės: eilutės ir stulpelio numeris. Klaidos aprašymas gali nieko nesakyti, bet jūs tiksliai žinote, kur ji yra. Tiesiog pažiūrėkite į šią kodo vietą ir greičiausiai viskas paaiškės.
Kai yamllint faile neranda klaidų, ekrane nieko nespausdinama. Jei tokia tyla jus gąsdina ir norite šiek tiek daugiau atsiliepimų, galite paleisti linterį naudodami sąlyginę echo komandą naudodami dvigubą ampersandą (&&), pavyzdžiui:
$ yamllint perfect.yaml && echo "OK"
OK
POSIX sistemoje dvigubas ampersandas suveikia tada ir tik tada, kai ankstesnė komanda grąžina 0. O yamllint tiesiog grąžina rastų klaidų skaičių, todėl visa ši sąlyginė konstrukcija veikia.
2. Rašykite Python, o ne YAML
Jei YAML tikrai jus erzina, tiesiog nerašykite. Taip atsitinka, kad YAML yra vienintelis formatas, kurį programa supranta. Tačiau net ir šiuo atveju nebūtina kurti YAML failo. Parašykite, kas jums patinka, tada konvertuokite. Pavyzdžiui, yra puiki Python biblioteka
Atsivertimas į save
Šiuo atveju duomenų failas taip pat yra Python scenarijus, generuojantis YAML. Šis metodas geriausiai tinka mažiems duomenų rinkiniams. Jūs tiesiog įrašote JSON duomenis į Python kintamąjį, įvedate į jį importavimo direktyvą ir failo pabaigoje pridedate tris eilutes, kad įgyvendintumėte išvestį.
#!/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
Dabar paleidžiame šį failą Python ir gauname failą 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
Tai visiškai tinka YAML, bet yamllint įspės, kad jis neprasideda -. Na, tai gali būti lengvai ištaisyta rankiniu būdu arba šiek tiek pakeista Python scenarijuje.
Konvertavimas naudojant scenarijus
Tokiu atveju pirmiausia rašome JSON, o tada paleidžiame keitiklį kaip atskirą Python scenarijų, kuris sukuria YAML kaip išvestį. Palyginti su ankstesniu metodu, šis metodas yra geresnis, nes konvertavimas yra atskirtas nuo duomenų.
Pirmiausia sukurkime JSON failą example.json, pavyzdžiui, galite jį paimti iš
{
"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"
}
}
}
}
}
Tada sukursime paprastą konverterio scenarijų ir išsaugosime jį pavadinimu json2yaml.py. Šis scenarijus importuoja ir YAML, ir JSON Python modulius ir įkelia vartotojo nurodytą JSON failą, atlieka konvertavimą ir įrašo duomenis į output.yaml failą.
#!/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()
Išsaugokite šį scenarijų sistemos kelyje ir paleiskite jį pagal poreikį:
$ ~/bin/json2yaml.py example.json
3. Analizuokite daug ir dažnai
Kartais naudinga į problemą pažvelgti kitu kampu. Jei kyla problemų pateikiant ryšius tarp duomenų YAML, galite laikinai pakeisti juos į ką nors labiau pažįstamą.
Pavyzdžiui, jei jums patogu dirbti su žodynų sąrašais arba JSON, galite konvertuoti YAML į JSON naudodami tik dvi komandas interaktyviame Python apvalkale. Tarkime, kad turite YAML failą mydata.yaml, tada jis atrodytų taip:
$ 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.'}
Šioje temoje galite rasti daug kitų pavyzdžių. Be to, yra daug internetinių keitiklių ir vietinių analizatorių. Taigi nedvejodami performatuokite duomenis, kai juose matote tik nesuprantamą maišatį.
4. Perskaitykite specifikacijas
Grįžtant į YAML po ilgos pertraukos, pravartu apsilankyti
5. Pseudo konfigūracijos
Rašant knygą ar straipsnį, visada pravartu iš pradžių nubrėžti preliminarius kontūrus, bent jau turinio lentelės pavidalu. Tas pats yra su YAML. Greičiausiai turite idėją, kokius duomenis reikia įrašyti į YAML failą, bet nelabai suprantate, kaip juos sujungti vienas su kitu. Todėl prieš formuodami YAML nubrėžkite pseudokonfigūraciją.
Pseudokonfigūracija yra panaši į pseudo kodą, kai jums nereikia jaudintis dėl struktūros ar įtraukos, tėvų ir vaikų santykių, paveldėjimo ir įdėjimo. Čia tas pats: braižote duomenų iteracijas, kai jie atsiranda jūsų galvoje.
Pseudokonfigūracijos programuotojai (Martin ir Tabitha) ir jų įgūdžiai (programavimo kalbos: atitinkamai Python, Perl, Pascal ir Lisp, Fortran, Erlang).
Nubraižę pseudokonfigūraciją ant popieriaus lapo, atidžiai ją išanalizuokite ir, jei viskas tvarkoje, suformatuokite į galiojantį YAML failą.
6. Skirtukų ir tarpų dilema
Turėsite išspręsti dilemą
Bet kuriame įprastame teksto rengyklėje galite sukonfigūruoti automatinio koregavimo skirtukus iki nurodyto skaičiaus tarpų, kad būtų išvengta pagrindinių šalininkų maišto. Kortelė tau nereikia bijoti.
Kiekvienas YAML nekentėjas puikiai žino, ekrane nematote skirtumo tarp skirtukų ir tarpų. O kai ko nors nesimato, dažniausiai tai atsimena paskutinis dalykas, kai sutvarko, patikrino ir pašalina visas kitas galimas problemas. Valanda laiko, praleisto ieškant lentelės kreivės ar tarpų bloko, tiesiog rėkia, kad reikia skubiai sukurti vieno ar kito naudojimo politiką, o tada atlikti gelžbetoninį patikrinimą, ar jos laikomasi (pavyzdžiui, per Git kablys, norint priversti jį per prievartą).
7. Mažiau yra daugiau (arba daugiau yra mažiau)
Kai kurie žmonės mėgsta rašyti YAML, nes tai pabrėžia struktūrą. Tuo pačiu metu jie aktyviai naudoja įtrauką, kad paryškintų duomenų blokus. Tai apgaulė, kuria siekiama imituoti žymėjimo kalbas, kuriose naudojami aiškūs skyrikliai.
Štai tokios struktūros pavyzdys iš
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Vieniems ši parinktis padeda susitvarkyti YAML struktūrą galvoje, kitus, priešingai, erzina daugybe, jų nuomone, nereikalingų įtraukų.
Bet jei esate YAML dokumento savininkas ir esate atsakingas už jo priežiūrą, tada tu ir tik tu turi apibrėžti, kaip naudoti įtrauką. Jei jus erzina didelis kamšalas, pagal YAML specifikaciją sumažinkite jo kiekį iki minimumo. Pavyzdžiui, aukščiau esantis failas iš Ansible dokumentacijos gali būti perrašytas taip be jokių nuostolių:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Naudokite ruošinius
Jei pildydami YAML failą nuolat kartojate tas pačias klaidas, prasminga į jį įterpti šabloną kaip komentarą. Tada kitą kartą galėsite tiesiog nukopijuoti šį šabloną ir įvesti tikrus duomenis, pavyzdžiui:
---
# - <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. Naudokite ką nors kitokio
Jei programa neapsaugo jūsų, gali būti verta pakeisti YAML į kitą formatą. Laikui bėgant, konfigūracijos failai gali išaugti patys ir tada geriau juos konvertuoti į paprastus scenarijus Lua arba Python.
YAML yra puikus dalykas, kurį daugelis mėgsta dėl savo minimalizmo ir paprastumo, tačiau tai toli gražu ne vienintelis įrankis jūsų arsenale. Taigi kartais galite to atsisakyti. Nagrinėjimo bibliotekas nesunku rasti YAML, taigi, jei pasiūlysite paprastas perkėlimo parinktis, jūsų vartotojai išgyvens šią nesėkmę gana neskausmingai.
Jei negalite išsiversti be YAML, pasinaudokite šiais 10 patarimų ir kartą ir visiems laikams įveik savo nemėgimą YAML!
Šaltinis: www.habr.com