Wir alle lieben Ansible, aber Ansible ist YAML. Für Konfigurationsdateien gibt es viele Formate: Wertelisten, Schlüssel-Wert-Paare, INI-Dateien, YAML, JSON, XML und viele andere. Aus mehreren Gründen wird YAML jedoch oft als besonders herausfordernd angesehen. Insbesondere kann die YAML-Syntax aufgrund ihres python-artigen Ansatzes für Einrückungen frustrierend sein, trotz ihres erfrischenden Minimalismus und beeindruckenden Möglichkeiten zur Arbeit mit hierarchischen Werten.

Wenn Sie von YAML genervt sind, können und sollten Sie! – die folgenden 10 Schritte unternehmen, um Ihre Frustration auf ein akzeptables Niveau zu bringen und YAML zu lieben. Wie es sich für eine richtige Liste gehört, wird unser Zehner-Tipp von Null nummeriert. Mediation und spirituelle Praktiken fügen Sie nach Wunsch hinzu 😉
0. Lassen Sie Ihren Editor arbeiten
Egal, welcher Texteditor Ihnen gefällt – es gibt wahrscheinlich mindestens ein Plugin für die Arbeit mit YAML. Wenn Sie keines haben, suchen und installieren Sie es sofort. Die Zeit, die Sie mit der Suche und Einrichtung verbringen, wird sich jedes Mal auszahlen, wenn Sie YAML bearbeiten müssen.
Zum Beispiel unterstützt der Editor YAML standardmäßig, während für GNU Emacs zusätzliche Pakete wie .

erforderlich sind, um Emacs im YAML-Modus und zur Anzeige von Leerzeichen zu aktivieren.
Wenn Ihr Lieblingseditor keinen YAML-Modus hat, lassen sich einige Probleme durch Anpassen der Einstellungen lösen. Zum Beispiel hat der standardmäßige GNOME-Texteditor Gedit keinen YAML-Modus, hebt aber standardmäßig den YAML-Syntax hervor und ermöglicht es, die Einrückungsarbeit anzupassen:

