Vi alla Àlskar Ansible, men Ansible Àr YAML. Det finns massor av format för konfigurationsfiler: vÀrdelistor, nyckel-vÀrde-par, INI-filer, YAML, JSON, XML och mÄnga fler. Men av flera skÀl anses YAML ofta vara sÀrskilt svÄrt av alla dessa. SÀrskilt, trots dess uppfriskande minimalism och imponerande funktioner för att arbeta med hierarkiska vÀrden, kan YAML:s syntax irritera med sin Python-liknande instÀllning till indrag.

Om YAML irriterar dig kan du â och bör! â vidta 10 följande steg för att minska din irritation till en acceptabel nivĂ„ och lĂ€ra dig att Ă€lska YAML. Precis som en riktig lista kommer vĂ„ra tio tips att numreras frĂ„n noll, meditation och andliga övningar kan lĂ€ggas till efter eget önskemĂ„l đ
0. FĂ„ din redigerare att fungera
Oavsett vilken textredigerare du har finns det förmodligen minst ett plugin för att hantera YAML. Om du inte har ett, hitta och installera ett omedelbart. Den tid du sparar pÄ att söka och stÀlla in kommer att betala sig flera gÄnger varje gÄng du behöver redigera YAML.
Till exempel stöder redigeraren YAML som standard, medan GNU Emacs krÀver att man installerar extra paket som .

Emacs i YAML-lÀge och visar inslagna utrymmen.
Om din favoritredigerare inte har ett YAML-lÀge kan vissa problem lösas genom att arbeta med instÀllningarna. Till exempel har GNOMEs standardtextredigerare Gedit inget YAML-lÀge, men den har som standard syntaxhighlighting för YAML och lÄter dig anpassa indragningen:

