Tutti noi amiamo Ansible, ma Ansible è YAML. Ci sono molti formati per i file di configurazione: liste di valori, coppie 'chi-valore', file INI, YAML, JSON, XML e molti altri. Tuttavia, per diverse ragioni, YAML è spesso considerato particolarmente difficile. In particolare, nonostante il suo rinfrescante minimalismo e le impressionanti capacità di lavorare con valori gerarchici, la sintassi di YAML può risultare frustrante per il suo approccio simile a Python con l'indentazione.

Se YAML ti infastidisce, puoi – e devi! – seguire questi 10 passaggi per ridurre il tuo fastidio a un livello accettabile e innamorarti di YAML. Come ci si aspetta da una vera lista, i nostri dieci consigli saranno numerati da zero, la meditazione e le pratiche spirituali sono facoltative 😉
0. Fai funzionare il tuo editor
Non importa quale editor di testo stai usando: ci sarà sicuramente almeno un plugin per lavorare con YAML. Se non ce l'hai, trovane immediatamente uno e installalo. Il tempo speso nella ricerca e nella configurazione sarà ripagato più volte ogni volta che dovrai modificare un file YAML.
Ad esempio, l'editor supporta YAML per impostazione predefinita, ma per GNU Emacs dovrai installare pacchetti aggiuntivi, come .

Emacs in modalità YAML e visualizzazione degli spazi.
Se il tuo editor preferito non ha una modalità YAML, alcune problematiche possono essere risolte lavorando con le impostazioni. Ad esempio, l'editor di testo Gedit, predefinito per GNOME, non ha una modalità YAML, ma evidenzia la sintassi YAML per impostazione predefinita e consente di configurare il lavoro con l'indentazione:

