10 Schritte zu YAML-Zen

Wir alle lieben Ansible, aber Ansible basiert auf YAML. Für Konfigurationsdateien gibt es zahlreiche Formate: Wertlisten, Schlüssel-Wert-Paare, INI-Dateien, YAML, JSON, XML und viele andere. Dennoch wird YAML aus mehreren Gründen häufig als besonders herausfordernd angesehen. Besonders der Python-ähnliche Ansatz bei der Einrückung kann trotz seines erfrischenden Minimalismus und der beeindruckenden Möglichkeiten zur Arbeit mit hierarchischen Werten frustrierend sein.

10 Schritte zu YAML-Zen

Wenn Sie von YAML genervt sind, können Sie – und sollten es! – die folgenden 10 Schritte unternehmen, um Ihre Frustration auf ein akzeptables Niveau zu reduzieren und YAML zu lieben. Wie es sich für eine echte Liste gehört, nummerieren wir unsere Tipps ab Null und fügen Meditation und spirituelle Praktiken nach Belieben hinzu 😉

0. Lassen Sie Ihren Editor arbeiten

Egal, welchen Texteditor Sie verwenden – es gibt sicherlich mindestens ein Plugin, das mit YAML arbeitet. Wenn Sie keines haben, suchen Sie sofort danach und installieren Sie es. Die Zeit, die Sie mit der Suche und der Einrichtung verbringen, wird sich jedes Mal auszahlen, wenn Sie YAML bearbeiten müssen.

Zum Beispiel, der Editor Atom unterstützt standardmäßig YAML, während für GNU Emacs zusätzliche Pakete installiert werden müssen, wie zum Beispiel yaml-mode.

10 Schritte zu YAML-Zen

Emacs im YAML-Modus und der Anzeige von Leerzeichen.

Wenn Ihr bevorzugter Editor keinen YAML-Modus bietet, können viele Probleme durch Anpassung der Einstellungen gelöst werden. Zum Beispiel hat der standardmäßige GNOME-Texteditor Gedit keinen YAML-Modus, hebt aber standardmäßig die YAML-Syntax hervor und ermöglicht die Anpassung der Einzugseinstellungen:

10 Schritte zu YAML-Zen

Einrichtungsanpassungen in Gedit.

Das Plugin drawspaces für Gedit zeigt Leerzeichen als Punkte an, wodurch Unklarheiten in Bezug auf die Einzugsebenen beseitigt werden.

Mit anderen Worten, investieren Sie Zeit in das Lernen Ihres bevorzugten Editors. Erforschen Sie, was er selbst oder die Entwicklergemeinschaft für die Arbeit mit YAML anbietet, und nutzen Sie diese Funktionen. Das werden Sie garantiert nicht bereuen.

1. Verwenden Sie einen Linter

Im Idealfall verwenden Programmier- und Markupsprachen einen vorhersehbaren Syntax. Computer sind gut in der Handhabung von Vorhersehbarkeit, weshalb 1978 das Konzept des Lintersentstand. Wenn Ihnen dieses Konzept in den letzten 40 Jahren entgangen ist und Sie immer noch keinen YAML-Linter verwenden, ist jetzt der beste Zeitpunkt, es mit yamllint zu versuchen.

Installieren yamllint kann mit dem standardmäßigen Paketmanager von Linux erfolgen. Zum Beispiel in Red Hat Enterprise Linux 8 oder , aber bisher ist er noch nicht in so geht das:

$ sudo dnf install yamllint

Danach führen Sie einfach yamllint aus, indem Sie ihm die zu prüfende YAML-Datei übergeben. So sieht das aus, wenn Sie dem Linter eine fehlerhafte Datei übergeben:

$ yamllint errorprone.yaml
errorprone.yaml
23:10     Fehler    Syntaxfehler: Zuordnungswerte sind hier nicht erlaubt
23:11     Fehler    Nachgestellte Leerzeichen  (trailing-spaces)

