10 skridt til YAML-zen

Vi elsker alle Ansible, men Ansible er YAML. Der findes mange formater til konfigurationsfiler: værdi-lister, par af «parameter-værdi», INI-filer, YAML, JSON, XML og mange flere. Men af flere grunde betragtes YAML ofte som særligt udfordrende. Især på grund af sin forfriskende minimalisme og imponerende evner til at arbejde med hierarkiske værdier, kan YAMLs syntaks irritere med sin Python-lignende tilgang til indrykning.

10 skridt til YAML-zen

Hvis YAML irriterer dig, kan du - og skal! - tage de næste 10 skridt for at reducere din irritation til et acceptabelt niveau og lære at elske YAML. Som det er passende for en rigtig liste, vil vores ti råd blive nummereret fra nul, meditation og åndelige praksisser tilføjes efter ønske 😉

0. Få din editor til at arbejde

Det betyder ikke noget, hvilken teksteditor du har - der findes med sikkerhed mindst et plugin til at arbejde med YAML. Hvis du ikke har et, så find og installer det straks. Den tid, du bruger på at finde og sætte det op, vil betale sig mange gange, hver gang du skal redigere YAML.

For eksempel understøtter editoren Atom YAML som standard, mens GNU Emacs kræver, at du installerer ekstra pakker, som f.eks. yaml-mode.

10 skridt til YAML-zen

Emacs i YAML-tilstand og visning af mellemrum.

Hvis din yndlingseditor ikke har en YAML-tilstand, kan en del problemer løses ved at arbejde med indstillingerne. For eksempel har den indbyggede teksteditor for GNOME, Gedit, ikke en YAML-tilstand, men den fremhæver som standard YAML-syntaks og giver mulighed for at justere indrykning:

10 skridt til YAML-zen

Indstillinger for indrykning i Gedit.

Og plugin'et drawspaces for Gedit viser mellemrum som punkter, hvilket fjerner tvivl om indrykkniveauer.

Med andre ord, brug tid på at lære din yndlingseditor at kende. Find ud af, hvad den eller dens udviklersamfund tilbyder til arbejde med YAML, og brug disse muligheder. Du vil helt sikkert ikke fortryde det.

1. Brug en linter

Ideelt set bruger programmeringssprog og markup-sprog en forudsigelig syntaks. Computere har det godt med forudsigelighed, derfor opstod konceptet linter. Hvis dette koncept i 40 år er gået forbi dig, og du stadig ikke bruger en YAML-linter, er det tid til at prøve yamllint.

Installer yamllint dette kan gøres ved hjælp af den indbyggede pakkeadministrator i Linux. For eksempel i Red Hat Enterprise Linux 8 eller Fedora gør man det sådan her:

$ sudo dnf install yamllint

Derefter kører du bare yamllint og videregiver YAML-filen til kontrol. Sådan ser det ud, når du sender linteren en fil med en fejl:

$ yamllint errorprone.yaml
errorprone.yaml
23:10     fejl    syntaxfejl: mappingværdier er ikke tilladt her
23:11     fejl    efterfølgende mellemrum  (trailing-spaces)

Tallene til venstre er ikke tid, men fejllokationer: linje- og søjlenummer. Beskrivelsen af fejlen siger dig måske ikke meget, men du ved præcist, hvor den er. Bare kig på stedet i koden, og sandsynligvis vil alt blive klart.

Når yamllint ikke finder fejl i filen, vises der ikke noget på skærmen. Hvis du bliver skræmt af en sådan stilhed og ønsker lidt mere feedback, kan du køre linteren med en betinget kommando echo gennem dobbelt ampersand (&&), sådan her:

$ yamllint perfect.yaml && echo "OK"
OK

I POSIX aktiveres den dobbelte ampersand kun, når den foregående kommando returnerer 0. Og yamllint returnerer netop antallet af fundne fejl, så hele denne betingede konstruktion fungerer.

2. Skriv i Python, ikke i YAML

Hvis du virkelig hader YAML, så skriv ikke i det, bogstaveligt talt. Nogle gange er YAML den eneste format, som applikationen accepterer. Men selv da er det ikke nødvendigt at oprette en YAML-fil. Skriv i det, du kan lide, og konverter derefter. For eksempel er der et fremragende bibliotek til Python pyyaml og der er to måder at konvertere på: selvkonvertering og konvertering via scripts.

Selvkonvertering

I dette tilfælde er filen med data også et Python-script, der genererer YAML. Denne metode er bedst til små datasæt. Du skriver bare JSON-data i en Python-variabel, præcederet med direktivet import, og til sidst tilføjer du tre linjer for at implementere output.

#!/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

Nu kører vi denne fil på Python, og udgang er filen output.yaml:

$ python3 .\/example.json
$ cat output.yaml
glossary:
  GlossDiv:
	GlossList:
	  GlossEntry:
		Abbrev: ISO 8879:1986
		Acronym: SGML
		GlossDef:
		  GlossSeeAlso: [GML, XML]
		  para: Et meta-markup-sprog, der bruges til at skabe markup-sprog som DocBook.
		GlossSee: markup
		GlossTerm: Standard Generalized Markup Language
		ID: SGML
		SortAs: SGML
	title: S
  title: example glossary

Dette er absolut korrekt YAML, men yamllint vil give en advarsel om, at det ikke starter med —. Nå, det kan nemt rettes manuelt eller ved at justere Python-scriptet lidt.

Konvertering via scripts

I dette tilfælde skriver vi først på JSON, og derefter kører vi konverteren som et separat Python-script, der producerer YAML som output. Sammenlignet med den tidligere metode skalerer denne tilgang bedre, da konverteringen er adskilt fra dataene.

Lad os først oprette en JSON-fil example.json, f.eks. kan den tages fra json.org:

{
	"glossary": {
	  "title": "eksempelordbog",
	  "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 sprog, der bruges til at skabe markup-sprog som DocBook.",
			  "GlossSeeAlso": ["GML", "XML"]
			  },
			"GlossSee": "markup"
			}
		  }
		}
	  }
	}

Derefter opretter vi et simpelt konverteringsscript og gemmer det under navnet json2yaml.py. Dette script importerer begge moduler - YAML og JSON i Python og indlæser den angivne JSON-fil af brugeren, udfø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()

Gem dette script i systemstien og kør det efter behov:

$ ~/bin/json2yaml.py example.json

3. Parse meget og ofte

Nogle gange kan det være nyttigt at se på problemet fra en anden vinkel. Hvis du har svært ved at forestille dig relationerne mellem dataene i YAML, kan du midlertidigt konvertere dem til noget mere velkendt.

For eksempel, hvis du foretrækker at arbejde med ordliste eller i JSON, kan YAML konverteres til JSON med blot to kommandoer i Python interaktiv shell. Antag, at du har en YAML-fil mydata.yaml, så ser det sådan ud:

$ 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 artikel. Kunne være bedre.'}

Der findes mange andre eksempler om emnet. Derudover er der mange online-konvertere og lokale parsere. Så tøv ikke med at omformatere data, når du ser dem som en uforståelig blanding.

4. Læs specifikationerne

Når du vender tilbage til YAML efter en lang periode, kan det være nyttigt at besøge yaml.org og læse specifikationerne. Hvis du har vanskeligheder med YAML, men ikke har haft tid til at læse specifikationen, er det på tide at ændre denne situation. Specifikationerne er overraskende lette at læse, og kravene til syntaks er illustreret med mange eksempler i Kapitel 6.

5. Pseudokonfigurationer

Når du skriver en bog eller artikel, er det altid nyttigt først at skitsere en overordnet plan, omend blot i form af et indholdsfortegnelse. Det samme gælder for YAML. Du har sandsynligvis en idé om, hvilke data der skal skrives i YAML-filen, men forstår måske ikke helt, hvordan man forbinder dem med hinanden. Så før du begynder at skrive YAML, skal du lave en pseudokonfiguration.

Pseudokonfigurationen ligner pseudokode, hvor du ikke behøver at bekymre dig om struktur eller indrykninger, forholdet mellem "overordnet-og-underordnet", arv og indlejring. Tilsvarende tegnede du iterationer af data, mens de kom til dig.

10 skridt til YAML-zen

