GNU/Linux >> Linux Esercitazione >  >> Linux

YAML per principianti

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 (BakeryCheesemonger ), 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!


      Linux
      1. MX Linux 17:una distribuzione aggiornata pensata per i principianti

      2. Comando dir Linux per principianti (10 esempi)

      3. Comando killall Linux per principianti (8 esempi)

      4. Esempi di comandi DNF per principianti

      5. Comprendere YAML per Ansible

      16 Esempi pratici di comando Linux LS per principianti

      Spiegazione del comando Linux mv per principianti (8 esempi)

      Bash Scripting Tutorial per principianti

      Oltre 20 comandi FFmpeg per principianti

      Bash Heredoc Tutorial per principianti

      Spiegazione della struttura della directory di Linux per i principianti