Die Zahlen links sind keine Zeitangaben, sondern die Koordinaten des Fehlers: Zeilennummer und Spaltennummer. Die Beschreibung des Fehlers sagt Ihnen vielleicht nichts, aber Sie wissen genau, wo er sich befindet. Schauen Sie einfach an dieser Stelle im Code nach, und wahrscheinlich wird alles klar.

Wenn yamllint keine Fehler in der Datei findet, wird nichts auf dem Bildschirm ausgegeben. Wenn Sie sich von dieser Stille bedroht fühlen und etwas mehr Rückmeldung wünschen, können Sie den Linter mit dem bedingten Befehl echo über das doppelte kaufmännische Und (&&) so ausführen:

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

In POSIX wird das doppelte kaufmännische Und nur dann aktiviert, wenn der vorherige Befehl 0 zurückgibt. Und genau das macht yamllint, da es die Anzahl der gefundenen Fehler zurückgibt, weshalb diese gesamte bedingte Struktur funktioniert.

2. Schreiben Sie in Python und nicht in YAML

Wenn Ihnen YAML wirklich auf die Nerven geht, dann schreiben Sie einfach nicht damit, ganz im Ernst. Es kann sein, dass YAML das einzige Format ist, das von der Anwendung akzeptiert wird. In diesem Fall müssen Sie jedoch nicht unbedingt eine YAML-Datei erstellen. Schreiben Sie in einem Format, das Ihnen gefällt, und konvertieren Sie es anschließend. Zum Beispiel gibt es für Python eine hervorragende Bibliothek, pyyaml und gleich zwei Möglichkeiten zur Konvertierung: Selbstkonvertierung und Konvertierung über Skripte.

Selbstkonvertierung

In diesem Fall fungiert die Datei mit den Daten gleichzeitig als Python-Skript, das YAML generiert. Diese Methode eignet sich am besten für kleine Datensätze. Sie schreiben einfach JSON-Daten in eine Python-Variable, leiten es mit der Import-Direktive ein und fügen am Ende der Datei drei Zeilen hinzu, um die Ausgabe zu realisieren.

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

Jetzt führen wir diese Datei in Python aus und erhalten die Datei output.yaml:

$ python3 ./example.json
$ cat output.yaml
glossary:
  GlossDiv:
	GlossList:
	  GlossEntry:
		Abbrev: ISO 8879:1986
		Acronym: SGML
		GlossDef:
		  GlossSeeAlso: [GML, XML]
		  para: Eine Meta-Auszeichnungssprache, die verwendet wird, um Auszeichnungssprachen wie DocBook zu erstellen.
		GlossSee: markup
		GlossTerm: Standard Generalized Markup Language
		ID: SGML
		SortAs: SGML
	title: S
  title: Beispiel-Glossar

Das ist ein völlig korrektes YAML, aber yamllint wird eine Warnung ausgeben, dass es nicht mit — beginnt. Nun, das kann man leicht manuell beheben oder das Python-Skript geringfügig anpassen.

Konvertierung über Skripte

In diesem Fall schreiben wir zuerst in JSON und führen dann den Konverter in Form eines separaten Python-Skripts aus, das YAML ausgibt. Im Vergleich zum vorherigen Ansatz ist diese Methode besser skalierbar, da die Konvertierung von den Daten getrennt ist.

Zunächst erstellen wir eine JSON-Datei example.json, die man beispielsweise von json.org:

{
	"glossary": {
	  "title": "Beispiel-Glossar",
	  "GlossDiv": {
		"title": "S",
		"GlossList": {
		  "GlossEntry": {
			"ID": "SGML",
			"SortAs": "SGML",
			"GlossTerm": "Standard Generalized Markup Language",
			"Acronym": "SGML",
			"Abbrev": "ISO 8879:1986",
			"GlossDef": {
			  "para": "Eine Meta-Auszeichnungssprache, die verwendet wird, um Auszeichnungssprachen wie DocBook zu erstellen.",
			  "GlossSeeAlso": ["GML", "XML"]
			  },
			"GlossSee": "Markup"
			}
		  }
		}
	  }
	}