Impostazione dell'indentazione in Gedit.
E il plugin per Gedit mostra gli spazi come punti, eliminando le ambiguità sui livelli di indentazione.
In altre parole, investi del tempo per conoscere il tuo editor preferito. Scopri cosa offre di suo o cosa la sua comunità di sviluppo propone per lavorare con YAML e utilizza queste funzionalità. Non te ne pentirai.
1. Usa un linter
In modo ideale, i linguaggi di programmazione e i linguaggi di markup dovrebbero utilizzare una sintassi prevedibile. I computer si comportano bene con la prevedibilità, quindi fin dal 1978 è emersa la concezione di . Se nei tuoi 40 anni di vita questa concezione ti è sfuggita e non stai ancora usando un linter per YAML, è il momento di provare yamllint.
Installare si può fare utilizzando il gestore pacchetti predefinito di Linux. Ad esempio, in 8 o si fa in questo modo:
$ sudo dnf install yamllint
Poi basta avviare yamllint, passando il file YAML da controllare. Ecco come appare se si passa al linter un file con un errore:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 errore errore di sintassi: i valori di mapping non sono permessi qui
23:11 errore spazi finali (trailing-spaces)
I numeri a sinistra non rappresentano il tempo, ma le coordinate dell'errore: numero di riga e colonna. La descrizione dell'errore potrebbe non dirti nulla, ma almeno sai esattamente dove si trova. Basta guardare quel punto nel codice e probabilmente tutto sarà chiaro.
Quando yamllint non rileva errori nel file, non vengono visualizzati messaggi sullo schermo. Se questa assenza di feedback ti spaventa e desideri un po' più di interazione, puoi avviare il linter con un comando echo condizionale tramite doppio e commerciale (&&), in questo modo:
$ yamllint perfect.yaml && echo "OK"
OK
In POSIX, il doppio e commerciale si attiva solo quando il comando precedente restituisce 0. E yamllint restituisce il numero di errori trovati, quindi tutta questa costruzione condizionale funziona.
2. Scrivi in Python, non in YAML
Se ti infastidisce davvero YAML, basta non scrivere in esso, nel senso letterale del termine. A volte, YAML è l'unico formato riconosciuto dall'applicazione. Ma anche in questo caso non è necessario creare un file YAML. Scrivi in quello che ti piace, poi convertilo. Ad esempio, per Python c'è una fantastica libreria e ci sono due modalità di conversione: auto-conversione e conversione tramite script.
Auto-conversione
In questo caso, il file con i dati è anche uno script Python che genera YAML. Questo metodo è più adatto per piccole quantità di dati. Basta scrivere i dati JSON in una variabile Python, precederlo con la direttiva import e alla fine del file aggiungere tre righe per implementare l'output.
#!/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
Ora eseguiamo questo file su Python e otteniamo in output il file output.yaml:
$ python3 .\/example.json
$ cat output.yaml
glossary:
GlossDiv:
GlossList:
GlossEntry:
Abbrev: ISO 8879:1986
Acronym: SGML
GlossDef:
GlossSeeAlso: [GML, XML]
para: Un linguaggio di meta-markup, utilizzato per creare linguaggi di markup come DocBook.
GlossSee: markup
GlossTerm: Linguaggio di markup generalizzato standard
ID: SGML
SortAs: SGML
title: S
title: glossario di esempio
Questo è YAML assolutamente valido, ma yamllint emetterà un avviso che non inizia con —. Beh, questo può essere facilmente corretto a mano o modificando leggermente lo script Python.
Conversione tramite script
In questo caso, prima scriviamo in JSON e poi eseguiamo il convertitore sotto forma di script Python separato, che restituisce YAML. Rispetto al precedente, questo metodo si scala meglio, poiché la conversione è separata dai dati.
Per cominciare, creiamo un file JSON example.json, ad esempio, possiamo prenderlo da :
{
"glossario": {
"titolo": "glossario di esempio",
"GlossDiv": {
"titolo": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Linguaggio di markup standardizzato generale",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "Un meta-linguaggio di markup, usato per creare linguaggi di markup come DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
Poi creiamo un semplice script di conversione e lo salviamo con il nome json2yaml.py. Questo script importa entrambi i moduli - YAML e JSON di Python, carica il file JSON specificato dall'utente, esegue la conversione e scrive i dati nel file 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()
Salva questo script nel percorso di sistema e eseguilo secondo necessità:
$ ~/bin/json2yaml.py example.json
3. Analizza molto e spesso
A volte è utile guardare il problema da un'altra angolazione. Se hai difficoltà a visualizzare le relazioni tra i dati in YAML, puoi trasformarli temporaneamente in qualcosa di più familiare.
Ad esempio, se ti trovi meglio con elenchi di dizionari o con JSON, puoi convertire YAML in JSON con sole due comandi nell'interprete Python. Supponiamo che tu abbia un file YAML mydata.yaml, ecco come apparirà:
$ 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': 'Buon articolo. Potrebbe essere migliore.'}
Su questo tema si possono trovare molti altri esempi. Inoltre, esistono numerosi convertitori online e parser locali. Quindi, non esitare a riformattare i dati quando vedi solo un'incomprensibile confusione.
4. Leggi le specifiche
Tornando a YAML dopo una lunga pausa, è utile visitare e rileggere le specifiche. Se hai difficoltà con YAML, ma non sei mai arrivato alle specifiche, è il momento di porre rimedio a questa situazione. Le specifiche sono sorprendentemente ben scritte, e i requisiti di sintassi sono illustrati con moltissimi esempi in .
5. Pseudoconfigurazioni
Quando si scrive un libro o un articolo, è sempre utile iniziare con una bozza di piano preliminare, almeno sotto forma di indice. Lo stesso vale per YAML. È probabile che tu abbia un'idea dei dati da inserire nel file YAML, ma non sai bene come collegarli tra loro. Quindi, prima di creare il YAML, disegna una pseudo-configurazione.
La pseudo-configurazione è simile al pseudo-codice, dove non è necessario preoccuparsi della struttura o degli spazi, delle relazioni 'genitore-figlio', dell'ereditarietà e della nidificazione. Qui è lo stesso: disegni le iterazioni dei dati man mano che si presentano nella tua mente.

Una pseudo-configurazione con un elenco di programmatori (Martin e Tabitha) e le loro competenze (linguaggi di programmazione: Python, Perl, Pascal e Lisp, Fortran, Erlang, rispettivamente).
Dopo aver disegnato la pseudo-configurazione su un foglio di carta, analizzala attentamente e, se va tutto bene, formalizzala in un file YAML valido.
6. Dilemma 'tabulazione o spazi'
Dovrai risolvere il dilemma . Non in senso globale, ma solo a livello della tua organizzazione, o almeno del progetto. Non importa se verrà utilizzato un post-processing con uno script sed, la configurazione dei editor di testo sui computer degli sviluppatori, o una severa raccolta di ricevute per il rigoroso rispetto delle istruzioni del linter sotto minaccia di licenziamento, ma tutti i membri del tuo team che hanno a che fare con YAML devono necessariamente usare solo spazi (come richiesto dalla specifica YAML).
In qualsiasi editore di testo normale puoi impostare la sostituzione automatica della tabulazione con un numero prestabilito di spazi, quindi non c'è da temere una rivolta dei sostenitori del tasto Tab .
Come ben sa ogni nemico di YAML, non c'è differenza visibile tra la tabulazione e gli spazi sullo schermo. E quando qualcosa non è visibile, di solito si pensa a ciò per ultimo, dopo aver esaminato, controllato e risolto tutti gli altri possibili problemi. Un'ora sprecata alla ricerca di una tabulazione errata o di un blocco di spazi grida davvero che è necessario creare urgentemente una politica per l'uso dell'uno o dell'altro, per poi attuare un controllo inossidabile del rispetto (ad esempio, tramite un hook di Git per forzare l'analisi attraverso il linter).
7. Meglio poco ma buono (o più – è meno)
Alcune persone amano scrivere in YAML, poiché mette in evidenza la struttura. Utilizzano attivamente l'indentazione per evidenziare i blocchi di dati. È una sorta di imbroglio per simulare linguaggi di markup che usano delimitatori espliciti.
Ecco un esempio di tale strutturazione da :
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Per alcuni, questa variante aiuta a mettere in ordine la struttura YAML nella mente, mentre per altri risulta fastidiosa a causa di quanti più indenti ritenuti inutili.
Ma se sei il proprietario di un documento YAML e sei responsabile della sua manutenzione, allora sei solo tu a dover determinare come utilizzare le indentazioni. Se ti infastidiscono le grandi indentazioni, riducile al minimo possibile secondo le specifiche YAML. Ad esempio, il file sopra riportato dalla documentazione Ansible può essere riscritto senza alcuna perdita in questo modo:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Usa modelli
Se, durante la compilazione di un file YAML, commetti sempre gli stessi errori, ha senso inserire un modello-commento. In questo modo, la volta successiva potrai semplicemente copiare questo modello e inserire i dati reali, ad esempio:
---
# - <nome comune>:
# name: Cognome Autore
# job: LAVORO
# skills:
# - LINGUA
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
9. Usa qualcosa di diverso
Se l'applicazione non ti tiene intrappolato, potrebbe valere la pena passare da YAML a un altro formato. Col passare del tempo, i file di configurazione possono superare se stessi e allora è meglio convertirli in semplici script Lua o Python.
YAML è un'ottima cosa, apprezzata da molti per il suo minimalismo e semplicità, ma non è l'unico strumento nel tuo arsenale. Quindi, a volte può essere abbandonato. È facile trovare librerie di parsing per YAML, quindi se proponi opzioni di migrazione convenienti, i tuoi utenti sopporteranno relativamente senza dolore un tale abbandono.
Se proprio non puoi fare a meno di YAML, prendi in considerazione questi 10 suggerimenti e sconfiggi la tua avversione a YAML una volta per tutte!
Fonte: habr.com
