Vi elsker alle Ansible, men Ansible er YAML. Det er mange formater for konfigurasjonsfiler: lister over verdier, parameter-verdi-par, INI-filer, YAML, JSON, XML og mange andre. Men av flere grunner av dem alle, anses YAML ofte som spesielt vanskelig. Spesielt, til tross for sin forfriskende minimalisme og imponerende evner for å jobbe med hierarkiske verdier, kan YAML-syntaksen være irriterende med sin Python-lignende tilnærming til innrykk.
Hvis YAML gjør deg forbanna, kan du – og det burde du! – ta de følgende 10 trinnene for å redusere frustrasjonen til et akseptabelt nivå og bli forelsket i YAML. Som det sømmer seg for denne listen, vil våre ti tips bli nummerert fra bunnen av, vi vil legge til meditasjon og spirituell praksis etter eget ønske 😉
0. Få redaktøren til å fungere
Det spiller ingen rolle hvilken tekstredigerer du har, det er sannsynligvis minst ett plugin for å jobbe med YAML. Hvis du ikke har en, finn og installer den umiddelbart. Tiden brukt på å søke og sette opp vil lønne seg mange ganger hver gang du må redigere YAML.
For eksempel redaktør
Emacs i YAML-modus og viser mellomrom.
Hvis favorittredigereren din ikke har en YAML-modus, kan noen av problemene løses ved å jobbe med innstillingene. For eksempel har standard GNOME-tekstredigerer Gedit ikke en YAML-modus, men som standard fremhever den YAML-syntaks og lar deg konfigurere arbeid med innrykk:
Sette innrykk i Gedit.
En plugin
Med andre ord, bruk tid på å lære om favorittredaktøren din. Finn ut hva han eller utviklingsfellesskapet hans har å tilby for å jobbe med YAML, og bruk disse funksjonene. Du vil definitivt ikke angre på det.
1. Bruk en linter
Ideelt sett bruker programmeringsspråk og markup-språk forutsigbar syntaks. Datamaskiner er gode på forutsigbarhet, og det er derfor konseptet med
Installere
$ sudo dnf install yamllint
Deretter kjører du bare yamllint, sender den YAML-filen for å sjekke. Slik ser det ut hvis du sender en fil med feil til linter:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
Tallene til venstre er ikke tiden, men koordinatene til feilen: rad- og kolonnenummer. Beskrivelsen av feilen forteller deg kanskje ikke noe, men du vet nøyaktig hvor den er. Bare se på dette stedet i koden, og mest sannsynlig vil alt bli klart.
Når yamllint ikke finner feil i en fil, skrives ingenting ut på skjermen. Hvis en slik stillhet skremmer deg og du vil ha litt mer tilbakemelding, kan du kjøre linteren med den betingede ekko-kommandoen via et dobbelt og-tegn (&&), slik:
$ yamllint perfect.yaml && echo "OK"
OK
I POSIX utløses et dobbelt og-tegn hvis og bare hvis den foregående kommandoen returnerer 0. Og yamllint returnerer bare antall feil funnet, og det er derfor hele denne betingede konstruksjonen fungerer.
2. Skriv i Python, ikke YAML
Hvis YAML virkelig gjør deg forbanna, bare ikke skriv i det, bokstavelig talt. Det hender at YAML er det eneste formatet som applikasjonen forstår. Men selv i dette tilfellet er det ikke nødvendig å lage en YAML-fil. Skriv på det du liker og konverter deretter. For eksempel er det et flott bibliotek for Python
Selvkonvertering
I dette tilfellet er datafilen også et Python-skript som genererer YAML. Denne metoden er best egnet for små datasett. Du skriver ganske enkelt JSON-dataene inn i en Python-variabel, innleder den med et importdirektiv, og på slutten av filen legger du til tre linjer for å implementere utdataene.
#!/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 får filen 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
Dette er helt gyldig YAML, men yamllint vil advare deg om at den ikke starter med -. Vel, dette kan enkelt korrigeres manuelt eller litt modifisert i Python-skriptet.
Konvertering via skript
I dette tilfellet skriver vi først i JSON, og kjører deretter konverteren som et eget Python-skript, som produserer YAML som utdata. Sammenlignet med den forrige metoden skalerer denne metoden bedre, siden konverteringen er atskilt fra dataene.
Først, la oss lage en JSON-fil eksempel.json, for eksempel, du kan ta den 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": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
Deretter vil vi lage et enkelt konverteringsskript og lagre det under navnet json2yaml.py. Dette skriptet importerer både YAML- og JSON Python-moduler, og laster en brukerspesifisert JSON-fil, utfører konverteringen og skriver dataene til filen 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()
Lagre dette skriptet i systembanen og kjør det etter behov:
$ ~/bin/json2yaml.py example.json
3. Parse mye og ofte
Noen ganger er det nyttig å se på et problem fra en annen vinkel. Hvis du har problemer med å representere relasjonene mellom dataene dine i YAML, kan du midlertidig transformere dem til noe mer kjent.
For eksempel, hvis du er komfortabel med å jobbe med ordboklister eller JSON, kan du konvertere YAML til JSON med bare to kommandoer i det interaktive Python-skallet. La oss si at du har en YAML-fil mydata.yaml, så er det slik den vil 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': 'Good article. Could be better.'}
Du kan finne mange andre eksempler om dette emnet. I tillegg er det mange online-konverterere og lokale parsere tilgjengelig. Så ikke nøl med å formatere dataene på nytt når du bare ser et uforståelig virvar i det.
4. Les spesifikasjonene
Tilbake til YAML etter en lang pause, er det nyttig å besøke
5. Pseudo-konfigurasjoner
Når du skriver en bok eller artikkel, er det alltid nyttig først å skissere en foreløpig disposisjon, i det minste i form av en innholdsfortegnelse. Det er det samme med YAML. Mest sannsynlig har du en ide om hvilke data som må skrives inn i en YAML-fil, men du forstår egentlig ikke hvordan du kobler dem til hverandre. Derfor, før du skulpturerer YAML, tegn en pseudo-konfigurasjon.
Pseudo-config ligner pseudo-kode, hvor du ikke trenger å bekymre deg for struktur eller innrykk, foreldre-barn-relasjoner, arv og hekking. Det er det samme her: du tegner iterasjoner av dataene etter hvert som de oppstår i hodet ditt.
Pseudo-konfigurasjon som viser programmerere (Martin og Tabitha) og deres ferdigheter (programmeringsspråk: henholdsvis Python, Perl, Pascal og Lisp, Fortran, Erlang).
Etter å ha tegnet en pseudo-konfigurasjon på et stykke papir, analyser den nøye, og hvis alt er i orden, formater den i form av en gyldig YAML-fil.
6. Tabs vs Spaces-dilemmaet
Du må løse dilemmaet
I et hvilket som helst vanlig tekstredigeringsprogram kan du konfigurere automatisk korrigering av tabulatorer til et spesifisert antall mellomrom, slik at viktige tilhengere gjør opprør Tab du trenger ikke være redd.
Som enhver YAML-hater vet godt, kan du ikke se forskjellen mellom faner og mellomrom på skjermen. Og når noe ikke er synlig, er det vanligvis det siste folk husker, etter at de har sortert, sjekket og eliminert alle andre mulige problemer. En times tid brukt på å søke etter en tabuleringskurve eller en blokk med mellomrom skriker rett og slett at du snarest trenger å lage en policy for bruk av den ene eller den andre, og deretter implementere en armert betongsjekk for samsvar med den (for eksempel gjennom en Git-krok for å tvinge den gjennom en linter).
7. Mindre er mer (eller mer er mindre)
Noen liker å skrive i YAML fordi det legger vekt på struktur. Samtidig bruker de aktivt innrykk for å fremheve blokker med data. Dette er en slags svindel for å imitere markup-språk som bruker eksplisitte skilletegn.
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 dette alternativet dem med å sortere ut YAML-strukturen i hodet; for andre irriterer det dem tvert imot med mange unødvendige, etter deres mening, innrykk.
Men hvis du er eieren av YAML-dokumentet og er ansvarlig for å vedlikeholde det, da deg og bare deg må definere hvordan innrykk skal brukes. Hvis du irriterer deg over stor polstring, hold den på et minimum mulig i henhold til YAML-spesifikasjonen. For eksempel kan filen ovenfor fra Ansible-dokumentasjonen skrives om slik uten tap:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Bruk blanks
Hvis du stadig gjentar de samme feilene når du fyller ut en YAML-fil, er det fornuftig å sette inn en mal i den som en kommentar. Neste gang kan du ganske enkelt kopiere denne malen og legge inn reelle data der, for eksempel:
---
# - <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. Bruk noe annet
Hvis applikasjonen ikke har kvelertak på deg, kan det være verdt å endre YAML til et annet format. Over tid kan konfigurasjonsfiler vokse ut av seg selv og da er det bedre å konvertere dem til enkle skript i Lua eller Python.
YAML er en flott ting som mange mennesker elsker for sin minimalisme og enkelhet, men det er langt fra det eneste verktøyet i arsenalet ditt. Så noen ganger kan du nekte det. Parsing-biblioteker er enkle å finne for YAML, så hvis du tilbyr enkle migreringsalternativer, vil brukerne dine overleve denne feilen relativt smertefritt.
Hvis du ikke klarer deg uten YAML, så ta disse 10 tipsene og overvinn din motvilje mot YAML en gang for alle!
Kilde: www.habr.com