Dann erstellen wir ein einfaches Konverter-Skript und speichern es unter dem Namen json2yaml.py. Dieses Skript importiert beide Module — YAML und JSON von Python, lädt die vom Benutzer angegebene JSON-Datei, führt die Konvertierung durch und schreibt die Daten in die Datei 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()

Speichern Sie dieses Skript im Systempfad und führen Sie es bei Bedarf aus:

$ ~/bin/json2yaml.py example.json

3. Häufig und umfangreich parsen

Manchmal ist es hilfreich, ein Problem aus einer anderen Perspektive zu betrachten. Wenn es Ihnen schwerfällt, die Zusammenhänge zwischen den Daten in YAML zu erkennen, können Sie diese vorübergehend in ein vertrauteres Format umwandeln.

Wenn Sie beispielsweise gerne mit Wörterbüchern oder JSON arbeiten, können Sie YAML mit nur zwei Befehlen in ein JSON-Format umwandeln, während Sie die interaktive Python-Shell verwenden. Angenommen, Sie haben eine YAML-Datei mit dem Namen mydata.yaml, dann sieht das so aus:

$ 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': 'Guter Artikel. Könnte besser sein.'}

Es gibt viele weitere Beispiele zu diesem Thema. Außerdem gibt es zahlreiche Online-Konverter und lokale Parser. Zögern Sie also nicht, Ihre Daten neu zu formatieren, wenn Sie nur ein unverständliches Durcheinander sehen.

4. Lesen Sie die Spezifikationen

Wenn Sie nach einer längeren Pause zu YAML zurückkehren, ist es hilfreich, die Seite aufzurufen yaml.org und die Spezifikationen (Specs) erneut durchlesen. Wenn Sie Schwierigkeiten mit YAML haben und die Spezifikationen bisher nicht bearbeitet wurden, ist es an der Zeit, diese Situation zu ändern. Die Specs sind erstaunlich einfach geschrieben und die Syntaxanforderungen werden durch viele Beispiele illustriert in Kapitel 6.

5. Pseudokonfigurationen

Beim Schreiben eines Buches oder Artikels ist es immer hilfreich, zuerst einen vorläufigen Plan oder zumindest ein Inhaltsverzeichnis zu skizzieren. So ist es auch mit YAML. Wahrscheinlich haben Sie eine Vorstellung davon, welche Daten in die YAML-Datei aufgenommen werden müssen, sind sich aber nicht sicher, wie sie miteinander verbunden werden sollen. Daher sollten Sie, bevor Sie mit YAML beginnen, eine Pseudokonfiguration zeichnen.

Eine Pseudokonfiguration ähnelt Pseudocode, bei dem Sie sich keine Gedanken über die Struktur oder Einrückungen, das Eltern-Kind-Verhältnis, Vererbung und Verschachtelung machen müssen. So skizzieren Sie die Iterationen von Daten, sobald sie Ihnen in den Sinn kommen.

10 Schritte zu YAML-Zen

Eine Pseudokonfiguration mit einer Liste von Programmierern (Martin und Tabitha) und deren Fähigkeiten (Programmiersprachen: Python, Perl, Pascal und Lisp, Fortran, Erlang, entsprechend).

Nachdem Sie die Pseudokonfiguration auf ein Blatt Papier gezeichnet haben, analysieren Sie sie sorgfältig und, wenn alles in Ordnung ist, setzen Sie sie in ein gültiges YAML-Dokument um.

6. Die Dilemma "Tab oder Leerzeichen"

Sie müssen sich für das Dilemma entscheiden "Tab oder Leerzeichen?". Nicht im globalen Sinne, sondern nur auf der Ebene Ihrer Organisation oder zumindest Ihres Projekts. Es spielt keine Rolle, ob dabei ein Post-Processing mit einem sed-Skript verwendet wird, Texteditoren auf den Maschinen der Entwickler konfiguriert werden oder ob strikte Einhaltungen der Linter-Vorgaben unter Androhung von Entlassungen durchgesetzt werden, aber alle Mitglieder Ihres Teams, die in irgendeiner Weise mit YAML arbeiten, müssen unbedingt nur Leerzeichen verwenden (so verlangt es die YAML-Spezifikation).

