10 Schritte zum Yaml Zen

Wir alle lieben Ansible, aber Ansible ist YAML. Es gibt viele Formate für Konfigurationsdateien: Wertelisten, Parameter-Wert-Paare, INI-Dateien, YAML, JSON, XML und viele andere. Aus mehreren Gründen wird YAML jedoch häufig als besonders schwierig angesehen. Insbesondere kann die YAML-Syntax trotz ihres erfrischenden Minimalismus und ihrer beeindruckenden Fähigkeiten zum Arbeiten mit hierarchischen Werten mit ihrem Python-ähnlichen Einrückungsansatz ärgerlich sein.



Wenn YAML Sie wütend macht, können - und müssen! - Führen Sie die folgenden 10 Schritte aus, um Ihre Reizung auf ein akzeptables Maß zu reduzieren und YAML zu lieben. Wie es auf dieser Liste stehen sollte, werden unsere zehn Tipps von Grund auf neu nummeriert, wir fügen Meditation und spirituelle Praktiken nach Belieben hinzu ;-)

0. Lassen Sie Ihren Editor arbeiten


Es spielt keine Rolle, welche Art von Texteditor Sie haben - für ihn gibt es sicher mindestens ein Plugin für die Arbeit mit YAML. Wenn Sie noch keine haben, suchen und installieren Sie sie sofort. Die Zeit, die für das Suchen und Einrichten aufgewendet wird, zahlt sich jedes Mal aus, wenn Sie YAML bearbeiten müssen.

Beispielsweise unterstützt der Atom- Editor standardmäßig YAML, GNU Emacs muss jedoch zusätzliche Pakete installieren, z. B. den Yaml-Modus .



Emacs im YAML-Modus und Anzeigeflächen.

Wenn Ihr Lieblingseditor keinen YAML-Modus hat, können einige der Probleme durch Arbeiten mit den Einstellungen gelöst werden. Der Standard-Gedit-Texteditor für GNOME verfügt beispielsweise nicht über den YAML-Modus, hebt jedoch standardmäßig die YAML-Syntax hervor und ermöglicht das Konfigurieren von Einrückungen:



Gedit Einrückungseinstellungen.

Das Drawspaces- Plugin für Gedit zeigt Leerzeichen als Punkte an und beseitigt Mehrdeutigkeiten bei Einrückungsstufen.

Mit anderen Worten, nehmen Sie sich Zeit, um Ihren Lieblingseditor zu studieren. Finden Sie heraus, was er oder seine Entwicklergemeinschaft für die Arbeit mit YAML anbietet, und nutzen Sie diese Funktionen. Sie werden es definitiv nicht bereuen.

1. Verwenden Sie einen Linter (Linter)


Im Idealfall verwenden Programmier- und Auszeichnungssprachen eine vorhersagbare Syntax. Computer leisten gute Arbeit in Bezug auf Vorhersehbarkeit, und so erschien 1978 das Konzept des Linter . Wenn es Sie 40 Jahre lang bestanden hat und Sie den YAML-Linter immer noch nicht verwenden, ist es Zeit, Yamllint zu probieren.

Sie können yamllint mit dem Standard-Linux-Paketmanager installieren. Unter Red Hat Enterprise Linux 8 oder Fedora wird dies beispielsweise folgendermaßen ausgeführt:

$ sudo dnf install yamllint 

Dann führen Sie einfach yamllint aus und übergeben ihm die YAML-Datei zur Überprüfung. So sieht es aus, wenn Sie eine Fehlerdatei an den Linter übergeben:

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

Die Zahlen auf der linken Seite sind nicht die Zeit, sondern die Koordinaten des Fehlers: Zeilen- und Spaltennummer. Die Fehlerbeschreibung sagt Ihnen vielleicht nichts, aber Sie wissen genau, wo es ist. Schauen Sie sich diese Stelle im Code an, und höchstwahrscheinlich wird alles klar.

Wenn yamllint keine Fehler in der Datei findet, wird nichts angezeigt. Wenn Sie Angst vor einer solchen Stille haben und etwas mehr Feedback wünschen, können Sie den Linter mit dem bedingten Echo-Befehl über das doppelte kaufmännische Und (&&) wie folgt starten:

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

In POSIX wird genau dann ein doppeltes kaufmännisches Und ausgelöst, wenn der vorherige Befehl 0 zurückgibt. Und yamllint gibt nur die Anzahl der gefundenen Fehler zurück, sodass diese gesamte bedingte Konstruktion funktioniert.

