Vi elsker alle Ansible, men Ansible er YAML. Det finnes mange formater for konfigurasjonsfiler: verdilister, nÞkkel-verdi-par, INI-filer, YAML, JSON, XML og mange andre. Men av flere grunner anses YAML ofte for Ä vÊre spesielt problematisk. Spesielt, til tross for dens friske minimalistiske stil og imponerende evner til Ä hÄndtere hierarkiske verdier, kan YAMLs syntaks irritere med sin Python-lignende tilnÊrming til innrykk.

Hvis YAML plager deg, kan du â og bĂžr! â ta de 10 fĂžlgende stegene for Ă„ redusere irritasjonen din til et akseptabelt nivĂ„ og lĂŠre Ă„ elske YAML. Som en ekte liste vil vĂ„re ti tips begynne pĂ„ null, og meditasjon og Ă„ndelige praksiser kan legges til etter Ăžnske đ
0. FĂ„ redaktĂžren din til Ă„ fungere
Uansett hvilken tekstredigerer du har, finnes det forhÄpentligvis minst én plugin for Ä jobbe med YAML. Hvis ikke, finn og installer en med en gang. Tiden brukt pÄ Ä lete etter og konfigurere dette, vil betale seg mange ganger hver gang du mÄ redigere YAML.
For eksempel stĂžtter redaktĂžren YAML som standard, mens GNU Emacs krever installasjon av ekstra pakker, som for eksempel .

Emacs i YAML-modus og viser mellomrom.
Hvis favorittredaktĂžren din ikke har YAML-modus, kan du lĂžse noen problemer ved Ă„ leke med innstillingene. For eksempel har GNOME sin standard tekstredigerer Gedit ikke YAML-modus, men den fremhever synlig syntaks for YAML og lar deg justere innrykking:

Innstilling av innrykk i Gedit.
Og pluginen for Gedit viser mellomrom som prikker, som fjerner tvil om nivÄene av innrykk.
Med andre ord, bruk litt tid pÄ Ä lÊre redaktÞren din. Finn ut hva den eller utviklerfellesskapet tilbyr for Ä jobbe med YAML, og bruk de mulighetene. Du kommer ikke til Ä angre pÄ det.
1. Bruk en linter
Ideelt sett bruker programmeringssprÄk og markup-sprÄk en forutsigbar syntaks. Datamaskiner hÄndterer forutsigbarhet godt, sÄ allerede i 1978 ble konseptet skapt. Hvis dette konseptet har gÄtt deg forbi i lÞpet av de 40 Ärene, og du fortsatt ikke bruker en YAML-linter, er det pÄ hÞy tid Ä prÞve yamllint.
Installer kan gjĂžres med den innebygde pakkehanteren for Linux. For eksempel i 8 eller gjĂžr man det slik:
$ sudo dnf install yamllint
Deretter kjĂžrer du bare yamllint, og gir den YAML-filen som skal sjekkes. Slik ser det ut hvis du gir linteren en fil med feil:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntaksfeil: mapping verdier er ikke tillatt her
23:11 error trailende mellomrom (trailing-spaces)
Tallene til venstre er ikke tid, men koordinater for feilen: linjenummer og kolonnenummer. Feilbeskrivelsen gir deg kanskje ikke mye informasjon, men du vet eksakt hvor den er. Bare se pÄ stedet i koden, og sÄ blir det mest sannsynlig klart.
NÄr yamllint ikke finner feil i filen, vises det ingenting pÄ skjermen. Hvis du er bekymret for det stillheten gir, og Þnsker litt mer tilbakemelding, kan du kjÞre linteren med en betinget kommando echo gjennom dobbeltampersand (&&), slik:
$ yamllint perfect.yaml && echo "OK"
OK
I POSIX aktiveres dobbeltampersand da og bare da nÄr den foresgÄende kommandoen returnerer 0. Og yamllint returnerer nettopp antallet funnet feil, sÄ hele denne betingede konstruksjonen fungerer.
2. Skriv i Python, ikke i YAML
Hvis du virkelig er lei av YAML, trenger du ikke Ä skrive i det, bokstavelig talt. Noen ganger er YAML den eneste formatet som forstÄs av applikasjonen. Men selv da er det ikke nÞdvendig Ä lage en YAML-fil. Skriv i det du liker, og konverter deretter. For Python finnes det et utmerket bibliotek og faktisk to mÄter Ä konvertere pÄ: selvkonvertering og konvertering via skript.
Selvkonvertering
I dette tilfellet er datafilen ogsÄ et Python-skript som genererer YAML. Denne metoden er best egnet for smÄ datasett. Du skriver bare JSON-dataene inn i en Python-variabel, innleder dette med en import-direktiv, og til slutt i filen legger du til tre linjer for Ä skrive ut.
#!/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
NÄ kjÞrer vi denne filen i Python, og ut fÄr vi output.yaml-filen:
$ python3 .\/example.json
$ cat output.yaml
glossary:
GlossDiv:
GlossList:
GlossEntry:
Abbrev: ISO 8879:1986
Acronym: SGML
GlossDef:
GlossSeeAlso: [GML, XML]
para: Et meta-markup-sprÄk, som brukes til Ä lage markup-sprÄk som DocBook.
GlossSee: markup
GlossTerm: Standard Generalized Markup Language
ID: SGML
SortAs: SGML
title: S
title: eksempel ordliste
Dette er helt korrekt YAML, men yamllint vil gi en advarsel om at den ikke begynner med â. Vel, dette kan enkelt rettes manuelt eller litt justeres i Python-skriptet.
Konvertering via skript
I dette tilfellet skriver vi fĂžrst i JSON, og deretter kjĂžrer vi en konverterer som et eget Python-skript, som gir YAML som utdata. I motsetning til den forrige metoden, skalerer denne bedre, siden konverteringen er adskilt fra dataene.
FÞrst mÄ vi opprette en JSON-fil example.json, som for eksempel kan hentes fra :
{
"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": "Et meta-markup-sprÄk som brukes til Ä lage markup-sprÄk som DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
Deretter lager vi et enkelt konverteringsskript og lagrer det som json2yaml.py. Dette skriptet importerer begge modulene â YAML og JSON i Python, og laster den brukerspesifiserte JSON-filen, utfĂžrer konverteringen og skriver dataene til output.yaml-filen.
#!/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()
Lagre dette skriptet i systemets sti og kjĂžr det etter behov:
$ ~/bin/json2yaml.py example.json
3. Pars flere og ofte
Noen ganger kan det vÊre nyttig Ä se problemet fra en annen vinkel. Hvis det er vanskelig Ä forstÄ sammenhengen mellom dataene i YAML, kan de midlertidig konverteres til noe mer kjent.
For eksempel, hvis du foretrekker Ă„ jobbe med ordbokslisten eller JSON, kan YAML konverteres til JSON med bare to kommandoer i Python-interaktivt skall. Anta at du har en YAML-fil mydata.yaml, her er hvordan det ville se ut:
$ 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': 'God artikkel. Kunne vĂŠrt bedre.'}
Det finnes mange andre eksempler pÄ dette emnet. I tillegg er det mange online-konverterere og lokale parserver tilgjengelig. SÄ ikke nÞl med Ä omformaterere data nÄr du ser dem som en uforstÄelig blanding.
4. Les spesifikasjoner
NÄr du vender tilbake til YAML etter en lang pause, kan det vÊre nyttig Ä besÞke og lese spesifikasjonene pÄ nytt. Hvis du har hatt vanskeligheter med YAML, men ikke har fÄtt tid til Ä se pÄ spesifikasjonen, er det pÄ hÞy tid Ä rette opp i dette. Spesifikasjonene er overraskende lettfattelige, og reglene for syntaks illustreres med et stort antall eksempler i .
5. Pseudokonfigurer
NÄr du skriver en bok eller artikkel, er det alltid nyttig Ä lage en preliminÊr plan, i det minste i form av et innholdsfortegnelse. Det samme gjelder YAML. Du har sannsynligvis en idé om hvilke data som skal skrives i YAML-filen, men forstÄr ikke helt hvordan du knytter dem sammen. Derfor, fÞr du begynner Ä lage YAML, tegn et pseudokonfigurasjon.
Pseudokonfigurasjonen ligner pÄ pseudokode, hvor du ikke trenger Ä bekymre deg for struktur eller innrykk, forholdet mellom 'forelder-barne', arv og innkapsling. Her tegner du datasykluser etter hvert som de dukker opp i hodet ditt.

Pseudokonfigurasjon med en opplisting av programmerere (Martin og Tabitha) og deres ferdigheter (programmeringssprÄk: Python, Perl, Pascal og Lisp, Fortran, Erlang, henholdsvis).
Etter Ä ha tegnet pseudokonfigurasjonen pÄ papir, analyser den nÞye, og hvis alt ser bra ut, formater det som en gyldig YAML-fil.
6. Dilemmaet 'tabulering eller mellomrom'
Du mÄ lÞse dilemaet . Ikke i global forstand, men bare pÄ nivÄet med din organisasjon, eller minst prosjektet. Det spiller ingen rolle om du bruker post-prosessering med sed-skript, konfigurerer tekstredigerere pÄ programmerernes maskiner, eller om hele teamet skriver under pÄ strenge retningslinjer fra linteren under trussel om oppsigelse, alle medlemmer av teamet ditt som pÄ en eller annen mÄte berÞrer YAML, mÄ uten unntak bruke mellomrom (som spesifikasjonen for YAML krever).
I enhver normal tekstredigerer kan du konfigurere autoudskiftning av tabulering til et angitt antall mellomrom, sÄ det er ingen grunn til Ä frykte opprÞret fra tilhengerne av tasten Tab kan ikke fryktes.
Som det er velkjent av enhver YAML-hater, er det ingen synlig forskjell mellom tabulering og mellomrom pÄ skjermen. NÄr noe ikke er synlig, husker folk det vanligvis sist, etter Ä ha behandlet, sjekket og utelukket alle andre mulige problemer. En time kastet bort pÄ Ä lete etter en feil tabulering eller en blokk med mellomrom, roper etter at du umiddelbart bÞr lage en politikk for bruk av det ene eller det andre, og deretter implementere en solid sjekk for overholdelse (for eksempel via en Git-hook for Ä tvinge en kjÞring gjennom linteren).
7. Bedre mindre, men bedre (eller mer â det er mindre)
Noen mennesker liker Ä skrive i YAML, da det fremhever strukturen. De bruker aktivt innrykk for Ä skille datablokker. Dette er en slags juks for Ä imitere markup-sprÄk som bruker tydelige separatorer.
Her er et eksempel pÄ slik struktur fra :
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
For noen hjelper denne varianten dem med Ă„ organisere YAML-strukturen, mens andre er irritert over det de anser som unĂždvendige innrykk.
Men hvis du er eier av en YAML-dokument og ansvarlig for vedlikeholdet, sÄ er det kun du som skal bestemme hvordan innrykkene skal brukes. Hvis store innrykk irriterer deg, reduser dem til et minimum som er mulig i henhold til YAML-spesifikasjonen. For eksempel kan den ovennevnte filen fra Ansible-dokumentasjonen uten tap skrives slik:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Bruk maler
Hvis du stadig gjentar de samme feilene nÄr du fyller ut YAML-filen, kan det vÊre lurt Ä sette inn en mal i form av en kommentar. Da kan du enkelt kopiere denne malen neste gang og fylle inn de faktiske dataene, for eksempel:
---
# - <common name>:
# name: Fornavn Etternavn
# job: JOB
# skills:
# - SPRĂ
K
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
9. Bruk noe annet
Hvis applikasjonen ikke holder deg fast, kan det vĂŠre lurt Ă„ bytte fra YAML til et annet format. Over tid kan konfigurasjonsfiler bli uegnet, og da er det bedre Ă„ konvertere dem til enkle skript i Lua eller Python.
YAML er et glimrende verktÞy som mange liker for sitt minimalistisk uttrykk og enkelhet, men det er langt fra det eneste verktÞyet i arsenalet ditt. SÄ noen ganger kan du fint gÄ bort fra det. Det er enkelt Ä finne parse-biblioteker for YAML, sÄ hvis du foreslÄr enkle migrasjonsalternativer, vil brukerne dine forholde seg til dette klart og smertefritt.
Men hvis du ikke kan unngÄ YAML, sÄ ta til deg disse 10 tipsene og overvinn din aversjon mot YAML en gang for alle!
Kilde: habr.com
