Tutti amiamo Ansible, ma Ansible è YAML. Esistono molti 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 impressionanti capacità di lavorare con valori gerarchici, la sintassi YAML può essere fastidiosa con il suo approccio simile a Python al rientro.
Se YAML ti fa incazzare, puoi e dovresti! – segui i seguenti 10 passaggi per ridurre la tua frustrazione a un livello accettabile e innamorarti di YAML. Come si conviene a questa lista, i nostri dieci consigli saranno numerati da zero, aggiungeremo meditazione e pratiche spirituali a piacimento 😉
0. Fai funzionare il tuo editor
Non importa quale editor di testo possiedi, probabilmente esiste almeno un plugin per lavorare con YAML. Se non ne hai uno, trovalo e installalo immediatamente. Il tempo impiegato nella ricerca e nella configurazione verrà ripagato molte volte ogni volta che dovrai modificare YAML.
Ad esempio, redattore
Emacs in modalità YAML e visualizzazione degli spazi.
Se il tuo editor preferito non dispone della modalità YAML, alcuni problemi possono essere risolti lavorando con le impostazioni. Ad esempio, l'editor di testo GNOME standard Gedit non ha una modalità YAML, ma per impostazione predefinita evidenzia la sintassi YAML e consente di configurare il lavoro con i rientri:
Impostazione dei rientri in Gedit.
Un plugin
In altre parole, dedica del tempo a conoscere il tuo editor preferito. Scopri cosa lui o la sua comunità di sviluppo ha da offrire per lavorare con YAML e usa quelle funzionalità. Sicuramente non te ne pentirai.
1. Utilizzare una linter
Idealmente, i linguaggi di programmazione e i linguaggi di markup utilizzano una sintassi prevedibile. I computer sono bravi nella prevedibilità, ecco perché il concetto di
stabilire
$ sudo dnf install yamllint
Quindi esegui semplicemente yamllint, passandogli il file YAML da controllare. Ecco come appare se passi un file con un errore al linter:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
I numeri a sinistra non sono l'ora, ma le coordinate dell'errore: numero di riga e di colonna. La descrizione dell'errore potrebbe non dirti nulla, ma sai esattamente dove si trova. Basta guardare questo punto nel codice e molto probabilmente tutto diventerà chiaro.
Quando yamllint non trova errori in un file, sullo schermo non viene stampato nulla. Se questo silenzio ti spaventa e desideri un po' più di feedback, allora puoi eseguire il linter con il comando echo condizionale tramite una doppia e commerciale (&&), in questo modo:
$ yamllint perfect.yaml && echo "OK"
OK
In POSIX, una doppia e commerciale si attiva se e solo se il comando precedente restituisce 0. E yamllint restituisce semplicemente il numero di errori trovati, motivo per cui l'intero costrutto condizionale funziona.
2. Scrivi in Python, non in YAML
Se YAML ti fa davvero incazzare, non scriverci, letteralmente. Succede che YAML è l'unico formato che l'applicazione comprende. Ma anche in questo caso non è necessario creare un file YAML. Scrivi su ciò che ti piace e poi converti. Ad esempio, c'è un'ottima libreria per Python
Autoconversione
In questo caso, il file di dati è anche uno script Python che genera YAML. Questo metodo è più adatto per set di dati di piccole dimensioni. Scrivi semplicemente i dati JSON in una variabile Python, premetti una direttiva di importazione e alla fine del file aggiungi 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 in Python e otteniamo 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: 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
Questo è YAML perfettamente valido, ma yamllint ti avviserà che non inizia con -. Bene, questo può essere facilmente corretto manualmente o leggermente modificato nello script Python.
Conversione tramite script
In questo caso, prima scriviamo in JSON e poi eseguiamo il convertitore come uno script Python separato, che produce YAML come output. Rispetto al metodo precedente, questo metodo scala meglio, poiché la conversione è separata dai dati.
Innanzitutto, creiamo un file JSON example.json, ad esempio, da cui puoi prenderlo
{
"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"
}
}
}
}
}
Quindi creeremo un semplice script di conversione e lo salveremo con il nome json2yaml.py. Questo script importa moduli Python sia YAML che JSON e carica un 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 ed eseguilo secondo necessità:
$ ~/bin/json2yaml.py example.json
3. Analizza molto e spesso
A volte è utile guardare un problema da una prospettiva diversa. Se hai problemi a rappresentare le relazioni tra i tuoi dati in YAML, puoi trasformarli temporaneamente in qualcosa di più familiare.
Ad esempio, se hai dimestichezza con elenchi di dizionari o JSON, puoi convertire YAML in JSON con solo due comandi nella shell interattiva di Python. Supponiamo che tu abbia un file YAML mydata.yaml, quindi ecco come apparirebbe:
$ 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.'}
Puoi trovare molti altri esempi su questo argomento. Inoltre, sono disponibili molti convertitori online e parser locali. Quindi non esitate a riformattare i dati quando vedete solo un miscuglio incomprensibile.
4. Leggi le specifiche
Tornando a YAML dopo una lunga pausa, è utile visitare
5. Pseudo-configurazioni
Quando si scrive un libro o un articolo è sempre utile abbozzare prima uno schema preliminare, almeno sotto forma di sommario. È lo stesso con YAML. Molto probabilmente, hai un'idea di quali dati devono essere scritti in un file YAML, ma non capisci veramente come collegarli tra loro. Pertanto, prima di scolpire YAML, disegna uno pseudo-config.
La pseudo-config è simile allo pseudo-codice, in cui non devi preoccuparti della struttura o del rientro, delle relazioni genitore-figlio, dell'ereditarietà e della nidificazione. Qui è lo stesso: disegni iterazioni dei dati man mano che ti vengono in mente.
Elenco pseudo-configurazione dei programmatori (Martin e Tabitha) e le loro competenze (linguaggi di programmazione: Python, Perl, Pascal e Lisp, Fortran, Erlang, rispettivamente).
Dopo aver disegnato una pseudo-config su un pezzo di carta, analizzala attentamente e, se è tutto in ordine, formattala sotto forma di file YAML valido.
6. Il dilemma delle tabulazioni e degli spazi
Dovrai risolvere il dilemma
In qualsiasi normale editor di testo, puoi configurare le tabulazioni con correzione automatica su un numero specificato di spazi, in modo che la ribellione dei principali aderenti Linguetta non devi avere paura.
Come sa bene ogni odiatore di YAML, non puoi vedere la differenza tra schede e spazi sullo schermo. E quando qualcosa non è visibile, di solito è l'ultima cosa che le persone ricordano, dopo aver esaminato, controllato ed eliminato tutti gli altri possibili problemi. Un’ora trascorsa a cercare una curva di tabulazione o un blocco di spazi significa semplicemente che è necessario creare urgentemente una politica per l’uso dell’uno o dell’altro, e poi implementare un controllo in cemento armato per verificarne il rispetto (ad esempio, attraverso un hook Git per forzarlo attraverso un linter).
7. Meno è di più (o più è di meno)
Ad alcune persone piace scrivere in YAML perché enfatizza la struttura. Allo stesso tempo, utilizzano attivamente il rientro per evidenziare blocchi di dati. Questa è una specie di truffa per imitare i linguaggi di markup che utilizzano delimitatori espliciti.
Ecco un esempio di tale struttura 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 li aiuta a sistemare la struttura YAML nelle loro teste, per altri, al contrario, li irrita con molti rientri non necessari, a loro avviso.
Ma se sei il proprietario del documento YAML e sei responsabile della sua manutenzione, allora tu e solo tu deve definire come utilizzare il rientro. Se sei infastidito dall'ampio riempimento, mantienilo al minimo possibile secondo le specifiche YAML. Ad esempio, il file sopra della documentazione Ansible può essere riscritto in questo modo senza alcuna perdita:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Usa spazi vuoti
Se ripeti costantemente gli stessi errori quando compili un file YAML, ha senso inserirvi un modello come commento. La prossima volta potrai semplicemente copiare questo modello e inserire lì 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. Usa qualcosa di diverso
Se l'applicazione non ha una stretta mortale su di te, potrebbe valere la pena cambiare lo YAML in un formato diverso. Con il passare del tempo, i file di configurazione possono diventare troppo grandi e quindi è meglio convertirli in semplici script in Lua o Python.
YAML è una cosa fantastica che molte persone amano per il suo minimalismo e semplicità, ma non è l'unico strumento nel tuo arsenale. Quindi a volte puoi rifiutarlo. Le librerie di analisi sono facili da trovare per YAML, quindi se offri opzioni di migrazione semplici, i tuoi utenti sopravvivranno a questo fallimento in modo relativamente indolore.
Se non puoi fare a meno di YAML, segui questi 10 suggerimenti e supera la tua antipatia per YAML una volta per tutte!
Fonte: habr.com