In jedem gängigen Texteditor kann die Autokorrektur so eingestellt werden, dass Tabulatoren durch eine festgelegte Anzahl von Leerzeichen ersetzt werden, daher braucht man keine Angst vor einem Aufstand der Tabulator-Anhänger Tab zu haben.

Wie jedem YAML-Gegner bestens bekannt ist, gibt es auf dem Bildschirm keinen Unterschied zwischen Tabulatoren und Leerzeichen. Und wenn etwas nicht sichtbar ist, wird oft erst als letztes daran gedacht, nachdem man alle anderen möglichen Probleme durchgegangen, überprüft und behoben hat. Eine Stunde, die für die Suche nach einem fehlerhaften Tabulator oder einem Block von Leerzeichen aufgewendet wurde, schreit geradezu danach, dass Sie dringend eine Richtlinie für die Nutzung des einen oder anderen erstellen und dann eine robuste Überprüfung zu deren Einhaltung implementieren (z. B. über einen Git-Hook zur erzwungenen Ausführung eines Linters).

7. Weniger ist mehr (oder mehr ist weniger)

Einige Menschen schreiben gerne in YAML, da es die Struktur verdeutlicht. Dabei verwenden sie aktiv Einzüge, um Datenblöcke hervorzuheben. Das ist eine Art Täuschung, um Markup-Sprachen nachzuahmen, die explizite Trennzeichen verwenden.

Hier ist ein Beispiel für diese Struktur aus der 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 manche hilft diese Variante, die YAML-Struktur im Kopf zu organisieren, während andere sich über die Vielzahl an aus ihrer Sicht unnötigen Einzügen ärgern.

Wenn Sie jedoch der Eigentümer eines YAML-Dokuments sind und für dessen Pflege verantwortlich sind, dann sind Sie und nur Sie verantwortlich dafür, wie die Einrückungen verwendet werden. Wenn Ihnen große Einrückungen unangenehm sind, reduzieren Sie sie auf das Mindestmaß, das die YAML-Spezifikation zulässt. Zum Beispiel kann die oben angegebene Datei aus der Ansible-Dokumentation ohne Verlust auch so umgeschrieben werden:

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

8. Verwenden Sie Vorlagen

Wenn Sie beim Ausfüllen der YAML-Datei ständig die gleichen Fehler machen, ist es sinnvoll, eine Vorlage in Form eines Kommentars einzufügen. Dann können Sie beim nächsten Mal einfach diese Vorlage kopieren und die entsprechenden echten Daten einfüllen, zum Beispiel:

---
# - <common name>:
#   name: Vorname Nachname
#   job: JOB
#   skills:
#   - SPRACHE
- martin:
  name: Martin D'vloper
  job: Entwickler
  skills:
  - python
  - perl
  - pascal
- tabitha:
  name: Tabitha Bitumen
  job: Entwicklerin
  skills:
  - lisp
  - fortran
  - erlang

9. Verwenden Sie etwas anderes

Wenn Ihre Anwendung Sie nicht fest im Griff hat, sollten Sie vielleicht YAML gegen ein anderes Format austauschen. Im Laufe der Zeit können Konfigurationsdateien überhandnehmen, und es ist dann besser, sie in einfache Skripte in Lua oder Python umzuwandeln.

YAML ist eine großartige Sache, die viele wegen ihres Minimalismus und ihrer Einfachheit schätzen, aber es ist längst nicht das einzige Werkzeug in Ihrem Arsenal. Manchmal kann man also darauf verzichten. Es gibt zahlreiche Parsing-Bibliotheken für YAML, daher werden Ihre Benutzer einen solchen Verzicht relativ schmerzlos überstehen, wenn Sie ihnen praktische Migrationsmöglichkeiten anbieten.

Falls Sie jedoch nicht auf YAML verzichten können, nutzen Sie diese 10 Tipps, um Ihre Abneigung gegen YAML ein für alle Mal zu überwinden!

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster