Tutti amiamo Ansible, ma Ansible è YAML. Ci sono moltissimi formati per i file di configurazione: elenchi di valori, coppie 'parametro-valore', file INI, YAML, JSON, XML e molti altri. Tuttavia, per diverse ragioni, YAML è spesso considerato particolarmente difficile. In particolare, nonostante il suo minimalismo rinfrescante e le sue impressionanti capacità di gestione dei valori gerarchici, la sintassi YAML può essere frustrante con il suo approccio simile a Python riguardo ai rientri.

Se ti infastidisce YAML, puoi - e dovresti! - intraprendere i seguenti 10 passi per ridurre la tua frustrazione a un livello accettabile e amare YAML. Come in ogni vero elenco, i nostri dieci consigli saranno numerati partendo da zero, la meditazione e le pratiche spirituali sono aggiunte a piacere 😉.
0. Fai funzionare il tuo editor
Non importa quale editor di testo usi: per lui esiste sicuramente almeno un plugin per lavorare con YAML. Se non ne hai uno, cercane immediatamente uno e installalo. Il tempo che dedicherai alla ricerca e alla configurazione ripagherà ogni volta che dovrai modificare un file YAML.
Ad esempio, l'editor supporta YAML di default, mentre per GNU Emacs dovrai installare pacchetti aggiuntivi, come il .

Emacs in modalità YAML e visualizzazione degli spazi.
Se il tuo editor preferito non ha una modalità YAML, parte dei problemi possono essere risolti lavorando con le impostazioni. Ad esempio, l'editor di testo Gedit, che è predefinito per GNOME, non ha una modalità YAML, ma evidenzia la sintassi YAML di default e consente di configurare le rientranze:

Impostazione delle rientranze in Gedit.
E il plugin per Gedit visualizza gli spazi come punti, eliminando l'ambiguità sui livelli di rientro.
In altre parole, dedica del tempo a conoscere il tuo editor preferito. Scopri cosa offre di suo o ciò che la comunità di sviluppo propone per lavorare con YAML e sfrutta queste funzionalità. Non te ne pentirai.
1. Usa un linter
Idealmente, i linguaggi di programmazione e i linguaggi di markup utilizzano una sintassi prevedibile. I computer gestiscono bene la prevedibilità, quindi già nel 1978 è nata la concezione di un Se negli ultimi 40 anni ti è sfuggito e non hai mai usato un linter per YAML, è ora di provare yamllint.
Installa Puoi farlo tramite il gestore di pacchetti predefinito di Linux. Ad esempio, su 8 o si fa così:
$ sudo dnf install yamllint
Dopo puoi semplicemente eseguire yamllint, passando il file YAML da controllare. Ecco come si presenta se si passa al linter un file con un errore:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 errore errore di sintassi: qui non sono permesse mappature di valori
23:11 errore spazi finali (trailing-spaces)
I numeri a sinistra non indicano l'ora, ma le coordinate dell'errore: numero di riga e colonna. La descrizione dell'errore potrebbe non dirti nulla, ma sai esattamente dove si trova. Basta guardare quel punto nel codice e, molto probabilmente, tutto sarà chiaro.
Quando yamllint non trova errori nel file, non viene visualizzato nulla sullo schermo. Se ti spaventa tale silenzio e desideri un po' più di feedback, puoi eseguire il linter con un comando condizionale echo tramite il 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 proprio il numero di errori trovati, quindi tutta questa costruzione condizionale funziona.
2. Scrivi in Python, non in YAML
Se YAML ti infastidisce davvero, semplicemente non scrivere in esso, nel senso più letterale. A volte, YAML è l'unico formato accettato dall'applicazione. Ma anche in quel caso non è necessario creare un file YAML. Scrivi in ciò che preferisci e poi converti. Ad esempio, per Python esiste una fantastica libreria e ci sono due modi per effettuare la 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 set di dati piccoli. Devi semplicemente scrivere i dati JSON in una variabile Python, precedere con la direttiva import e alla fine del file aggiungere tre righe per gestire 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 in Python e otteniamo in output un 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, usato per creare linguaggi di markup come DocBook.
GlossSee: markup
GlossTerm: Standard Generalized Markup Language
ID: SGML
SortAs: SGML
title: S
title: glossary esempio
Questo è un YAML assolutamente corretto, ma yamllint emetterà un avviso perché non inizia con -. Beh, questo può essere facilmente corretto manualmente o aggiornando leggermente lo script Python.
Conversione tramite script.
In questo caso, iniziamo scrivendo in JSON, per poi eseguire un convertitore come script Python separato, che restituisce YAML. Rispetto al metodo precedente, questo approccio scala meglio, poiché la conversione è separata dai dati.
Per cominciare, creiamo un file JSON example.json, che ad esempio possiamo prendere da :
{
"glossary": {
"title": "esempio di glossario",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"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"
}
}
}
}
}
Dopodiché, creiamo un semplice script di conversione e salviamolo 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 un problema da un'altra angolazione. Se hai difficoltà a immaginare le relazioni tra i dati in YAML, puoi temporaneamente trasformarli in qualcosa di più familiare.
Ad esempio, se ti trovi meglio con liste di dizionari o JSON, YAML può essere trasformato in JSON con sole due comandi nella shell interattiva di Python. Supponiamo che tu abbia un file YAML mydata.yaml, ecco come sarà:
$ 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 puoi trovare molti altri esempi. Inoltre, ci sono numerosi convertitori online e parser locali. Quindi non esitare a riformattare i dati quando vedi solo un'insalata incomprensibile.
4. Leggi le specifiche
Tornando a YAML dopo un lungo periodo, è utile visitare e rileggere le specifiche. Se hai difficoltà con YAML, ma non hai mai trovato il tempo per affrontare le specifiche, è ora di cambiare questa situazione. Le specifiche sono sorprendentemente scritte in modo chiaro, e le regole di sintassi sono illustrate con molti esempi in .
5. Pseudoconfigurazioni
Quando scrivi un libro o un articolo, è sempre utile abbozzare un piano preliminare, anche solo sotto forma di indice. Lo stesso vale per YAML. È probabile che tu sappia quali dati devono essere registrati nel file YAML, ma non sei sicuro di come collegarli tra loro. Quindi prima di creare il YAML, disegna uno pseudoconfigurazione.
Uno pseudoconfigurazione è simile a pseudocodice, dove non ci si deve preoccupare della struttura o delle indentazioni, delle relazioni "genitore-figlio", dell'ereditarietà e dell'annidamento. Qui ti limiti a disegnare le iterazioni dei dati mentre questi sorgono nella tua mente.

