YAML non è un linguaggio di markup (YAML) e per quanto riguarda i formati di configurazione, è facile per gli occhi. Ha una struttura visiva intuitiva e la sua logica è piuttosto semplice:i punti elenco rientrati ereditano le proprietà dei punti elenco padre.
Ma questa apparente semplicità può ingannare.
È facile (e fuorviante) pensare a YAML solo come un elenco di valori correlati, non più complesso di una lista della spesa. C'è un'intestazione e alcuni elementi sotto di essa. Gli elementi sotto il titolo si riferiscono direttamente ad esso, giusto? Bene, puoi testare questa teoria scrivendo un po' di YAML valido.
Apri un editor di testo e inserisci questo testo, mantenendo i trattini nella parte superiore del file e gli spazi iniziali per gli ultimi due elementi:
---
Store: Bakery
Sourdough loaf
Bagels
Salva il file come esempio.yaml (o simile).
Se non hai già yamllint
installato, installalo:
$ sudo dnf install -y yamllint
Un linter è un'applicazione che verifica la sintassi di un file. Il yamllint
comando è un ottimo modo per assicurarti che il tuo YAML sia valido prima di consegnarlo a qualsiasi applicazione per cui stai scrivendo YAML (Ansible, per esempio).
Usa yamllint
per convalidare il tuo file YAML:
$ yamllint --strict shop.yaml || echo “Fail”
$
Ma quando viene convertito in JSON con un semplice script di conversione, la struttura dei dati di questo semplice YAML diventa più chiara:
$ ~/bin/json2yaml.py shop.yaml
{“Store”: “Bakery Sourdough loaf Bagels”}
Analizzato senza il contesto visivo delle interruzioni di riga e del rientro, l'ambito effettivo dei dati appare molto diverso. I dati sono per lo più piatti, quasi privi di gerarchia. Non vi è alcuna indicazione che la pagnotta e i bagel con lievito naturale siano figli del nome del negozio.
[ Ai lettori è piaciuto anche: Ansible:IT automation per tutti ]
Come vengono archiviati i dati in YAML
YAML può contenere diversi tipi di blocchi di dati:
- Sequenza:valori elencati in un ordine specifico. Una sequenza inizia con un trattino e uno spazio (
-
). Puoi pensare a una sequenza come a un elenco Python o a un array in Bash o Perl. - Mappatura:coppie chiave e valore. Ogni chiave deve essere univoca e l'ordine non ha importanza. Pensa a un dizionario Python oa un'assegnazione di variabile in uno script Bash.
Esiste un terzo tipo chiamato scalar
, che sono dati arbitrari (codificati in Unicode) come stringhe, numeri interi, date e così via. In pratica, queste sono le parole e i numeri che digiti durante la creazione di blocchi di mappatura e sequenza, quindi non ci penserai più di quanto rifletti sulle parole della tua lingua madre.
Quando si costruisce YAML, potrebbe essere utile pensare a YAML come a una sequenza di sequenze oa una mappa di mappe, ma non entrambe.
Blocchi di mappatura YAML
Quando avvii un file YAML con un'istruzione di mappatura, YAML prevede una serie di mappature. Un blocco di mappatura in YAML non si chiude finché non viene risolto e viene creato in modo esplicito un nuovo blocco di mappatura. Un nuovo blocco può essere creato solo o aumentando il livello di indentazione (in tal caso, il nuovo blocco esiste all'interno del blocco precedente) o risolvendo la mappatura precedente e avviando un blocco di mappatura adiacente.
Il motivo per cui l'esempio YAML originale in questo articolo non riesce a produrre dati con una gerarchia è che in realtà è un solo blocco di dati:la chiave Store
ha un unico valore di Bakery Sourdough loaf Bagels
. YAML ignora lo spazio bianco perché non è stato avviato alcun nuovo blocco di mappatura.
È possibile correggere l'esempio YAML anteponendo a ogni elemento della sequenza un trattino e uno spazio?
---
Store: Bakery
- Sourdough loaf
- Bagels
Ancora una volta, questo è YAML valido, ma è ancora piuttosto piatto:
$ ~/bin/json2yaml.py shop.yaml
{“Store”: “Bakery - Sourdough loaf - Bagels”}
Il problema è che questo file YAML apre un blocco di mappatura e non lo chiude mai. Per chiudere il Store
bloccare e aprirne uno nuovo, è necessario avviare una nuova mappatura. Il valore della mappatura può essere una sequenza, ma è necessaria una chiave prima.
Ecco la risoluzione corretta (e ampliata):
---
Store:
Bakery:
- ‘Sourdough loaf’
- ‘Bagels’
Cheesemonger:
- ‘Blue cheese’
- ‘Feta’
In JSON, questo si risolve in:
{“Store”: {“Bakery”: [“Sourdough loaf”, “Bagels”],
“Cheesemonger”: [“Blue cheese”, “Feta”]}}
Come puoi vedere, questa direttiva YAML contiene una mappatura (Store
) su due valori figlio (Bakery
e Cheesemonger
), ognuno dei quali è mappato a una sequenza figlio.
Blocchi sequenza YAML
Gli stessi principi valgono se si avvia una direttiva YAML come sequenza. Ad esempio, questa direttiva YAML è valida:
Flour
Water
Salt
Ogni elemento è distinto se visualizzato come JSON:
[“Flour”, “Water”, “Salt”]
Ma questo file YAML non valido perché tenta di avviare un blocco di mappatura a un livello adiacente a un blocco sequenza :
---
- Flour
- Water
- Salt
Sugar: caster
Può essere riparato spostando il blocco di mappatura in la sequenza:
---
- Flour
- Water
- Salt
- Sugar: caster
Come sempre, puoi incorporare una sequenza nel tuo elemento di mappatura:
---
- Flour
- Water
- Salt
- Sugar:
- caster
- granulated
- icing
Visto attraverso la lente dell'ambito JSON esplicito, lo snippet YAML si legge così:
[“Flour”, “Salt”, “Water”, {“Sugar”: [“caster”, “granulated”, “icing”]}]
[ Una guida gratuita di Red Hat:5 passaggi per automatizzare il tuo business. ]
Sintassi YAML
Se vuoi scrivere comodamente YAML, è fondamentale essere a conoscenza della sua struttura dei dati. Come puoi vedere, non c'è molto da ricordare. Conosci la mappatura e sequenza blocchi, quindi sai tutto ciò di cui hai bisogno per lavorare. Non resta che ricordare come fanno e non interagiscono tra loro. Buona codifica!