10 trinn til YAML Zen

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.

10 trinn til YAML Zen

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 Atom støtter YAML som standard, men for GNU Emacs må du installere flere pakker, for eksempel, yaml-modus.

10 trinn til YAML Zen

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:

10 trinn til YAML Zen

Sette innrykk i Gedit.

En plugin trekkplasser for Gedit, viser mellomrom som prikker, og eliminerer tvetydigheter med innrykksnivåer.

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 lintera. Hvis den har gått forbi deg i løpet av de 40 årene den har eksistert og du fortsatt ikke bruker en YAML linter, er det på tide å prøve yamllint.

Installere yamllint Du kan bruke standard Linux-pakkebehandling. For eksempel i Red Hat Enterprise Linux 8 eller Fedora det er gjort slik:

$ 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 pyyaml og to konverteringsmetoder: selvkonvertering og konvertering gjennom skript.

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 json.org:

{
	"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 yaml.org og les spesifikasjonene (spesifikasjonene) på nytt. Hvis du har problemer med YAML, men ikke har kommet deg frem til spesifikasjonen, er det på tide å rette opp denne situasjonen. Spesifikasjonene er overraskende enkle å skrive, og syntakskravene er illustrert med et stort antall eksempler i kapittel 6.

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.

10 trinn til YAML Zen

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 "tabulatorer eller mellomrom?". Ikke i global forstand, men bare på organisasjonsnivå, eller i det minste et prosjekt. Det spiller ingen rolle om dette innebærer å bruke etterbehandling med et sed-skript, sette opp tekstredigerere på programmerers maskiner eller universelt ta kvitteringer på streng overholdelse av linters instruksjoner under trussel om oppsigelse, men alle medlemmer av teamet ditt som i en eller annen måte knyttet til YAML må kun bruke mellomrom (som kreves av YAML-spesifikasjonen).

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 Ansible dokumentasjon:

# 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

Legg til en kommentar