Uno pseudoconfigurazione elenca programmatori (Martin e Tabitha) e le loro competenze (linguaggi di programmazione: Python, Perl, Pascal e Lisp, Fortran, Erlang, rispettivamente).
Dopo aver disegnato uno pseudoconfigurazione su un foglio di carta, analizzalo attentamente e, se tutto va bene, formattalo come un file YAML valido.
6. Il dilemma "tabulazione o spazi"
Dovrai affrontare il dilemma . Non in senso globale, ma solo a livello della tua organizzazione, o almeno del progetto. Non importa se si utilizza una post-elaborazione con uno script sed, la configurazione degli editor di testo sulle macchine degli sviluppatori o la raccolta di firme per garantire il rigoroso rispetto delle istruzioni del linter sotto minaccia di licenziamento, tutti i membri del tuo team che si occupano di YAML devono necessariamente utilizzare solo spazi (come richiesto dalla specifica YAML).
Qualsiasi editor di testo normale può essere configurato per sostituire automaticamente le tabulazioni con un certo numero di spazi, quindi non c'è motivo di temere la ribellione dei sostenitori del tasto Tab .
Come è ben noto a chi odia YAML, sullo schermo non c'è differenza visibile tra tabulazioni e spazi. E quando qualcosa non è visibile, di solito viene ricordato per ultimo, dopo che sono stati esaminati e risolti tutti gli altri possibili problemi. Un'ora sprecata a cercare una tabulazione errata o un blocco di spazi grida che devi urgentemente creare una politica per l'uso dell'uno o dell'altro, e poi implementare un controllo rigoroso della sua osservanza (ad esempio, tramite un hook Git per forzare il passaggio attraverso il linter).
7. Meno è meglio (o più è meno)
Alcune persone amano scrivere in YAML perché mette in evidenza la struttura. Utilizzano attivamente rientri per evidenziare i blocchi di dati. È una sorta di inganno per imitare i linguaggi di markup che utilizzano delimitatori espliciti.
Ecco un esempio di questa 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 opzione aiuta a chiarire la struttura di YAML, mentre ad altri infastidisce per l'eccesso di rientri che considerano inutili.
Tuttavia, se sei il proprietario di un documento YAML e sei responsabile della sua manutenzione, solo tu devi decidere come utilizzare i rientri. Se gli ampi rientri ti infastidiscono, riducili al minimo possibile secondo le specifiche YAML. Ad esempio, il file sopra citato dalla documentazione di 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. Utilizza modelli
Se mentre compili un file YAML commetti continuamente gli stessi errori, ha senso includere un modello-commento. In questo modo, la prossima volta puoi semplicemente copiare questo modello e inserire i dati reali, ad esempio:
---
# - <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. Utilizza qualcos'altro
Se l'applicazione non ti tiene stretto, potrebbe valere la pena passare a un altro formato. Con il tempo i file di configurazione possono diventare ingombranti e allora è meglio trasformarli in semplici script in Lua o Python.
YAML è qualcosa di fantastico, che molti amano per il suo minimalismo e semplicità, ma non è l'unico strumento a tua disposizione. Quindi, a volte, puoi anche rinunciarci. È facile trovare librerie di parsing per YAML, quindi, se proponi soluzioni di migrazione comode, i tuoi utenti vivranno questo cambiamento senza troppi problemi.
Se non puoi fare a meno di YAML, allora prendi nota di questi 10 consigli e sconfiggi la tua avversione per YAML una volta per tutte!
Fonte: habr.com
