10 stappen naar YAML Zen

We houden allemaal van Ansible, maar Ansible is YAML. Er zijn veel formaten voor configuratiebestanden: zoeklijsten, parameter-waardeparen, INI-bestanden, YAML, JSON, XML en vele andere. Om verschillende redenen wordt YAML echter vaak als bijzonder moeilijk beschouwd. In het bijzonder kan de YAML-syntaxis, ondanks het verfrissende minimalisme en de indrukwekkende mogelijkheden voor het werken met hiërarchische waarden, vervelend zijn vanwege de Python-achtige benadering van inspringen.

10 stappen naar YAML Zen

Als YAML je kwaad maakt, dan kan dat – en dat moet ook! – neem de volgende 10 stappen om je frustratie tot een acceptabel niveau terug te brengen en verliefd te worden op YAML. Zoals het deze lijst betaamt, worden onze tien tips helemaal opnieuw genummerd, we zullen naar believen meditatie en spirituele oefeningen toevoegen 😉

0. Laat uw editor werken

Het maakt niet uit welke teksteditor je hebt, er is waarschijnlijk minstens één plug-in om met YAML te werken. Als u er geen heeft, zoek en installeer deze dan onmiddellijk. De tijd die u besteedt aan het zoeken en instellen zal zich vele malen terugbetalen elke keer dat u YAML moet bewerken.

Redacteur bijvoorbeeld Atoom ondersteunt standaard YAML, maar voor GNU Emacs zul je extra pakketten moeten installeren, bijvoorbeeld: yaml-modus.

10 stappen naar YAML Zen

Emacs in YAML-modus en spaties weergeven.

Als uw favoriete editor geen YAML-modus heeft, kunnen sommige problemen worden opgelost door met de instellingen te werken. De standaard GNOME-teksteditor Gedit heeft bijvoorbeeld geen YAML-modus, maar benadrukt standaard de YAML-syntaxis en stelt u in staat het werk met inspringingen te configureren:

10 stappen naar YAML Zen

Inspringingen instellen in Gedit.

Een plug-in lades voor Gedit worden spaties weergegeven als punten, waardoor dubbelzinnigheden met inspringingsniveaus worden geëlimineerd.

Met andere woorden, besteed tijd aan het leren kennen van uw favoriete editor. Ontdek wat hij of zijn ontwikkelingsgemeenschap te bieden heeft voor het werken met YAML, en gebruik die functies. Je zult er zeker geen spijt van krijgen.

1. Gebruik een linter

Idealiter gebruiken programmeertalen en opmaaktalen een voorspelbare syntaxis. Computers zijn goed in voorspelbaarheid, vandaar het concept van lintera. Als het in de 40 jaar van zijn bestaan ​​aan je voorbij is gegaan en je nog steeds geen YAML-linter gebruikt, dan is het tijd om yamllint te proberen.

Om te installeren Yamllint U kunt de standaard Linux-pakketbeheerder gebruiken. Bijvoorbeeld, binnen Red Hat Enterprise Linux 8 of Fedora het is zo gedaan:

$ sudo dnf install yamllint

Vervolgens voert u eenvoudigweg yamllint uit en geeft u het YAML-bestand door ter controle. Zo ziet het eruit als u een bestand met een fout doorgeeft aan de linter:

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

De cijfers aan de linkerkant zijn niet de tijd, maar de coördinaten van de fout: rij- en kolomnummer. De beschrijving van de fout vertelt u misschien niets, maar u weet precies waar deze zich bevindt. Kijk maar naar deze plek in de code, en hoogstwaarschijnlijk zal alles duidelijk worden.

Wanneer yamllint geen fouten in een bestand vindt, wordt er niets op het scherm afgedrukt. Als zo'n stilte je bang maakt en je wat meer feedback wilt, dan kun je de linter uitvoeren met het voorwaardelijke echo-commando via een dubbel ampersand (&&), zoals dit:

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

In POSIX wordt een dubbel ampersand geactiveerd als en slechts als het voorgaande commando 0 retourneert. En yamllint retourneert alleen het aantal gevonden fouten, en daarom werkt deze hele voorwaardelijke constructie.

2. Schrijf in Python, niet in YAML