2. Schreiben Sie in Python, nicht in YAML


Wenn YAML dich wirklich verärgert, schreibe einfach nicht buchstäblich darauf. Es kommt vor, dass YAML das einzige Format ist, das von der Anwendung wahrgenommen wird. In diesem Fall ist es jedoch nicht erforderlich, eine YAML-Datei zu erstellen. Schreiben Sie, was Ihnen gefällt, und konvertieren Sie dann. Für Python gibt es beispielsweise eine großartige Pyyaml- Bibliothek und zwei vollständige Konvertierungsmethoden: Selbstkonvertierung und skriptbasierte Konvertierung.

Selbstumwandlung


In diesem Fall ist die Datendatei auch ein Python-Skript, das YAML generiert. Diese Methode eignet sich am besten für kleine Datenmengen. Sie schreiben einfach JSON-Daten in eine Python-Variable, stellen ihr die Importanweisung voran und fügen am Ende der Datei drei Zeilen hinzu, um die Ausgabe zu implementieren.

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

Führen Sie diese Datei nun in Python aus und die Ausgabedatei lautet 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 

Dies ist absolut korrekt YAML, aber yamllint warnt Sie, dass es nicht mit --- beginnt. Nun, dies kann leicht manuell behoben oder leicht modifiziertes Python-Skript.

Über Skripte konvertieren


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

Erstellen Sie zunächst die JSON-Datei example.json. Sie können sie beispielsweise auf json.org übernehmen :

 { "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" } } } } } 

Erstellen Sie dann einen einfachen Skriptkonverter und speichern Sie ihn unter dem Namen json2yaml.py. Dieses Skript importiert beide Module - YAML und JSON Python - und lädt auch die benutzerdefinierte JSON-Datei, führt die Konvertierung durch und schreibt 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 nach Bedarf aus:

 $ ~/bin/json2yaml.py example.json 

3. Analysieren Sie viel und oft


Manchmal ist es nützlich, das Problem aus einem anderen Blickwinkel zu betrachten. Wenn Sie sich die Beziehungen zwischen Daten in YAML nur schwer vorstellen können, können Sie sie vorübergehend in etwas Vertrauteres umwandeln.

Wenn Sie beispielsweise mit Wörterbuchlisten oder JSON vertraut sind, kann YAML mit nur zwei Befehlen in der interaktiven Python-Shell in JSON konvertiert werden. Angenommen, Sie haben eine YAML-Datei mydata.yaml. Dann würde dies folgendermaßen 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 Road\n', 'city': 'Brooklyn', 'state': 'Wellington', 'postal': 6021, 'country': 'NZ'}}, 'words': 938, 'comments': 'Good article. Could be better.'} 

Viele andere Beispiele finden Sie zu diesem Thema. Darüber hinaus gibt es viele Online-Konverter und lokale Parser. Zögern Sie also nicht, die Daten neu zu formatieren, wenn Sie darin nur einen unverständlichen Hash sehen.

4. Technische Daten lesen


Wenn Sie nach einer langen Pause zu YAML zurückkehren, ist es hilfreich, auf yaml.org die technischen Daten erneut zu lesen. Wenn Sie Probleme mit YAML haben, Ihre Hände jedoch die Spezifikation nicht erreicht haben, ist es an der Zeit, diese Situation zu korrigieren. Die Spezifikationen sind überraschend einfach zu schreiben, und die Syntaxanforderungen werden in Kapitel 6 anhand einer Vielzahl von Beispielen veranschaulicht.

5. Pseudokonfigurationen


Beim Schreiben eines Buches oder Artikels ist es immer sinnvoll, zunächst einen vorläufigen Plan zu skizzieren, zumindest in Form eines Inhaltsverzeichnisses. So ist es auch mit YAML. Wahrscheinlich stellen Sie sich vor, welche Daten Sie in die YAML-Datei schreiben müssen, aber Sie verstehen nicht wirklich, wie Sie sie miteinander in Beziehung setzen sollen. Zeichnen Sie daher vor dem Formen von YAML eine Pseudokonfiguration.

Pseudo-Konfiguration ähnelt Pseudo-Code, bei dem Sie sich nicht um Struktur oder Einrückung, Eltern-Kind-Beziehungen, Vererbung und Verschachtelung kümmern müssen. Hier ist es also: Sie zeichnen Iterationen von Daten, wie sie in Ihrem Kopf entstehen.



Eine Pseudokonfiguration, in der Programmierer (Martin und Tabitha) und ihre Fähigkeiten (Programmiersprachen: Python, Perl, Pascal und Lisp, Fortran, Erlang) aufgelistet sind.

Nachdem Sie eine Pseudokonfiguration auf ein Blatt Papier gezeichnet haben, analysieren Sie sie sorgfältig und formatieren Sie sie, wenn alles in Ordnung ist, als gültige YAML-Datei.

6. Das Tab- oder Dilemma-Dilemma


Sie müssen das Dilemma "Tabulatoren oder Leerzeichen?" . Nicht im globalen Sinne, sondern nur auf der Ebene Ihrer Organisation oder zumindest eines Projekts. Es spielt keine Rolle, ob die Nachbearbeitung durch das sed-Skript verwendet wird, die Einstellung von Texteditoren auf Programmiermaschinen oder der allgemeine Empfang von Belegen zur strikten Einhaltung der Anweisungen des Linter unter Androhung einer Entlassung, sondern alle Mitglieder Ihres Teams, die in irgendeiner Weise mit YAML in Verbindung stehen Verwenden Sie nur Leerzeichen (gemäß der YAML-Spezifikation).

In jedem normalen Texteditor können Sie die Registerkarten für die automatische Korrektur auf eine bestimmte Anzahl von Leerzeichen einstellen, damit Sie keine Angst vor den Tab- Unruhen haben.

Wie jeder Hasser von YAML weiß, ist der Unterschied zwischen Tabulatoren und Leerzeichen auf dem Bildschirm nicht sichtbar. Und wenn etwas nicht sichtbar ist, wird dies normalerweise zuletzt gespeichert, nachdem es sortiert, überprüft und alle anderen möglichen Probleme beseitigt wurde. Die Zeit, die für die Suche nach einer Tabulatorkurve oder einem Leerzeichenblock benötigt wird, bedeutet lediglich, dass Sie dringend eine Richtlinie für die Verwendung der einen oder anderen erstellen und anschließend eine Überprüfung der Konformität durch Stahlbeton durchführen müssen (z. B. durch einen Git-Hook für den erzwungenen Durchlauf durch den Linter).

7. Besser weniger ist besser (oder mehr ist weniger)


Einige Leute schreiben gerne in YAML, weil es die Struktur betont. Gleichzeitig verwenden sie aktiv Einrückungen, um Datenblöcke hervorzuheben. Dies ist eine Art Betrug, um Markup-Sprachen zu simulieren, die explizite Trennzeichen verwenden.

Hier ist ein Beispiel für eine solche 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 

Diese Option hilft jemandem, die YAML-Struktur in ihren Köpfen zu zerlegen, während sie im Gegenteil andere mit vielen Einrückungen ärgert, die ihrer Meinung nach unnötig sind.

Wenn Sie jedoch Eigentümer eines YAML-Dokuments sind und für dessen Wartung verantwortlich sind, müssen Sie und nur Sie festlegen, wie der Einzug verwendet werden soll. Wenn Sie sich über große Einkerbungen ärgern, halten Sie diese gemäß der YAML-Spezifikation auf ein Minimum. Zum Beispiel kann die obige Datei aus der Ansible-Dokumentation ohne Verlust 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 Leerzeichen


Wenn Sie beim Ausfüllen der YAML-Datei ständig dieselben Fehler wiederholen, ist es sinnvoll, eine leere Vorlage als Kommentar einzufügen. Beim nächsten Mal ist es dann möglich, dieses Werkstück einfach zu kopieren und dort reale Daten einzugeben, zum Beispiel:

 --- # - <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. Verwenden Sie etwas anderes


Wenn die Anwendung Sie nicht im Würgegriff hält, lohnt es sich möglicherweise, YAML in ein anderes Format zu ändern. Mit der Zeit können die Konfigurationsdateien selbst herauswachsen und es ist besser, sie in einfache Skripte in Lua oder Python zu konvertieren.

YAML ist eine großartige Sache, die viele Menschen wegen ihres Minimalismus und ihrer Einfachheit lieben, aber dies ist bei weitem nicht das einzige Werkzeug in Ihrem Arsenal. Manchmal kann man es also ablehnen. Für YAML ist es einfach, Analysebibliotheken zu finden. Wenn Sie also bequeme Migrationsoptionen anbieten, können Ihre Benutzer diesen Fehler relativ problemlos überstehen.

Wenn Sie nicht auf YAML verzichten können, nehmen Sie diese 10 Tipps in Betrieb und besiegen Sie Ihre Abneigung gegen YAML ein für alle Mal!

Source: https://habr.com/ru/post/de462125/


All Articles