10 steg till YAML Zen

Vi älskar alla Ansible, men Ansible är YAML. Det finns många format för konfigurationsfiler: värdelistor, parameter-värdepar, INI-filer, YAML, JSON, XML och många andra. Men av flera anledningar av dem alla anses YAML ofta vara särskilt svårt. I synnerhet, trots sin uppfriskande minimalism och imponerande förmåga att arbeta med hierarkiska värden, kan YAML-syntaxen vara irriterande med sin Python-liknande metod för indragning.

10 steg till YAML Zen

Om YAML gör dig förbannad kan du – och det borde du! – Ta följande 10 steg för att minska din frustration till en acceptabel nivå och bli kär i YAML. Som det anstår denna lista kommer våra tio tips att räknas från grunden, vi kommer att lägga till meditation och andliga övningar efter behag 😉

0. Få din redaktör att fungera

Det spelar ingen roll vilken textredigerare du har, det finns förmodligen minst ett plugin för att arbeta med YAML. Om du inte har en, hitta och installera den omedelbart. Tiden som går åt till att söka och ställa in kommer att löna sig många gånger om varje gång du måste redigera YAML.

Till exempel redaktör Atom stöder YAML som standard, men för GNU Emacs måste du installera ytterligare paket, till exempel, yaml-läge.

10 steg till YAML Zen

Emacs i YAML-läge och visningsutrymmen.

Om din favoritredigerare inte har ett YAML-läge, kan en del av problemen lösas genom att arbeta med inställningarna. Till exempel har standard GNOME-textredigeraren Gedit inget YAML-läge, men som standard framhäver den YAML-syntax och låter dig konfigurera arbete med indrag:

10 steg till YAML Zen

Ställa in indrag i Gedit.

Ett plugin ritutrymmen för Gedit, visar mellanslag som prickar, vilket eliminerar oklarheter med indragsnivåer.

Med andra ord, ägna tid åt att lära dig om din favoritredigerare. Ta reda på vad han eller hans utvecklingsgemenskap har att erbjuda för att arbeta med YAML, och använd dessa funktioner. Du kommer definitivt inte ångra det.

1. Använd en linter

Helst använder programmeringsspråk och märkningsspråk förutsägbar syntax. Datorer är bra på förutsägbarhet, vilket är anledningen till att begreppet lintera. Om den under de 40 åren av dess existens har gått dig förbi och du fortfarande inte använder en YAML linter, då är det dags att prova yamllint.

upprätta yamllint Du kan använda standard Linux-pakethanteraren. Till exempel i Red Hat Enterprise Linux 8 eller fedora det är gjort så här:

$ sudo dnf install yamllint

Sedan kör du helt enkelt yamllint och skickar den med YAML-filen för att kontrollera. Så här ser det ut om du skickar en fil med ett fel till linter:

$ yamllint errorprone.yaml
errorprone.yaml
23:10     error    syntax error: mapping values are not allowed here
23:11     error    trailing spaces  (trailing-spaces)

Siffrorna till vänster är inte tiden, utan koordinaterna för felet: rad- och kolumnnummer. Beskrivningen av felet kanske inte säger dig något, men du vet exakt var det är. Titta bara på den här platsen i koden, så kommer allt troligen att bli klart.

När yamllint inte hittar några fel i en fil skrivs ingenting ut på skärmen. Om sådan tystnad skrämmer dig och du vill ha lite mer feedback, så kan du köra lintern med kommandot villkorligt eko via ett dubbelt et-tecken (&&), så här:

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

I POSIX avfyras ett dubbelt et-tecken om och bara om föregående kommando returnerar 0. Och yamllint returnerar bara antalet fel som hittats, vilket är anledningen till att hela den här villkorskonstruktionen fungerar.

2. Skriv i Python, inte YAML

Om YAML verkligen gör dig förbannad, skriv bara inte i det, bokstavligen. Det händer att YAML är det enda formatet som applikationen förstår. Men även i det här fallet är det inte nödvändigt att skapa en YAML-fil. Skriv på vad du gillar och konvertera sedan. Till exempel finns det ett bra bibliotek för Python pyyaml och två konverteringsmetoder: självkonvertering och konvertering genom skript.

Självkonvertering

I det här fallet är datafilen också ett Python-skript som genererar YAML. Denna metod är bäst lämpad för små datamängder. Du skriver helt enkelt JSON-data till en Python-variabel, inleder den med ett importdirektiv och i slutet av filen lägger du till tre rader för att implementera utdata.

#!/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ör vi den här filen i Python och hämtar 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

Detta är helt giltigt YAML, men yamllint kommer att varna dig för att det inte börjar med -. Tja, detta kan enkelt korrigeras manuellt eller lätt modifieras i Python-skriptet.

Konvertering via skript

I det här fallet skriver vi först i JSON och kör sedan omvandlaren som ett separat Python-skript, som producerar YAML som utdata. Jämfört med den tidigare metoden, skalar denna metod bättre, eftersom konverteringen är separat från data.

Låt oss först skapa en JSON-fil exempel.json, till exempel, du kan ta den från 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"
			}
		  }
		}
	  }
	}

Sedan kommer vi att skapa ett enkelt omvandlingsskript och spara det under namnet json2yaml.py. Detta skript importerar både YAML- och JSON Python-moduler och laddar en användarspecificerad JSON-fil, utför konverteringen och skriver data till 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()

Spara det här skriptet i systemsökvägen och kör det efter behov:

$ ~/bin/json2yaml.py example.json

3. Analysera mycket och ofta

Ibland är det användbart att se på ett problem från en annan vinkel. Om du har problem med att representera relationerna mellan din data i YAML, kan du tillfälligt omvandla den till något mer bekant.

Till exempel, om du är bekväm med att arbeta med ordbokslistor eller JSON, kan du konvertera YAML till JSON med bara två kommandon i det interaktiva Python-skalet. Låt oss säga att du har en YAML-fil mydata.yaml, så här skulle den 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 hitta många andra exempel på detta ämne. Dessutom finns det många online-omvandlare och lokala parsers tillgängliga. Så tveka inte att formatera om data när du bara ser ett obegripligt virrvarr i det.

4. Läs specifikationerna

Återvänder till YAML efter en lång paus är det nyttigt att besöka yaml.org och läs om specifikationerna (specifikationerna). Om du har problem med YAML, men inte har kommit till specifikationen, är det dags att rätta till denna situation. Specifikationerna är förvånansvärt lätta att skriva, och syntaxkraven illustreras med ett stort antal exempel i Kapitel 6.

5. Pseudo-konfigurationer

När du skriver en bok eller artikel är det alltid bra att först skissa på en preliminär disposition, åtminstone i form av en innehållsförteckning. Det är samma sak med YAML. Troligtvis har du en uppfattning om vilken data som måste skrivas in i en YAML-fil, men du förstår inte riktigt hur du kopplar den till varandra. Därför, innan du skulpterar YAML, rita en pseudo-konfiguration.

Pseudo-config liknar pseudo-kod, där du inte behöver oroa dig för struktur eller indrag, förälder-barn-relationer, arv och kapsling. Det är samma sak här: du ritar iterationer av data när de dyker upp i ditt huvud.

10 steg till YAML Zen

Pseudo-config listar programmerare (Martin och Tabitha) och deras färdigheter (programmeringsspråk: Python, Perl, Pascal respektive Lisp, Fortran, Erlang).

Efter att ha ritat en pseudo-konfiguration på ett papper, analysera den noggrant och, om allt är i sin ordning, formatera den i form av en giltig YAML-fil.

6. Tabs vs Spaces-dilemmat

Du måste lösa dilemmat "tabbar eller mellanslag?". Inte i global mening, utan bara på din organisationsnivå, eller åtminstone ett projekt. Det spelar ingen roll om det handlar om att använda efterbearbetning med ett sed-skript, sätta upp textredigerare på programmerares maskiner eller allmänt ta kvitton på strikt efterlevnad av linters instruktioner under hot om uppsägning, men alla medlemmar i ditt team som i på ett eller annat sätt relaterar till YAML måste endast använda mellanslag (som krävs av YAML-specifikationen).

I vilken vanlig textredigerare som helst kan du konfigurera automatisk korrigering av flikar till ett visst antal mellanslag, så att viktiga anhängare gör uppror Fliken du behöver inte vara rädd.

Som varje YAML-hatare väl vet, kan du inte se skillnaden mellan flikar och mellanslag på skärmen. Och när något inte syns är det oftast det sista folk kommer ihåg, efter att de har sorterat igenom, kollat ​​och eliminerat alla andra möjliga problem. En timmes tid som ägnas åt att leta efter en tabuleringskurva eller ett block med utrymmen skriker helt enkelt att du akut behöver skapa en policy för användningen av det ena eller det andra, och sedan implementera en armerad betongkontroll för överensstämmelse med den (till exempel genom en Git-krok för att tvinga den genom en linter).

7. Mindre är mer (eller mer är mindre)

Vissa gillar att skriva i YAML eftersom det betonar struktur. Samtidigt använder de aktivt indrag för att markera datablock. Det här är en slags bluff för att imitera märkningsspråk som använder explicita avgränsare.

Här är ett exempel på en sådan struktur från Ansible dokumentation:

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

För vissa hjälper det här alternativet dem att reda ut YAML-strukturen i deras huvuden, för andra, tvärtom, irriterar det dem med många onödiga, enligt deras åsikt, indrag.

Men om du är ägare till YAML-dokumentet och ansvarar för att underhålla det, då du och bara du måste definiera hur indrag ska användas. Om du stör dig på stor stoppning, håll den till ett minimum enligt YAML-specifikationen. Till exempel kan filen ovan från Ansible-dokumentationen skrivas om så här utan förlust:

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

8. Använd ämnen

Om du ständigt upprepar samma misstag när du fyller i en YAML-fil, är det vettigt att infoga en mall i den som en kommentar. Nästa gång kan du helt enkelt kopiera den här mallen och ange riktiga data där, till exempel:

---
# - <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. Använd något annat

Om applikationen inte har ett strypgrepp på dig kan det vara värt att ändra YAML till ett annat format. Med tiden kan konfigurationsfiler växa ur sig själva och då är det bättre att konvertera dem till enkla skript i Lua eller Python.

YAML är en fantastisk sak som många älskar för sin minimalism och enkelhet, men det är långt ifrån det enda verktyget i din arsenal. Så ibland kan man tacka nej. Parsningsbibliotek är lätta att hitta för YAML, så om du erbjuder enkla migreringsalternativ kommer dina användare att överleva detta misslyckande relativt smärtfritt.

Om du inte klarar dig utan YAML, ta dessa 10 tips och övervinn din motvilja mot YAML en gång för alla!

Källa: will.com

Lägg en kommentar