- YAML wird in DevOps- und CI-Konfigurationen zwar quasi als Standard verwendet, kann aber wegen impliziter Typumwandlung und Unterschieden zwischen Parsern selbst bei derselben Konfiguration anders interpretiert werden als erwartet
- In YAML 1.1 können Werte wie
NO,07,08,04:30,0666zu Booleschen Werten, Zahlen, Zeitangaben oder Oktalzahlen umgewandelt werden, daher muss die beabsichtigte Zeichenkette klar kenntlich gemacht werden - Beispiele aus GitHub Actions, Kubernetes, CloudFormation und diversen CI-Diensten zeigen, dass YAML-Syntax und dienstspezifische Strukturen zu wiederholten Commits, verschachteltem Escaping und uneinheitlichen Job-Darstellungen führen können
- Die Referenzlinks bündeln ausführbares YAML, Unterschiede im Parser-Verhalten, Notationen für mehrzeilige Strings, das Problem, dass Version
1.70als1.7geparst wird, sowie die Designbegründung von StrictYAML - Alternativen wie Nickel, Dhall, CUE und Jsonnet werden ebenfalls genannt, aber die Seite selbst wirkt wie ein riesiges editierbares Textfeld und führt damit die Satire auf die Benutzbarkeit von YAML fort
Satire auf YAML als DevOps-Konfigurationssprache
- YAML wird häufig für DevOps-Konfigurationen verwendet, doch diese Seite zeigt mit Formulierungen wie „Niemand will YAML benutzen“ eine deutliche YAML-Müdigkeit
- Die Gründe, YAML als DevOps-Technologie zu verwenden, werden ironisch aufgezählt
- Es wird satirisch so dargestellt, als sei damit immer alles kompilierbar und deploybar
- Es wird gespottet darüber, dass es während der Entwicklung keine erzwungene Fehlerbehandlung gibt und Probleme erst zur Laufzeit in Produktion explodieren
- Statt Stacktraces mit Zeilennummern sei eine Meldung wie „Irgendetwas ist kaputt“ angeblich besser
- Es steckt Frust darüber drin, dass man beim Erstellen neuer CI-Pipelines Zeit verbrennen muss
- Dass Kubernetes es benutzt, wird satirisch als Beleg für eine sichere Wahl behandelt
- Auch der Vorteil gegenüber JSON, nämlich Unterstützung für Kommentare, wird erwähnt
Fallstricke durch implizite Typumwandlung
- In YAML 1.1 kann
NOals Boolescher Typ geparst werdenNO: Norwaykann dann statt eines Ländercodes ein Problem durch Boolesche Interpretation auslösen- Wenn eine Zeichenkette gemeint ist, muss sie etwa mit
"NO"in Anführungszeichen gesetzt werden - Es wird darauf hingewiesen, dass die YAML-1.1-Spezifikation 22 Schreibweisen für
trueoderfalsezulässt
- Auch Werte, die wie Zahlen aussehen, können von Parsern unterschiedlich interpretiert werden
- Das Beispiel
07und08zeigt, dass das Ergebnis etwa zu[ 7, "08" ]werden kann - Das wird satirisch als Kubernetes-Cluster beschrieben, das bis zum siebten Deployment funktioniert und beim achten scheitert
- Das Beispiel
- Auch Zeichenketten, die wie Uhrzeiten aussehen, werden automatisch umgewandelt
04:30kann statt der eingegebenen Uhrzeit zum Sekundenwert16200seit Mitternacht werden- Wenn eine Zeichenkette gemeint ist, muss sie z. B. als
!!str 04:30explizit markiert werden
- Auch Unterschiede bei der Oktalschreibweise in YAML sorgen für Verwirrung
- YAML 1.1 verwendet die Schreibweise
0666 - YAML 1.2 verwendet die Schreibweise
0o666 - Dass Kubernetes YAML 1.1 verwendet, wird als eine Art „DevOps-Initiationsritus“ behandelt
- YAML 1.1 verwendet die Schreibweise
Probleme bei Versionen, SHA-Werten und Strings
- Paketversionen können wie Gleitkommazahlen geparst werden
foo: 1.7undbar: 1.70können als dieselbe Version interpretiert werdenfizz: 1.7.0undbuzz: 1.70.0können dagegen als unterschiedliche Versionsstrings behandelt werden
- Auch kurze Git-SHAs aus CI sind nicht unbedingt sicher
- Ein 8-stelliger SHA kann komplett aus Ziffern bestehen
${GIT_SHORT_SHA}ohne Anführungszeichen inmy.flaky_versionist dann möglicherweise kein String- Es wird angegeben, dass dieser Wert zu etwa 98 % ein String ist und mit
"${GIT_SHORT_SHA}"zu 100 % ein String wird
- Das Beispiel zur Rust-Toolchain ist ebenfalls als Referenzlink enthalten
Sichtbare Kosten in CI- und Infrastrukturkonfigurationen
- Enthalten ist ein Beispiel, in dem jemand beim Lernen von GitHub Actions in einer Stunde achtmal commitet und pusht und die letzte Commit-Nachricht „I don't really like yml“ lautet
- Es gibt auch ein Beispiel dafür, wie SQL aussähe, wenn man es in YAML schreiben würde
- SQL-Strukturen wie
SELECT,FROM,WHERE EXISTS,AND,EQUALS,LTwerden in verschachtelte YAML-Strukturen umgewandelt - Damit wird satirisch gezeigt, wie eine kurze SQL-Schreibweise zu einer langen und umständlichen YAML-Form wird
- SQL-Strukturen wie
- Auch die Darstellung von Jobs und Steps unterscheidet sich je nach CI-Dienst stark
- Azure DevOps verwendet die Form
jobs→job→steps→script - CircleCI verwendet die Form
jobs→job1→steps→checkout→run - Ein Beispiel für ein „CI-System der Zukunft“ zeigt, dass dieselbe Aufgabe wieder in einer anderen verschachtelten Struktur dargestellt werden könnte
- Azure DevOps verwendet die Form
- Für CloudFormation mit einer
SEARCH-Funktion innerhalb von CloudWatch-DashboardBodyist ein Beispiel enthalten, in dem bereits escapte Inhalte erneut escaped und das gesamte JSON zusätzlich in doppelte Anführungszeichen gesetzt werden muss
Ausführbares YAML und Unterschiede zwischen Parsern
- Der Ausdruck „executable yaml“ wird mit sicherheitsrelevanten Problemen beim YAML-Parsing verbunden
- Probleme bei der Parser-Kompatibilität werden ebenfalls in separatem Material behandelt
- Every YAML parser is a custom YAML parser
- Es ist als Material platziert, das zeigt, dass sich Parser nicht zwingend gleich verhalten
Verwandte Materialien und Alternativen
- Referenzmaterial zu YAML-Problemen ist gesammelt aufgeführt
- Today we’re going to look at some general problems with the YAML format
- We replaced 1,000 lines of YAML with 10 structs and people started contributing again
- What if you used the same language and tools you use to define your app to define your infrastructure?
- A YAML file is almost always still 'valid' even if it is trunca
- the bug was that the YAML parser ignored the negative signs ... so negative GPS coordinates became positive ones
- There are 63 different ways to write multi-line strings in YAML
- StrictYAML Design Justifications
- Als Alternativen zu YAML-zentriertem DevOps werden mehrere Tools und Ansätze aufgelistet
Reaktionen auf die Seite selbst
- Eine Sammlung von Reddit-Reaktionen nimmt sogar das Seitendesign ins Visier
- Es gibt die Reaktion, die Website sei ein riesiges editierbares Textfeld
- Es gibt die Reaktion, dass Hyperlinks nicht anklickbar seien
- Es gibt den Witz, dass das Problem gelöst worden sei, indem man den gesamten Seitentext markiert und gelöscht habe
- Es gibt die Reaktion, dass man der YAML-kritischen Stoßrichtung zwar zustimme, die Designentscheidung der Website aber fragwürdig finde
- Der letzte Satz erklärt, die Seite sei absichtlich „so benutzbar wie YAML“ gemacht worden
1 Kommentare
Meinungen auf Hacker News
Mein Lieblingsärgernis ist dieses hier:
0708Das Ergebnis wird zu
[ 7, "08" ]Wegen der Annahmen zu Oktalzahlen und Strings.
Diese Annahme wurde drei Ebenen tiefer in per Template erzeugtem YAML entdeckt und führte bei uns zu einem Ausfall des gesamten k8s-Clusters, wobei nur der
08-Cluster kaputtging. Die ersten sieben liefen problemlos0gar nicht mehrIch musste über diesen Kommentar zwar lachen, aber wenn man bedenkt, dass 2023 praktisch niemand Oktalzahlen in Konfigurationsdateien verwendet, sind dieses Verhalten und diese Annahme unsinnig. Hexadezimal könnte ich noch verstehen, Dezimal sowieso, aber Oktal ist schon heftig
Die Seite, die das erzeugt hat, hat die Daten sicher nicht mit einer Bibliothek serialisiert. Hätte sie eine Bibliothek verwendet, hätte diese die Typen in das korrekte Format umgewandelt
YAML hat viele Probleme, aber ich denke, das eigentliche Kernproblem ist der Versuch, Logik in Konfiguration zu stecken
Wenn man YAML nur für Daten und nicht für Logik verwendet, ist es eines der gut von Menschen les- und schreibbaren Datenformate
In CI/CD steckt immer ein gewisses Maß an Logik, und mit reinem YAML ist es fast nie getan; dazu kommen noch merkwürdige Templates. Ich frage mich, warum man nicht lieber eine echte API für eine echte Programmiersprache bereitstellt
Vor 15 Jahren gab es mit dem XML-basierten Ant dasselbe Problem, und das war nicht die Schuld von XML
Das Hauptproblem von YAML sehe ich in der fehlenden Typsicherheit. Falsche Einrückung, Tippfehler in Keys, Strings, die als Booleans geparst werden, und Ähnliches
Abgesehen davon halte ich es für ein gutes Format, weil es knapp ist und deutlich weniger syntaktisches Rauschen hat als andere Formate. Deshalb habe ich https://github.com/crdoconnor/strictyaml gebaut, damit Leute typsicheres YAML verwenden und zu solchen Problemen sofort klare Fehlermeldungen bekommen
Weil sie Abstraktionen hineinziehen, die sie für nötig halten. Deshalb vermeide ich es immer, eine turing-vollständige Programmiersprache als Konfigurationsformat zu verwenden
Ich habe einmal Stunden damit verbracht, AWS CDK Zeile für Zeile im JavaScript-Debugger nachzuverfolgen. Mit einer einfachen, dummen yaml-/JSON-/Was-auch-immer-Datei hätte es dieses Problem nicht gegeben. Es war ein kleines Projekt und brauchte diese Komplexität nicht
Deshalb bevorzuge ich auch bei Konfigurationen für JS-Tools JSON gegenüber JS. Das ist auch der Grund, warum webpack-Konfigurationen aus dem Ruder laufen. Sobald man eine echte Sprache verwenden kann, schlägt bei Leuten der „DRY-Sensor“ an und sie machen alles komplexer
Wenn es deklarativ ist, lassen sich Standardpraktiken leichter einhalten und die Tool-Unterstützung wird besser. Wenn package.json tatsächlich wie build.gradle würde, wäre das deutlich schlimmer
Man könnte festlegen: „Führe ein Skript in einem Python-Interpreter innerhalb einer stark eingeschränkten cgroup aus, und als Ergebnis muss ein Dictionary namens
CONFIGentstehen.“ Die Wrapper-Logik serialisiert das dann auf eine für das zu konfigurierende Programm passende WeiseDas ist ähnlich wie Beschwerden über die Komplexität oder Starrheit von
helm. Helm-Charts schreiben sich nicht von selbst. Es scheint einfacher zu sein, sich zu beschweren und Dinge zu ignorieren, statt das Problem zu verstehen und umzusetzenAls Dateiformat hat YAML Vor- und Nachteile. Das eigentliche Problem ist aber der Versuch, Dinge wie Bedingungen, Schleifen, Funktionen sowie Klassen/Unterklassen über Templates in einem JSON-ähnlichen Dateiformat auszudrücken
YAML ist für kleine Konfigurationen in Ordnung. Aber sobald irgendeine Art von Kontrollfluss nötig wird, wächst es sehr schnell zu vendor-spezifischen Spaghetti heran
Jinja in YAML halte ich eindeutig für ein Antipattern.
Vermutlich wurde am Anfang nicht genug Programmierbarkeit eingeplant, und später ist es entstanden, weil Leute Projekten folgten, die diesen Weg gewählt hatten und damit erfolgreich waren.
Im Artikel werden Alternativen wie Dhall und Jsonnet genannt, aber zwei weitere Möglichkeiten kann man ebenfalls in Betracht ziehen.
Erstens: eine Konfigurationsbibliothek für eine echte Programmiersprache bauen, die dann JSON-Konfigurationsdateien erzeugt. Dieses JSON wird nicht von Hand editiert, sondern nur als prüfbares Artefakt behandelt. Nutzer legen die Konfiguration als Code mit Tool-Unterstützung in der Versionsverwaltung ab. Dass es dadurch schwieriger wird, direkt auf dem Server schnelle Notfalländerungen vorzunehmen, ist Nachteil und Vorteil zugleich.
Zweitens: Starlark. Das ist eine von Python abgeleitete, nicht Turing-vollständige Sprache, die ursprünglich für das Bazel-Buildsystem entwickelt wurde. Es gibt mehrere Implementierungen, und ich weiß nicht, wie weit die Kompatibilität reicht, aber es gibt auch Python-Bindings: https://github.com/caketop/python-starlark-go, https://github.com/inducer/starlark-pyo3
{%und{{, beide YAML-Zeichen sind und man deshalb jede Verwendungsstelle in Anführungszeichen setzen muss.Ansätze wie
${{bei GitHub Actions oder<%,<<finde ich deutlich besser. Natürlich besteht bei<<:die Gefahr, dass es YAML-Syntax ist, aber gültiges Jinja ist es nicht.Falls gemeint ist, dass man überhaupt nichts Ausführbares in YAML packen sollte: Ich denke, der Zug ist längst abgefahren. Die Leute haben gemerkt, dass die Methode, Literalteile als Standard zu nehmen und nur gelegentlich ausführbare Teile einzufügen, wie bei ASP/JSP/PHP gut zum Erzeugen von Content funktioniert.
Wenn man in diesem Thread einen Neben-Flamewar starten wollte, müsste man HCL und
for_eacherwähnen, aber zumindest hier sollte man das wohl besser lassen.Ich weiß nicht, wie viel davon an CDK liegt und wie viel daran, dass CloudFormation von Haus aus nicht besonders gut ist.
Ich mag Jsonnet und Starlark, aber in der Praxis braucht man für die meisten Use Cases keine neue Programmiersprache. Meist will man nur ein Basisdokument erstellen und es durch Anwenden von Patches ändern. Dann wird alles viel einfacher.
Die Erfahrung mit reinem YAML an sich ist gar nicht so schlecht. Das Format hat zwar ein paar ziemlich fragwürdige Stellen, ist aber brauchbar. Das Problem entsteht meiner Meinung nach durch die Komplexität der Workarounds, die man hinzufügen muss, um Dokumente an mehrere Umgebungen anzupassen.
Ich habe gehört, früher habe es statt YAML eine echte Python-DSL gegeben, aber die scheint eingestellt worden zu sein. Deshalb werden Schleifen und if-then jetzt zu furchtbaren, ausufernden YAML-Klumpen, und Jinja wird völlig unvorhersehbar interpretiert.
jsonnetStarlark-Code ausführen kann, um JSON oder YAML zu erzeugen.YAML an sich halte ich für großartig. Nicht großartig ist, dass wir den Deployment-Teil von CD viel zu schwierig gemacht haben.
Ich gebe zu, dass unsere Konfiguration in Azure DevOps nicht gerade fantastisch ist, aber es ist erstaunlich, dass es Organisationen gibt, in denen mehrere Teams oder fünf bis sechs Betreiber mit solchen Tools umgehen müssen. Bei Google oder ähnlichen Unternehmen mag das anders sein, aber für ein normales Enterprise mit höchstens 50.000 gleichzeitigen Nutzern, meist deutlich weniger, wirkt das übertrieben.
Anfang der 2000er war es einfacher, eine Enterprise-Web-App auf einem On-Premises-IIS zu deployen, bei dem weniger als 0,25 Vollzeitstellen alles Mögliche wie Load Balancing und Networking betreuten, als dieselbe App heute in ein „modernes“ Setup zu deployen.
Natürlich haben moderne Pipelines Vorteile. Sie haben viele „Auf meinem Rechner funktioniert es“-Probleme überwunden und mit besseren Approval-Gates die Qualitätskontrolle deutlich verbessert. Aber das eigentliche Deployment ist auch 2023 noch ein Albtraum.
Für HN-Programmierer in echten Tech-Unternehmen oder Firmen mit guten dedizierten DevOps-Teams ist das vielleicht kein Problem. Aber in der nichttechnischen Enterprise-Welt war CI/CD in meiner Laufbahn noch nie so schlecht.
Man kann YAML die Schuld geben oder der Tatsache, dass man für alles Mögliche zu viel YAML braucht und Templates schwierig sind. Aber meiner Meinung nach ist das Organisationsproblem viel größer als das technische Problem. CD-Tools müssten viel stärker automatisiert sein, damit Entwickler nicht Infrastruktur als Code beschreiben müssen.
Es ist gut, dass das möglich ist, aber die Realität ist, dass man Millionen Entwickler auffordert, Infrastruktur zu deployen, die sie womöglich kaum verstehen. Ich habe noch keinen Entwickler gesehen, der nicht einfach einen Container abgeben und hoffen wollte, dass Networking und der „Server-Kram“ von selbst erledigt werden.
Wenn man das nicht tut, entstehen jede Menge VNETs und Subnetze, deren Funktionsweise niemand richtig versteht, und Unternehmen verlieren viel Geld, weil Entwickler nicht wissen, dass es mit
/xgegangen wäre.Man schreibt offline irgendeine Art von „Job-Definition“, reicht sie bei einem proprietären, gemeinsam genutzten System ein, wartet in einer Queue und bekommt anschließend Logdateien von einem System, das man nicht kontrolliert. Weil man den proprietären Systemcode nicht lokal auf der Workstation ausführen kann, dauert der innere Iterationszyklus selbst im besten Fall Dutzende Minuten, im schlechteren Fall Stunden oder Tage.
Es gibt keine Preview, keinen „what if“-Modus und keinen „dry run“. Selbst wenn man es „Test“ nennt, arbeitet man faktisch in Produktion, weil es nur ein System gibt.
Das eigentliche Problem ist nicht YAML. Es wäre egal, wenn die Pipeline in Gottes Programmiersprache geskriptet wäre.
Softwareentwicklung auf Workstations statt auf zentralen Time-Sharing-Mainframes wurde vor allem deshalb so populär, weil sie die inneren Iterationen drastisch beschleunigte, von der Produktionsumgebung isolierte und den Entwicklern wieder Kontrolle gab.
Die aktuelle Generation von CI/CD-Pipelines macht all das weitgehend rückgängig.
Single-Machine-Kubernetes bringt die meisten Vorteile der Workstation-basierten Entwicklung zurück, ist aber noch ein sehr neues System mit vielen Wachstumsschmerzen.
Ein verwandtes Problem: Für Entwickler, die allein per Klick eine einzelne App betreiben, gibt es großartige Lösungen, und für riesige Unternehmen, die groß angelegte Automatisierung für Tausende Entwickler betreiben, ebenfalls. Aber der Bereich dazwischen, in dem einige Enterprise-Entwickler Dutzende Apps verwalten, ist schlicht Chaos.
In meinem Docker-Image lief es mehrfach problemlos, aber im deployten Image ist es schon einige Male kaputtgegangen.
Das sind Probleme, durch die man nur hindurchkommt, wenn die gesamte Build- und Deployment-Pipeline vollständig transparent ist, man vollen Zugriff auf das Image-Repository hat und die Build-Anweisungen tatsächlich kontrollieren kann. Das ist genauso restriktiv wie die Kontrolle über das lokale Betriebssystem, und ich denke, es wird in genauso vielen Organisationen scheitern, wie Code früher beim Wechsel auf eine andere Maschine kaputtging.
Das in einem beliebigen CI/CD-System so einzurichten, wirkt ziemlich intuitiv.
Ich glaube, es gäbe eine Lösung, um den Frieden zu wahren, wenn alle nur eine einzige Regel allgemein respektieren würden: Außerhalb des Python-Ökosystems kein YAML verwenden
Dann können die Leute, die ein obskures Scripting-Format mögen, das Lesbarkeit über Korrektheit, Robustheit und Wartbarkeit stellt, weiter Tab-Zeichen, lockeres Typing und schwer durchschaubare Syntax verwenden. Der Rest von uns müsste das nicht mehr. Wer C-artige Syntax bevorzugt, könnte bei Verstand bleiben
Ich glaube, damit ist endlich der Kern des Problems getroffen. Für mich als Entwickler mit C-Syntax ist syntaktischer Whitespace reiner Wahnsinn. Whitespace ist Formatierung, keine Information und kein Befehl. Gute Formatierung ist hilfreich und nützlich, und auch gute Entwickler in C-Syntax achten auf lesbare Formatierung
In Python und YAML ist Formatierung Anweisungsinformation. Der Vorteil ist, dass jeder funktionierende Code dadurch gut lesbar wird. Aber warum muss Code zwingend gut lesbar sein, damit er funktioniert?
Man muss sich nur vorstellen, mit einem Kollegen wie YAML zu arbeiten. Man schickt eine lange Nachricht, und er antwortet: „Was? Das ergibt keinen Sinn.“ Dann stellt sich heraus, dass die Bedeutung kaputtging, weil zwischen den Absätzen keine Leerzeilen standen. Fügt man die Leerzeilen wieder ein und schickt die Nachricht erneut, kann er sie plötzlich lesen. Ohne syntaktisch korrekte Formatierung waren die gesendeten Informationen bedeutungslos
Es gibt zahllose Arten zu formatieren, und ich bevorzuge es, wenn Leute beim Schreiben von Code einen Linter verwenden. Wenn möglich denselben Linter wie ich
Solche Sprachen erzwingen standardisierte syntaktische Strukturen. Das reduziert die Möglichkeiten, schwer lesbaren Code zu schreiben, und das ist gut
Inzwischen denke ich aber, dass der Unterschied keine Philosophie-, sondern eine Werkzeugfrage ist. Manche Tools, etwa Texteditoren oder E-Mail-Programme, unterstützen signifikanten Whitespace gut, andere nicht
Alle Texteditoren, die ich benutze, sind so eingestellt, dass sie Leerzeichen und Tab-Zeichen anzeigen, und zwar unterschiedlich. Meist als blasse Punkte und blasse Striche oder ähnlich. Ich bin daran gewöhnt, und es stört mich überhaupt nicht
Aus meiner Sicht ist Code kein beliebiger Text. Man verwendet eine Monospace-Schrift, die man für Bücher nicht nehmen würde, und hebt Syntax farblich hervor. Es gibt keinen Grund, Whitespace nicht sichtbar zu machen
Ich bevorzuge zwar weiterhin Sprachen ohne signifikanten Whitespace, aber ich hasse solche Sprachen nicht. Für mich ist das überhaupt kein Problem
Wenn die bevorzugten Tools signifikanten Whitespace aber nicht gut unterstützen, Whitespace nicht sichtbar machen oder man sogar in einer Proportionalschrift programmiert, dann bleibt einem kaum etwas anderes übrig, als signifikanten Whitespace leidenschaftlich zu hassen und ihn für reinen Wahnsinn zu halten
Geändert hat sich meine Meinung überraschenderweise durch CoffeeScript. Ich mag JavaScript nicht besonders, aber CoffeeScript fühlte sich an wie eine destillierte Version von Crockfords The Good Parts. Man konnte die schlechten Teile nicht versehentlich erzeugen
Außerdem war es ziemlich angenehm, dass Einrückung zu Code wurde. Der einzige Nachteil war, dass man in Vi nicht auf einer öffnenden oder schließenden geschweiften Klammer
%drücken konnte, um das andere Ende des Blocks zu finden. Umgekehrt sorgte die Einrückung dafür, dass Code, der seltsam aussah, oft tatsächlich seltsam warPython habe ich trotzdem noch nicht besonders gründlich gelernt. Heute nutze ich TypeScript, aber falls irgendwann CoffeeTypeScript erscheint …
Deshalb habe ich angefangen, selbst ein Format namens BCL zu bauen: https://github.com/wkhere/bcl
Es wird nicht sofort bei allen YAML-Anwendungsfällen helfen, könnte aber zumindest eine schönere Art sein, Ressourcen im Stil von Terraform zu definieren. Tatsächlich hilft es in einem internen Projekt bereits als HCL-Ersatz, und das war der letzte Anstoß, es zu bauen
Im größeren Bild weiß ich nicht, wie es beim Problem helfen soll, dass YAML in Kubernetes überall ist. Mehr als die Hälfte meines
$daily_job-Problems besteht darin, dass das Zusammenführen des endgültigen Helm-Charts aus mehreren Quellen viel zu grob istDas heißt nicht, dass Helm an sich ein schlechtes Tool ist oder dass mein Unternehmen Helm auf ziemlich schlechte Weise gewählt hat. Ich denke, alle tun unter den gegebenen Umständen ihr Bestes
Aber Text-Templates mit signifikantem Whitespace zu manipulieren ist viel zu fehleranfällig, und Fehler werden viel zu spät entdeckt. Kubernetes wäre meiner Meinung nach deutlich besser gefahren, wenn es ein eigenes Format auf Basis C-artiger Syntax verwendet hätte, statt beweisen zu wollen, wie toll YAML ist. Zumal YAML nicht einmal toll ist
Alles, was JSON erzeugt, kann auch zum Erzeugen von YAML verwendet werden
Nickel kann zu JSON ausgewertet werden: https://nickel-lang.org/
https://youtu.be/SEA1Qm8K4gY?feature=shared
Sieht ziemlich ähnlich aus
Das ist der Inner-Platform-Effekt. Je größer eine Anwendung wird, desto mehr wächst auch die Konfiguration, bis sie schließlich zu einer Programmiersprache wird – nur zu einer mit vielen Bugs, schwacher Spezifikation und schrecklicher Usability
Man erklärt den Konfigurationsbankrott und wählt ein neues Konfigurationsformat. Und dann wiederholt sich alles
Natürlich ist das Format selbst nicht völlig unschuldig. Je flexibler es ist, desto leichter wird es als schlechte Programmiersprache zweckentfremdet
Nachdem ich diesen Fehler wiederholt gemacht habe, würde ich heute für Basiskonfigurationen das möglichst einfachste Konfigurationsformat wählen. Selbst
.inikann schon zu mächtig sein. Komplexere „Konfiguration“ würde ich einer echten Programmiersprache überlassen, möglichst der Sprache, in der die Anwendung geschrieben istDie überwältigende Mehrheit der Beispiele für „YAML ist schlecht“ lässt sich lösen, indem man seltsame Literale einfach in Anführungszeichen setzt
Es stimmt schon, dass YAML manchmal nervt. Zum Beispiel werden Listen von Maps schnell merkwürdig, und bedeutungstragende Leerzeichen werden einem fast zwangsläufig irgendwann zum Verhängnis. Aber solche Artikel wirken selbst wohlwollend betrachtet etwas nachlässig
Das gesamte YAML-Ökosystem verleitet dazu, Werte ohne Anführungszeichen zu schreiben. Meist funktioniert das gut, bis es gelegentlich genau oft genug kaputtgeht, um in Production darüber zu stolpern
EDN ist eine Teilmenge von Clojure: https://github.com/edn-format/edn
Es ist eindeutig, streambar, erweiterbar und nicht empfindlich gegenüber Whitespace. Es gibt allerdings Formatierungskonventionen für die Lesbarkeit
Aber ich bin mir nicht sicher, worin der semantische Unterschied zwischen Listen und Vektoren liegt. In meinem Kopf sind Arrays und verkettete Listen Implementierungsdetails von Datenstrukturen im Code, keine Unterschiede im Datenformat
Trotzdem gibt es keinerlei semantische Einrückungsspielchen. Dass Kommas als Whitespace gelten und nicht nötig sind, ist schön
Wenn Studierende Aufgaben über die E-Learning-Plattform einreichen, bekommen wir alle Einreichungen als ziemlich große XML-Datei
Wir lesen die Einreichungen, geben sie an statische Analyse und Beispielausführungen weiter und schreiben dann für jede Aufgabe eine YAML-Datei, die alle Einreichungen, Bewertungshinweise, Kommentare sowie Eingabefelder für Punkte enthält
Danach erzeugen wir aus der YAML-Datei über Markdown+Rendering (Pandoc) Berichte, Statistiken und Feedback-PDFs
Für uns passt YAML sehr gut, weil man zusätzliches Feedback leicht in Markdown-Syntax einfügen kann. Zum Beispiel etwas wie korrekt eingerücktes
- you missed a \NOT` here`Dank der verschiedenen Escape-Varianten für Blocktext können wir SQL-Einreichungen schön ohne Escape-Zeichen ausgeben, auch wenn die Studierenden unterschiedliche SQL-Delimiter verwenden
Alles ist Plain Text, daher nutzen wir nur Texteditoren und speichern es in git, um Verantwortlichkeit bei der Bewertung sicherzustellen. Weil wir alles maschinenlesbar aufbewahren, können wir neue statische Analyse-Tools auch an alten Einreichungen testen
Aber da CI-Pipelines und Home-Automation-Konfigurationen ebenfalls in YAML geschrieben werden müssen, verstehe ich den Schmerz
In TOML muss man entweder auf Einrückung bei mehrzeiligen Strings verzichten und damit die Lesbarkeit senken, oder am Ende jeder Zeile einen Backslash setzen. Beides ist nicht ideal
Deshalb ist YAML für DSLs oder Konfigurationen, die Markdown oder andere Textformate enthalten müssen, ziemlich gut und hat gegenüber Dingen wie TOML einen Vorteil
Aber ich würde die gesamte „YAML-Müdigkeit“ nicht allein den CI- und DevOps-Tools anlasten, die YAML als Transportformat für ihre DSL gewählt haben. Wie der Originalbeitrag gut zusammenfasst, hat YAML selbst große Probleme
Das berühmte „Norway-Problem“ wurde in YAML 1.2 gelöst, und auch das Parsen führender Nullen als Oktalzahlen wurde in YAML 1.2 behoben. Übermäßige Typumwandlung bei Zahlen, Datums- und Zeitwerten usw. kann verwirrend sein. Auch die Modi zur Behandlung mehrzeiliger Strings können ziemlich irritierend sein. Unsichere Serialisierung ist in modernen Parsern kein Problem, aber wenn man YAML in älteren Sprachen mit dynamischen Funktionen wie Ruby, Python oder Java verwendet, sollte man vorsichtig sein
All das sind Probleme der YAML-Spezifikation selbst