Pseudokonfigurationen viser programmerne (Martin og Tabitha) og deres færdigheder (programmeringssprog: Python, Perl, Pascal og Lisp, Fortran, Erlang, henholdsvis).

Efter at have skitset pseudokonfigurationen på et stykke papir, skal du nøje analysere den og, hvis alt ser godt ud, formatere den til en gyldig YAML-fil.

6. Dilemmaet "tabulator eller mellemrum"

Du bliver nødt til at tage stilling til dilemmaet "tabulator eller mellemrum?". Ikke i global forstand, men blot på niveauet af din organisation, eller mindst dit projekt. Uanset om der skal anvendes post-behandling med et sed-script, indstilling af tekstbehandlingsprogrammerne på programmørerne computere, eller en generel pålægning af strenge overholdelse af linterens retningslinjer under trussel om opsigelse, så skal alle medlemmer af dit team, der på nogen måde arbejder med YAML, udelukkende bruge mellemrum (som YAML-specifikationen kræver).

I enhver almindelig teksteditor kan du indstille automatisk erstatning af tabulatorer med et bestemt antal mellemrum, så en oprør fra tilhængerne af tasten Tab er ikke noget man behøver at frygte.

Som enhver, der hader YAML godt ved, er der ingen synlig forskel på tabulatorer og mellemrum på skærmen. Og når noget ikke kan ses, er det som regel det, der bliver glemt i sidste øjeblik, efter at man har gennemgået og udelukket alle andre mulige problemer. En time spildt på at finde en skæv tabulator eller en blok af mellemrum råber på, at du hurtigt skal lave en politik for brugen af det ene eller det andet, og derefter implementere en stærk kontrol for at sikre overholdelse (f.eks. gennem et Git hook for at tvinge en gennemgang via linteren).

7. Bedre mindre og bedre (eller mere – det er mindre)

Nogle mennesker elsker at skrive i YAML, da det fremhæver strukturen. De bruger aktivt indrykning for at skelne mellem datablokke. Dette er en form for snyd for at efterligne markup-sprog, hvor der bruges eksplicitte adskillelser.

Her er et eksempel på sådan struktur fra Ansible-dokumentationen:

# Employee records
-  martin:
        name: Martin D'vloper
        job: Developer
        skills:
            - python
            - perl
            - pascal
-  tabitha:
        name: Tabitha Bitumen
        job: Developer
        skills:
            - lisp
            - fortran
            - erlang

For nogle hjælper denne tilgang med at organisere YAML-strukturen, mens andre bliver irriteret over mængden af unødvendig indrykning, som de mener, der er.

Men hvis du ejer et YAML-dokument og er ansvarlig for dets vedligeholdelse, så er det kun dig der skal bestemme, hvordan indrykningerne skal anvendes. Hvis store indrykninger irriterer dig, så reducer dem til et minimum, der er muligt i henhold til YAML-specifikationen. For eksempel kan den ovennævnte fil fra Ansible-dokumentationen skrives om således uden tab af information:

---
- martin:
   name: Martin D'vloper
   job: Developer
   skills:
   - python
   - perl
   - pascal
- tabitha:
   name: Tabitha Bitumen
   job: Developer
   skills:
   - lisp
   - fortran
   - erlang

8. Brug skabeloner

Hvis du konstant gentager de samme fejl, når du udfylder YAML-filen, giver det mening at indsætte en kommentar-skabelon. Så næste gang kan du bare kopiere denne skabelon og indsætte de faktiske data, 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. Brug noget andet

Hvis applikationen ikke fastholder dig, kan det være værd at skifte fra YAML til et andet format. Over tid kan konfigurationsfiler vokse ud over deres formål, og så er det bedre at konvertere dem til enkle scripts i Lua eller Python.

YAML er en fantastisk ting, som mange værdsætter for sin minimalisme og enkelhed, men det er langt fra det eneste værktøj i din værktøjskasse. Så nogle gange kan det være passende at slippe af med det. Der findes let parsingbiblioteker til YAML, så hvis du tilbyder brugervenlige migrationsmuligheder, vil dine brugere relativt smertefrit kunne imødekomme en sådan afkald.

Hvis du derimod ikke kan undvære YAML, så tag disse 10 tips til dig og overvinde din modvilje mod YAML én gang for alle!

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster