Ons is almal lief vir Ansible, maar Ansible is YAML. Daar is baie formate vir konfigurasielêers: waardelyste, parameter-waarde-pare, INI-lêers, YAML, JSON, XML, en vele ander. Om verskeie redes, van almal, word YAML egter dikwels as besonder moeilik beskou. In die besonder, ten spyte van sy verfrissende minimalisme en indrukwekkende moontlikhede om met hiërargiese waardes te werk, kan die YAML-sintaksis irriterend wees met sy Python-agtige benadering tot inkeping.
As YAML jou vies maak, kan jy - en jy moet! - neem die volgende 10 stappe om jou irritasie tot 'n aanvaarbare vlak te verminder en lief te wees vir YAML. Soos dit hierdie lys betaam, sal ons tien wenke van voor af genommer word, ons voeg meditasie en geestelike praktyke by soos verlang 😉
0. Laat jou redakteur werk
Dit maak nie saak watter teksredigeerder jy het nie, daar is waarskynlik ten minste een YAML-inprop daarvoor. As jy nie een het nie, vind en installeer dadelik. Die tyd wat jy spandeer om te soek en aan te pas, sal baie keer meer betaal elke keer as jy YAML moet wysig.
Byvoorbeeld, redakteur
Emacs in YAML-modus en vertoon spasies.
As jou gunsteling redakteur nie YAML-modus het nie, kan sommige van die probleme opgelos word deur met die instellings te werk. Byvoorbeeld, die verstek teksredigeerder vir GNOME, Gedit, het nie YAML-modus nie, maar dit beklemtoon standaard YAML-sintaksis en laat jou toe om inkeping aan te pas:
Stel inkepings in Gedit.
'n Inprop
Met ander woorde, neem die tyd om jou gunsteling redakteur te leer. Vind uit wat hy of sy ontwikkelingsgemeenskap kan bied om met YAML te werk, en benut daardie geleenthede. Jy sal beslis nie spyt wees nie.
1. Gebruik 'n linter
Ideaal gesproke gebruik programmeertale en opmaaktale voorspelbare sintaksis. Rekenaars is goed met voorspelbaarheid, en daarom het die konsep in 1978 ontstaan
Om te installeer
$ sudo dnf install yamllint
Jy hardloop dan eenvoudig yamllint en gee dit 'n YAML-lêer aan om te toets. Hier is hoe dit lyk as jy 'n lêer met 'n fout na die linter deurgee:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
Die getalle aan die linkerkant is nie die tyd nie, maar die koördinate van die fout: die nommer van die ry en kolom. Die beskrywing van die fout sê dalk niks vir jou nie, maar jy weet presies waar dit is. Kyk net na hierdie plek in die kode, en heel waarskynlik sal alles duidelik word.
Wanneer yamllint geen foute in 'n lêer vind nie, word niks op die skerm gedruk nie. As so 'n stilte jou bang maak en jy wil 'n bietjie meer terugvoer hê, dan kan jy die linter met die eggo voorwaardelike opdrag deur 'n dubbele ampersand (&&) soos volg laat loop:
$ yamllint perfect.yaml && echo "OK"
OK
In POSIX word die dubbele ampersand afgevuur as en slegs as die voorafgaande opdrag 0 gee. En yamllint gee net die aantal foute wat gevind is terug, en daarom werk hierdie hele voorwaardelike konstruk.
2. Skryf in Python, nie YAML nie
As YAML jou regtig vies maak, moet net nie letterlik daarin skryf nie. Dit gebeur dat YAML die enigste formaat is wat deur die aansoek aanvaar word. Maar in hierdie geval is dit nie nodig om 'n YAML-lêer te skep nie. Skryf oor waarvan jy hou, en skakel dan om. Daar is byvoorbeeld 'n wonderlike biblioteek vir Python
Self-bekeerend
In hierdie geval is die datalêer ook 'n Python-skrip wat YAML genereer. Hierdie metode is die beste vir klein datastelle. Jy skryf eenvoudig JSON-data na 'n Python-veranderlike, voorvoegsel dit met 'n invoer-aanwysing, en voeg drie reëls aan die einde van die lêer by om die uitvoer te implementeer.
#!/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
Nou hardloop ons hierdie lêer in Python en kry die output.yaml lêer as 'n uitvoer:
$ 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
Dit is heeltemal geldig YAML, maar yamllint sal jou waarsku dat dit nie met - begin nie. Wel, dit kan maklik met die hand reggestel word, of effens aangepas word deur die Python-skrif.
Omskakeling via skrifte
In hierdie geval skryf ons eers in JSON, en hardloop dan die omskakelaar as 'n aparte Python-skrip, wat YAML as 'n uitvoer produseer. In vergelyking met die vorige metode, skaal hierdie metode beter, aangesien die omskakeling geskeide data is.
Kom ons skep eers 'n JSON-lêer example.json, jy kan dit byvoorbeeld neem
{
"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"
}
}
}
}
}
Kom ons skep dan 'n eenvoudige omskakelingskrip en stoor dit as json2yaml.py. Hierdie skrif voer beide die YAML- en JSON Python-modules in, laai die gebruiker-gespesifiseerde JSON-lêer, voer die omskakeling uit en skryf die data na die output.yaml-lêer.
#!/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()
Stoor hierdie skrip na die stelselpad en hardloop soos nodig:
$ ~/bin/json2yaml.py example.json
3. Ontleed baie en dikwels
Soms help dit om uit 'n ander hoek na 'n probleem te kyk. As jy dit moeilik vind om verwantskappe tussen data in YAML voor te stel, kan jy dit tydelik omskep in iets meer bekend.
Byvoorbeeld, as jy gemaklik is om met woordeboeklyste of JSON te werk, kan YAML omgeskakel word na JSON met net twee opdragte in 'n interaktiewe Python-dop. Kom ons sê jy het 'n YAML-lêer mydata.yaml, dan is dit hoe dit sal lyk:
$ 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.'}
Daar is baie ander voorbeelde oor hierdie onderwerp. Daarbenewens is daar baie aanlyn-omskakelaars en plaaslike ontleders beskikbaar. So voel vry om die data te herformateer wanneer jy net 'n onverstaanbare mengelmoes daarin sien.
4. Lees die spesifikasies
Om terug te kom na YAML na 'n lang onderbreking, is dit nuttig om uit te check
5. Pseudokonfigurasies
Wanneer 'n boek of artikel geskryf word, is dit altyd 'n goeie idee om eers 'n voorlopige uiteensetting te skets, ten minste in die vorm van 'n inhoudsopgawe. Dieselfde met YAML. Waarskynlik, jy het 'n idee van watter data na die YAML-lêer geskryf moet word, maar jy verstaan nie regtig hoe om dit met mekaar in verband te bring nie. Daarom, voordat jy YAML beeldhou, teken 'n pseudo-opstelling.
Pseudoconfig is soos pseudokode waar jy jou nie hoef te bekommer oor struktuur of inkeping, ouer-kind verhoudings, erfenis en nes nie. So dit is hier: jy teken iterasies van die data soos dit in jou kop verskyn.
Pseudoconfig lys programmeerders (Martin en Tabitha) en hul vaardighede (programmeertale: Python, Perl, Pascal en Lisp, Fortran, Erlang, onderskeidelik).
Nadat u 'n pseudo-opstelling op 'n stuk papier geteken het, ontleed dit noukeurig en, as alles in orde is, formateer dit as 'n geldige YAML-lêer.
6. Die Tabs of Spaces-dilemma
Jy moet 'n dilemma oplos
In enige gewone teksredigeerder kan u outomatiese vervanging van oortjies vir 'n gegewe aantal spasies opstel, sodat die aanhangers van die sleutel in opstand kom. Blad jy kan nie bang wees nie.
Soos elke YAML-hater deeglik bewus is, is daar geen verskil tussen oortjies en spasies op die skerm nie. En wanneer iets nie sigbaar is nie, word dit as 'n reël laaste onthou, nadat dit uitgesorteer, nagegaan en alle ander moontlike probleme uitgeskakel is. 'n Uur se tyd wat vermors word op soek na 'n oortjie of blok spasies, skree net dat jy dringend 'n beleid moet skep vir die gebruik van die een of die ander, en dan 'n gewapende beton-tjek vir die nakoming daarvan moet implementeer (byvoorbeeld deur 'n Git-haak om dwing om deur die linter te hardloop).
7. Minder is beter (of meer is minder)
Sommige mense hou daarvan om in YAML te skryf omdat dit struktuur beklemtoon. Terselfdertyd gebruik hulle aktief inkepings om blokke data uit te lig. Dit is soort van 'n bedrogspul om opmaaktale na te boots wat eksplisiete afbakenings gebruik.
Hier is 'n voorbeeld van so 'n struktuur van
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Vir sommige help hierdie opsie om die YAML-struktuur in hul koppe te ontbind, terwyl dit vir ander, inteendeel, hulle irriteer met 'n massa onnodige, na hul mening, inkepings.
Maar as jy die eienaar van die YAML-dokument is en verantwoordelik is vir die instandhouding daarvan, dan jy en net jy moet bepaal hoe om inkeping te gebruik. As groot inkepings jou irriteer, hou dit tot die minimum moontlik volgens die YAML-spesifikasie. Byvoorbeeld, die bogenoemde lêer uit die Ansible-dokumentasie kan so herskryf word sonder enige verlies:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Gebruik spasies
As jy aanhou om dieselfde foute te herhaal wanneer jy 'n YAML-lêer invul, maak dit sin om 'n leë sjabloon daarin in te voeg as 'n opmerking. Dan kan jy die volgende keer eenvoudig hierdie spasie kopieer en werklike data daar invoer, byvoorbeeld:
---
# - <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. Gebruik iets anders
As die toepassing nie 'n wurggreep op jou het nie, is dit dalk die moeite werd om YAML na 'n ander formaat te verander. Met verloop van tyd kan konfigurasielêers hulself ontgroei, en dan is dit beter om dit in eenvoudige Lua- of Python-skrifte om te skakel.
YAML is 'n wonderlike ding wat baie mense liefhet vir sy minimalisme en eenvoud, maar dit is ver van die enigste hulpmiddel in jou arsenaal. So soms kan jy dit weier. Dit is maklik om ontledingsbiblioteke vir YAML te vind, so as jy gerieflike migrasie-opsies bied, sal jou gebruikers so 'n verwerping relatief pynloos oorleef.
As jy nie sonder YAML kan klaarkom nie, neem dan hierdie 10 wenke in diens en verslaan jou afkeer vir YAML eens en vir altyd!
Bron: will.com