InstÀllning av indrag i Gedit.
Och pluginet för Gedit visar utrymmen som punkter, vilket eliminerar oklarheter kring indragningsnivÄerna.
Med andra ord, spendera tid pÄ att lÀra dig din favoritredigerare. Ta reda pÄ vad den sjÀlv eller dess utvecklargemenskap erbjuder för att arbeta med YAML, och anvÀnd dessa funktioner. Du kommer definitivt inte att Ängra dig.
1. AnvÀnd en linter
Idealiskt anvÀnder programmeringssprÄk och markeringssprÄk en förutsÀgbar syntax. Datorer hanterar förutsÀgbarhet bra, sÄ redan 1978 kom konceptet Om detta koncept har passerat dig under de senaste 40 Ären och du fortfarande inte anvÀnder en YAML-linter, Àr det dags att prova yamllint.
Installera det kan installeras med den inbyggda paketförvaltaren för Linux. Till exempel i 8 eller detta görs sÄ hÀr:
$ sudo dnf install yamllint
Sedan kör du bara yamllint och anger YAML-filen för kontroll. SÄ hÀr ser det ut om du skickar en fil med fel till lintern:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 fel syntaktiskt fel: mappvÀrden Àr inte tillÄtna hÀr
23:11 fel överblivna mellanslag (trailing-spaces)
Siffrorna till vÀnster Àr inte tider, utan felkoordinater: radnummer och kolumnnummer. Felbeskrivningen kanske inte sÀger dig nÄgot, men du vet exakt var det Àr. Titta bara pÄ den platsen i koden, sÄ blir det troligen tydligt.
NÀr yamllint inte hittar nÄgra fel i filen visas ingenting pÄ skÀrmen. Om du Àr orolig för denna tystnad och vill ha lite mer Äterkoppling kan du köra lintern med en villkorlig echo-kommandog genom dubbel ampersand (&&), sÄ hÀr:
$ yamllint perfect.yaml && echo "OK"
OK
I POSIX aktiveras dubbel ampersand endast dÄ och endast dÄ nÀr den föregÄende kommandot returnerar 0. Och yamllint returnerar just antalet hittade fel, sÄ hela denna villkorliga konstruktion fungerar.
2. Skriv i Python, inte i YAML
Om du verkligen störs av YAML, skriv helt enkelt inte i det, bokstavligt talat. Ibland Àr YAML det enda format som accepteras av en applikation. Men Àven i det fallet Àr det inte nödvÀndigt att skapa en YAML-fil. Skriv i vad du gillar och konvertera sedan. För Python finns det ett utmÀrkt bibliotek och hela tvÄ sÀtt att konvertera: sjÀlvkonvertering och konvertering via skript.
SjÀlvkonvertering
I det hÀr fallet Àr datafilen ocksÄ ett Python-skript som genererar YAML. Detta sÀtt passar bÀst för smÄ datamÀngder. Du skriver bara JSON-data i en Python-variabel, föregÄr detta med direktivet import, och i slutet av filen lÀgger du till tre rader för att implementera utdata.
#!/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 kör vi denna fil pÄ Python och fÄr ut filen output.yaml:
$ python3 .\/example.json
$ cat output.yaml
glossary:
GlossDiv:
GlossList:
GlossEntry:
Abbrev: ISO 8879:1986
Acronym: SGML
GlossDef:
GlossSeeAlso: [GML, XML]
para: Ett meta-markup-sprÄk som anvÀnds för att skapa markup-sprÄk som DocBook.
GlossSee: markup
GlossTerm: Standard Generalized Markup Language
ID: SGML
SortAs: SGML
title: S
title: exempelordlista
Detta Ă€r absolut korrekt YAML, men yamllint kommer att ge en varning om att den inte börjar med â. Tja, det kan enkelt korrigeras för hand eller en liten justering kan göras pĂ„ Python-skriptet.
Konvertering via skript
I det hÀr fallet skriver vi först i JSON och sedan kör vi en konverterare i form av ett separat Python-skript, som ger YAML som resultat. JÀmfört med det föregÄende Àr den hÀr metoden bÀttre skalbar, eftersom konverteringen Àr Ätskild frÄn datan.
Först kommer vi att skapa en JSON-fil example.json, den kan till exempel hÀmtas frÄn :
{
"glossary": {
"title": "exempel pÄ ordlista",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "Ett meta-markup-sprÄk som anvÀnds för att skapa markup-sprÄk som DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
Sedan skapar vi ett enkelt konverteringsskript och sparar det som json2yaml.py. Detta skript importerar bĂ„da modulerna â YAML och JSON Python, samt laddar den angivna JSON-filen som anvĂ€ndaren tillhandahĂ„ller, utför konverteringen och skriver data till filen 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()
Spara detta skript i systemets sökvÀg och kör det vid behov:
$ ~/bin/json2yaml.py example.json
3. Analysera mycket och ofta
Ibland Àr det bra att se pÄ problemet frÄn ett annat hÄll. Om du har svÄrt att förestÀlla dig sambanden mellan datan i YAML, kan du tillfÀlligt omvandla dem till nÄgot mer bekant.
Om du till exempel Àr bekvÀm med att arbeta med ordbokslistor eller JSON, kan YAML omvandlas till JSON med bara tvÄ kommandon i Python:s interaktiva skal. Anta att du har en YAML-fil mydata.yaml, dÄ ser det ut sÄ hÀr:
$ 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': 'Bra artikel. Kunde ha varit bÀttre.'}
Det finns mÄnga andra exempel pÄ detta Àmne. Dessutom finns det mÄnga onlinekonverterare och lokala parserare. SÄ tveka inte att omformatera data nÀr du ser dem som bara en oförstÄelig röra.
4. LĂ€s specifikationerna
NÀr du ÄtervÀnder till YAML efter en lÄng paus, kan det vara bra att besöka och lÀsa igenom specifikationerna. Om du har problem med YAML, men Ànnu inte har kommit till specifikationen, sÄ Àr det dags att rÀtta till det. Specifikationerna Àr förvÄnansvÀrt lÀttförstÄeliga, och syntaxkraven illustreras med mÄnga exempel i .
5. Pseudokonfigurationer
NÀr du skriver en bok eller artikel Àr det alltid bra att först skissa pÄ en preliminÀr plan, Ätminstone i form av ett innehÄllsförteckning. SÄ Àr det ocksÄ med YAML. Du har antagligen en uppfattning om vilka data som ska skrivas i YAML-filen, men kanske inte sÄ mycket om hur man kopplar dem samman. SÄ innan du börjar skapa YAML, rita en pseudokonfiguration.
Pseudokonfigurationen liknar pseudokod, dÀr du inte behöver bry dig om struktur eller indrag, förhÄllanden mellan "parent-child", arv och nÀstling. SÄ hÀr: du ritar iterationer av data i takt med att de dyker upp i ditt huvud.

Pseudokonfigurationen med en lista över programmerare (Martin och Tabitha) och deras fÀrdigheter (programmeringssprÄk: Python, Perl, Pascal och Lisp, Fortran, Erlang, respektive).
NÀr du har ritat pseudokonfigurationen pÄ ett papper, analysera den noggrant och om allt ser bra ut, formatera den som en giltig YAML-fil.
6. Dilemmat "tab eller mellanslag"
Du mÄste lösa dilemmat . Inte i global mening, utan bara pÄ nivÄn av din organisation, eller Ätminstone projektet. Det spelar ingen roll om det anvÀnds en postbearbetning via sed-skript, instÀllning av textredigerare pÄ programmerarnas maskiner, eller om alla mÄste skriva under kvitton för strikt efterlevnad av linterns instruktioner under hot om uppsÀgning, men alla medlemmar i ditt team som pÄ nÄgot sÀtt berör YAML mÄste obligatoriskt anvÀnda endast mellanslag (som krÀvs av YAML-specifikationen).
I varje normal textredigerare kan du stÀlla in automatisk ersÀttning av tabbar med ett angivet antal mellanslag, sÄ det finns ingen anledning att frukta revolten frÄn anhÀngarna av tangenten Tab ocksÄ.
Som varje YAML-hatare vet, syns det ingen skillnad mellan tabbar och mellanslag pÄ skÀrmen. Och nÀr nÄgot inte syns, kommer det vanligen att bli glömt tills allt annat har kontrollerats och ÄtgÀrdats. En timmes tid förlorad pÄ att leta efter en krokig tabb eller en block av mellanslag skriker verkligen efter att du omedelbart ska skapa en policy för anvÀndning av det ena eller det andra, och sedan införa en jÀrnkontroll för dess efterlevnad (till exempel genom en Git-hook för att tvinga en kontroll genom lintern).
7. BĂ€ttre mindre, men bĂ€ttre (eller mer â det Ă€r mindre)
Vissa mÀnniskor gillar att skriva i YAML eftersom det framhÀver strukturen. De anvÀnder aktivt indrag för att markera datablok. Det Àr en slags fusk för att imitera markupsprÄk som anvÀnder explicita avgrÀnsare.
HÀr Àr ett exempel pÄ sÄdan struktur frÄn :
# 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 vissa hjÀlper denna lösning dem att organisera strukturen i YAML, medan andra istÀllet blir irriterade av mÀngden onödiga indrag.
Men om du Àr Àgaren av en YAML-dokument och ansvarar för dess underhÄll, sÄ Àr det bara du som ska bestÀmma hur indragen ska anvÀndas. Om stora indrag irriterar dig, hÄll dem till ett minimum som Àr möjligt enligt YAML-specifikationen. Till exempel kan den ovanstÄende filen frÄn Ansible-dokumentationen skrivas om sÄ hÀr utan nÄgra förluster:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. AnvÀnd mallar
Om du stÀndigt upprepar samma misstag nÀr du fyller i YAML-filen kan det vara meningsfullt att infoga en kommentarmall i den. DÄ kan du nÀsta gÄng helt enkelt kopiera denna mall och fylla i verkliga data, till exempel:
---
# - <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. AnvÀnd nÄgot annat
Om applikationen inte hÄller dig i ett fast grepp kan det vara vÀrt att byta frÄn YAML till ett annat format. Med tiden kan konfigurationsfiler övergÄ till nÄgot mer och dÄ kan det vara bÀttre att konvertera dem till enkla skript i Lua eller Python.
YAML Àr en fantastisk sak som mÄnga Àlskar för sin enkelhet och minimalism, men det Àr lÄngt ifrÄn det enda verktyget i ditt arsenal. SÄ ibland kan du avstÄ frÄn det. Det Àr lÀtt att hitta parserbibliotek för YAML, sÄ om du erbjuder praktiska alternativ för migrering kan dina anvÀndare relativt smÀrtfritt acceptera ett sÄdant avstÄende.
Om du Ä andra sidan inte kan undvika YAML, ta dessa 10 rÄd till dig och övervinn din motvilja mot YAML en gÄng för alla!
KĂ€lla: habr.com
