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.
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
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:
Inspringingen instellen in Gedit.
Een plug-in
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
Om te installeren
$ 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
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
{
"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
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.
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
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
# 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