Als YAML je echt kwaad maakt, schrijf er dan niet letterlijk in. Het komt voor dat YAML het enige formaat is dat de applicatie begrijpt. Maar zelfs in dit geval is het niet nodig om een ​​YAML-bestand te maken. Schrijf op wat je leuk vindt en converteer vervolgens. Er is bijvoorbeeld een geweldige bibliotheek voor Python pyyaml en twee conversiemethoden: zelfconversie en conversie via scripts.

Zelf-conversie

In dit geval is het gegevensbestand ook een Python-script dat YAML genereert. Deze methode is het meest geschikt voor kleine datasets. U schrijft eenvoudigweg de JSON-gegevens in een Python-variabele, laat deze voorafgaan door een importrichtlijn en voegt aan het einde van het bestand drie regels toe om de uitvoer te implementeren.

#!/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 voeren we dit bestand uit in Python en krijgen we het output.yaml-bestand:

$ 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

Dit is een volkomen geldige YAML, maar yamllint zal je waarschuwen dat het niet begint met -. Welnu, dit kan eenvoudig handmatig worden gecorrigeerd of enigszins worden aangepast in het Python-script.

Conversie via scripts

In dit geval schrijven we eerst in JSON en voeren we vervolgens de converter uit als een afzonderlijk Python-script, dat YAML als uitvoer produceert. Vergeleken met de vorige methode schaalt deze methode beter, omdat de conversie los staat van de gegevens.

Laten we eerst een JSON-bestand example.json maken, waar u het bijvoorbeeld uit kunt halen 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"
			}
		  }
		}
	  }
	}

Vervolgens maken we een eenvoudig conversiescript en slaan dit op onder de naam json2yaml.py. Dit script importeert zowel YAML- als JSON Python-modules, laadt een door de gebruiker opgegeven JSON-bestand, voert de conversie uit en schrijft de gegevens naar het output.yaml-bestand.

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

Sla dit script op in het systeempad en voer het indien nodig uit:

$ ~/bin/json2yaml.py example.json

3. Veel en vaak analyseren

Soms is het nuttig om een ​​probleem vanuit een andere hoek te bekijken. Als u problemen ondervindt bij het weergeven van de relaties tussen uw gegevens in YAML, kunt u deze tijdelijk omzetten in iets vertrouwders.

Als u bijvoorbeeld vertrouwd bent met het werken met woordenboeklijsten of JSON, kunt u YAML naar JSON converteren met slechts twee opdrachten in de interactieve Python-shell. Stel dat u een YAML-bestand mydata.yaml heeft, dan ziet het er zo uit:

$ 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.'}

Er zijn nog veel meer voorbeelden over dit onderwerp te vinden. Daarnaast zijn er veel online converters en lokale parsers beschikbaar. Aarzel dus niet om de gegevens opnieuw te formatteren als je er alleen maar een onbegrijpelijke warboel in ziet.

4. Lees de specificaties

Terugkerend naar YAML na een lange pauze, is het nuttig om te bezoeken yaml.org en lees de specificaties (specs) nog eens door. Als je problemen hebt met YAML, maar nog niet aan de specificatie bent gekomen, dan is het tijd om deze situatie te corrigeren. De specificaties zijn verrassend eenvoudig te schrijven en de syntaxisvereisten worden geïllustreerd met een groot aantal voorbeelden Hoofdstuk 6.

5. Pseudo-configuraties

Bij het schrijven van een boek of artikel is het altijd handig om eerst een voorlopige schets te schetsen, tenminste in de vorm van een inhoudsopgave. Hetzelfde geldt voor YAML. Hoogstwaarschijnlijk heeft u een idee van welke gegevens in een YAML-bestand moeten worden geschreven, maar begrijpt u niet echt hoe u deze met elkaar moet verbinden. Teken daarom, voordat u YAML gaat vormgeven, een pseudo-config.

Pseudo-config is vergelijkbaar met pseudo-code, waarbij u zich geen zorgen hoeft te maken over structuur of inspringing, ouder-kindrelaties, overerving en nesting. Hier is het hetzelfde: je tekent iteraties van de gegevens zoals ze in je hoofd opkomen.

10 stappen naar YAML Zen