Anpassung der Einrückungen in Gedit.
Und das Plugin für Gedit zeigt Leerzeichen als Punkte an, wodurch Unklarheiten bei den Einrückungsstufen beseitigt werden.
Mit anderen Worten, investieren Sie Zeit in das Erlernen Ihres Lieblingseditors. Finden Sie heraus, was er selbst oder seine Entwicklergemeinschaft für die Arbeit mit YAML anbieten, und nutzen Sie diese Möglichkeiten. Sie werden es definitiv nicht bereuen.
1. Verwenden Sie einen Linter
Idealerweise verwenden Programmiersprachen und Auszeichnungssprachen einen vorhersehbaren Syntax. Computer kommen mit Vorhersehbarkeit gut zurecht, weshalb bereits 1978 das Konzept eines entstanden ist. Wenn Sie in den 40 Jahren seiner Existenz daran vorbeigegangen sind und noch keinen YAML-Linter verwenden, ist es höchste Zeit, yamllint auszuprobieren.
Installieren kann mit dem Standard-Paketmanager von Linux erfolgen. Zum Beispiel in 8 oder geschieht dies so:
$ sudo dnf install yamllint
Dann fahren Sie einfach fort, indem Sie yamllint ausführen und ihm die zu überprüfende YAML-Datei übergeben. So sieht es aus, wenn man dem Linter eine fehlerhafte Datei übergibt:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 Fehler Syntaxfehler: Mappingwerte sind hier nicht erlaubt
23:11 Fehler nachfolgende Leerzeichen (trailing-spaces)
Die Zahlen auf der linken Seite sind keine Zeiten, sondern Fehlerkoordinaten: Zeilen- und Spaltennummer. Die Fehlermeldung sagt Ihnen möglicherweise nichts, aber Sie wissen genau, wo sie sich befindet. Schauen Sie einfach an diese Stelle im Code, und wahrscheinlich wird alles klar.
Wenn yamllint keine Fehler in der Datei findet, wird nichts auf dem Bildschirm angezeigt. Wenn Sie von dieser Stille erschreckt sind und ein wenig mehr Rückmeldung wünschen, können Sie den Linter mit einem bedingten Echo-Befehl durch doppelte Ampersands (&&) ausführen, so:
$ yamllint perfect.yaml && echo "OK"
OK
Im POSIX funktioniert das doppelte Ampersand nur, wenn der vorhergehende Befehl 0 zurückgibt. Yamllint gibt genau die Anzahl der gefundenen Fehler zurück, weshalb diese bedingte Konstruktion funktioniert.
2. Schreiben Sie in Python, nicht in YAML
Wenn YAML Sie wirklich aufregt, schreiben Sie einfach nicht in ihm, im wahrsten Sinne des Wortes. Manchmal ist YAML das einzige Format, das von der Anwendung akzeptiert wird. Aber selbst dann müssen Sie nicht unbedingt eine YAML-Datei erstellen. Schreiben Sie in dem, was Ihnen gefällt, und konvertieren Sie es später. Zum Beispiel gibt es für Python eine großartige Bibliothek und gleich zwei Methoden zur Konvertierung: die Selbstkonvertierung und die Konvertierung über Scripts.
Selbstkonvertierung
In diesem Fall ist die Datei mit den Daten zugleich auch das Python-Skript, das YAML generiert. Diese Methode eignet sich am besten für kleine Datensätze. Sie schreiben einfach die JSON-Daten in eine Python-Variable, leiten dies mit der Direktive import ein und fügen am Ende der Datei drei Zeilen für die Ausgabe hinzu.
#!/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 das Ergebnis ist 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 Metamarkup-Sprache, die verwendet wird, um Markup-Sprachen wie DocBook zu erstellen.
GlossSee: markup
GlossTerm: Standard Generalized Markup Language
ID: SGML
SortAs: SGML
title: S
title: Beispielglossar
Das ist absolut korrektes YAML, aber yamllint wird eine Warnung ausgeben, dass es nicht mit — beginnt. Nun, das kann leicht manuell behoben oder das Python-Skript leicht angepasst werden.
Konvertierung über Skripte
In diesem Fall schreiben wir zuerst in JSON und starten dann den Konverter als separates Python-Skript, das als Ausgang YAML liefert. Im Vergleich zur vorherigen Methode lässt sich dieser Ansatz besser skalieren, da die Konvertierung von den Daten getrennt ist.
Zunächst erstellen wir eine JSON-Datei example.json, die wir beispielsweise von :
{
"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-Markupsprache, die zur Erstellung von Markup-Sprachen wie DocBook verwendet wird.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
Dann erstellen wir ein einfaches Konvertierungsskript und speichern es unter dem Namen json2yaml.py. Dieses Skript importiert beide Module - YAML und JSON von Python - und 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. Oft und viel parsen
Manchmal ist es hilfreich, das Problem aus einem anderen Blickwinkel zu betrachten. Wenn es Ihnen schwerfällt, die Beziehungen zwischen Daten in YAML vorzustellen, können Sie sie vorübergehend in etwas Vertrauteres umwandeln.
Wenn Sie beispielsweise mit Wörterbuchlisten oder JSON arbeiten, kann YAML mit nur zwei Befehlen in der interaktiven Python-Shell in JSON umgewandelt werden. Angenommen, Sie haben eine YAML-Datei mydata.yaml, dann könnte das so aussehen:
$ 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.'}
Zu diesem Thema finden Sie viele andere Beispiele. Darüber hinaus gibt es zahlreiche Online-Konverter und lokale Parser. Scheuen Sie sich also nicht, Daten umzuwandeln, wenn Sie nur ein undurchsichtiges Durcheinander sehen.
4. Lesen Sie die Specs
Wenn Sie nach einer langen Pause zu YAML zurückkehren, ist es hilfreich, die Website zu besuchen und die Spezifikationen (Specs) zu lesen. Wenn Sie Schwierigkeiten mit YAML haben, aber noch nicht zu den Spezifikationen gelangen konnten, ist es an der Zeit, diese Situation zu ändern. Die Specs sind überraschend leicht verständlich, und die Syntaxanforderungen werden mit vielen Beispielen in .
5. Pseudokonfigurationen
Beim Schreiben eines Buches oder Artikels ist es immer hilfreich, zunächst einen groben Plan zu skizzieren, zumindest in Form eines Inhaltsverzeichnisses. Das gilt auch für YAML. Wahrscheinlich wissen Sie, welche Daten Sie in die YAML-Datei eintippen müssen, aber Sie sind sich nicht ganz sicher, wie Sie diese miteinander verknüpfen. Daher sollten Sie, bevor Sie YAML erstellen, eine Pseudo-Konfiguration zeichnen.
Eine Pseudo-Konfiguration ähnelt Pseudocode, bei dem man sich nicht um die Struktur oder Einrückungen, Eltern-Kind-Beziehungen, Vererbung und Verschachtelung kümmern muss. So ist es hier: Sie skizzieren die Iterationen von Daten, während sie Ihnen in den Sinn kommen.

Eine Pseudo-Konfiguration listet Programmierer (Martin und Tabitha) und ihre Fähigkeiten (Programmiersprachen: Python, Perl, Pascal und Lisp, Fortran, Erlang, entsprechend) auf.
Nachdem Sie die Pseudo-Konfiguration auf Papier skizziert haben, analysieren Sie sie sorgfältig und, wenn alles in Ordnung ist, formatieren Sie sie als gültige YAML-Datei.
6. Die Dilemma "Tabs oder Leerzeichen"
Sie müssen das Dilemma lösen . Nicht im globalen Sinne, sondern nur auf Ebene Ihrer Organisation oder zumindest Ihres Projekts. Es ist unerheblich, ob dabei ein Post-Processing-Skript wie sed verwendet wird, Texteditoren auf den Maschinen der Programmierer konfiguriert werden oder ob schlichtweg everyone ein schriftliches Dokument unterzeichnet, das die strikte Einhaltung der Richtlinien des Linters unter Androhung von Entlassung bestärkt. Alle Mitglieder Ihres Teams, die in irgendeiner Weise mit YAML zu tun haben, müssen unbedingt nur Leerzeichen verwenden (wie es die YAML-Spezifikation erfordert).
In jedem gängigen Texteditor kann die automatische Ersetzung von Tabulatoren in eine festgelegte Anzahl von Leerzeichen konfiguriert werden, daher braucht man vor einem Aufstand befürwortender Tab keine Sorge zu haben.
Wie jedem YAML-Hasser wohlbekannt ist, sieht man auf dem Bildschirm keinen Unterschied zwischen Tabulatoren und Leerzeichen. Und wenn etwas nicht sichtbar ist, wird daran in der Regel zuletzt gedacht, nachdem alle anderen möglichen Probleme durchforstet, überprüft und beseitigt wurden. Eine Stunde, die mit der Suche nach einem schiefen Tabulator oder einem Block von Leerzeichen vertan wird, schreit danach, dass Sie dringend eine Richtlinie zur Verwendung von dem einen oder anderen erstellen und dann eine solide Überprüfung ihrer Einhaltung umsetzen (z. B. durch einen Git-Hook für eine erzwungene Überprüfung durch einen Linter).
7. Weniger ist mehr (oder mehr – ist weniger)
Einige Menschen schreiben gerne in YAML, da es die Struktur hervorhebt. Dabei verwenden sie aktiv Einrückungen, um Datenblöcke zu kennzeichnen. Es ist eine Art Trick, um Auszeichnungssprachen, die explizite Trennzeichen verwenden, nachzuahmen.
Hier ist ein Beispiel für diese Strukturierung aus :
# 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 ordnen, während andere sich darüber ärgern, dass so viele unnötige, ihrer Meinung nach, Einrückungen vorhanden sind.
Aber wenn Sie der Besitzer eines YAML-Dokuments sind und für dessen Pflege verantwortlich sind, dann sind nur Sie verantwortlich dafür, wie die Einrückungen verwendet werden. Wenn große Einrückungen Sie stören, reduzieren Sie diese auf ein Minimum, das gemäß der YAML-Spezifikation möglich ist. Zum Beispiel kann die oben genannte Datei aus der Ansible-Dokumentation ohne Verluste wie folgt umgeschrieben werden:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Verwenden Sie Vorlagen
Wenn Sie beim Ausfüllen einer 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 echten Daten eintragen, zum Beispiel:
---
# - <common name>:
# name: Gegebener Nachname
# 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. Verwenden Sie etwas anderes
Wenn die Anwendung Sie nicht festhält, könnte es an der Zeit sein, YAML gegen ein anderes Format auszutauschen. Im Laufe der Zeit können Konfigurationsdateien über sich hinauswachsen, und es ist besser, sie in einfache Skripte in Lua oder Python umzuwandeln.
YAML ist ein großartiges Werkzeug, das viele Menschen wegen seines Minimalismus und seiner Einfachheit lieben, aber es ist nicht das einzige Werkzeug in Ihrem Arsenal. Daher können Sie manchmal darauf verzichten. Für YAML sind leicht Parsing-Bibliotheken zu finden, daher wird es Ihren Benutzern relativ schmerzlos gelingen, einen solchen Verzicht zu überstehen, wenn Sie praktikable Migrationsoptionen anbieten.
Wenn Sie jedoch nicht ohne YAML auskommen, nehmen Sie sich diese 10 Tipps zu Herzen und besiegen Sie Ihre Abneigung gegen YAML ein für alle Mal!
Quelle: habr.com