Pseudo-config met een overzicht van programmeurs (Martin en Tabitha) en hun vaardigheden (programmeertalen: respectievelijk Python, Perl, Pascal en Lisp, Fortran, Erlang).

Nadat u een pseudo-configuratie op een stuk papier hebt getekend, analyseert u deze zorgvuldig en formatteert u deze, als alles in orde is, in de vorm van een geldig YAML-bestand.

6. Het dilemma tussen tabbladen en spaties

Je zult het dilemma moeten oplossen "tabbladen of spaties?". Niet in mondiale zin, maar alleen op het niveau van uw organisatie, of in ieder geval een project. Het maakt niet uit of dit het gebruik van nabewerking met een sed-script inhoudt, het opzetten van teksteditors op de machines van programmeurs, of het universeel ontvangen van ontvangstbewijzen van strikte naleving van de instructies van de linter onder dreiging van ontslag, maar alle leden van uw team die in op de een of andere manier betrekking hebben op YAML mogen alleen spaties gebruiken (zoals vereist door de YAML-specificatie).

In elke normale teksteditor kunt u automatisch corrigerende tabbladen configureren tot een bepaald aantal spaties, zodat de rebellie van de belangrijkste aanhangers wordt vermeden. Tab je hoeft niet bang te zijn.

Zoals elke YAML-hater goed weet, kun je het verschil tussen tabbladen en spaties op het scherm niet zien. En als iets niet zichtbaar is, is dat meestal het laatste wat mensen zich herinneren, nadat ze alle andere mogelijke problemen hebben uitgezocht, gecontroleerd en geëlimineerd. Een uur besteden aan het zoeken naar een tabelcurve of een blok spaties schreeuwt eenvoudigweg dat u dringend een beleid moet opstellen voor het gebruik van het een of het ander, en vervolgens een controle van gewapend beton moet implementeren op de naleving ervan (bijvoorbeeld door een Git-haak om hem door een linter te duwen).

7. Minder is meer (of meer is minder)

Sommige mensen schrijven graag in YAML omdat dit de nadruk legt op structuur. Tegelijkertijd maken ze actief gebruik van inspringen om gegevensblokken te markeren. Dit is een soort oplichterij om opmaaktalen te imiteren die expliciete scheidingstekens gebruiken.

Hier is een voorbeeld van een dergelijke structuur uit Ansible-documentatie:

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

Voor sommigen helpt deze optie hen de YAML-structuur in hun hoofd op te lossen; voor anderen irriteert het hen juist met veel onnodige, naar hun mening, streepjes.

Maar als u de eigenaar bent van het YAML-document en verantwoordelijk bent voor het onderhoud ervan, dan jij en alleen jij moet definiëren hoe inspringing moet worden gebruikt. Als je je ergert aan grote opvulling, houd deze dan tot het minimum beperkt volgens de YAML-specificatie. Het bovenstaande bestand uit de Ansible-documentatie kan bijvoorbeeld zonder enig verlies als volgt worden herschreven:

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

8. Gebruik spaties

Als u voortdurend dezelfde fouten herhaalt bij het invullen van een YAML-bestand, is het zinvol om er als commentaar een sjabloon in in te voegen. De volgende keer kunt u eenvoudig dit sjabloon kopiëren en daar echte gegevens invoeren, bijvoorbeeld:

---
# - <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. Gebruik iets anders

Als de applicatie je niet in de greep heeft, kan het de moeite waard zijn om de YAML naar een ander formaat te veranderen. Na verloop van tijd kunnen configuratiebestanden zichzelf ontgroeien en dan kun je ze beter omzetten naar eenvoudige scripts in Lua of Python.

YAML is iets geweldigs waar veel mensen van houden vanwege het minimalisme en de eenvoud, maar het is verre van het enige hulpmiddel in je arsenaal. Soms kun je het dus weigeren. Parseerbibliotheken zijn gemakkelijk te vinden voor YAML, dus als u eenvoudige migratieopties aanbiedt, zullen uw gebruikers deze mislukking relatief pijnloos overleven.

Als je niet zonder YAML kunt, neem dan deze 10 tips en overwin voor eens en voor altijd je afkeer van YAML!

Bron: www.habr.com

Voeg een reactie