YAML n'est pas un langage de balisage (YAML), et au fur et à mesure des formats de configuration, c'est agréable à regarder. Sa structure visuelle est intuitive et sa logique est assez simple :les puces en retrait héritent des propriétés des puces parentes.
Mais cette apparente simplicité peut être trompeuse.
Il est facile (et trompeur) de considérer YAML comme une simple liste de valeurs associées, pas plus complexe qu'une liste de courses. Il y a un titre et quelques éléments en dessous. Les éléments sous le titre s'y rapportent directement, n'est-ce pas ? Eh bien, vous pouvez tester cette théorie en écrivant un peu de YAML valide.
Ouvrez un éditeur de texte et saisissez ce texte en conservant les tirets en haut du fichier et les espaces de tête pour les deux derniers éléments :
---
Store: Bakery
Sourdough loaf
Bagels
Enregistrez le fichier sous example.yaml (ou similaire).
Si vous n'avez pas encore yamllint
installé, installez-le :
$ sudo dnf install -y yamllint
Un linter est une application qui vérifie la syntaxe d'un fichier. Le yamllint
est un excellent moyen de s'assurer que votre YAML est valide avant de le transmettre à l'application pour laquelle vous écrivez YAML (Ansible, par exemple).
Utilisez yamllint
pour valider votre fichier YAML :
$ yamllint --strict shop.yaml || echo “Fail”
$
Mais lorsqu'il est converti en JSON avec un simple script de conversion, la structure de données de ce simple YAML devient plus claire :
$ ~/bin/json2yaml.py shop.yaml
{“Store”: “Bakery Sourdough loaf Bagels”}
Analysée sans le contexte visuel des sauts de ligne et de l'indentation, la portée réelle de vos données est très différente. Les données sont pour la plupart plates, presque dépourvues de hiérarchie. Rien n'indique que le pain au levain et les bagels soient des enfants du nom du magasin.
[ Les lecteurs ont également aimé : Ansible :l'automatisation informatique pour tous ]
Comment les données sont stockées dans YAML
YAML peut contenir différents types de blocs de données :
- Séquence :valeurs répertoriées dans un ordre spécifique. Une séquence commence par un tiret et un espace (
-
). Vous pouvez considérer une séquence comme une liste Python ou un tableau dans Bash ou Perl. - Mappage :paires de clé et de valeur. Chaque clé doit être unique et l'ordre n'a pas d'importance. Pensez à un dictionnaire Python ou à une affectation de variable dans un script Bash.
Il existe un troisième type appelé scalar
, qui sont des données arbitraires (encodées en Unicode) telles que des chaînes, des entiers, des dates, etc. En pratique, ce sont les mots et les chiffres que vous tapez lors de la création de blocs de mappage et de séquence, vous n'y penserez donc pas plus que vous ne réfléchirez aux mots de votre langue maternelle.
Lors de la construction de YAML, il peut être utile de considérer YAML soit comme une séquence de séquences, soit comme une carte de cartes, mais pas les deux.
Blocs de mappage YAML
Lorsque vous démarrez un fichier YAML avec une instruction de mappage, YAML attend une série de mappages. Un bloc de mappage dans YAML ne se ferme pas tant qu'il n'est pas résolu, et un nouveau bloc de mappage est explicitement créé. Un nouveau bloc ne peut être créé soit en augmentant le niveau d'indentation (auquel cas, le nouveau bloc existe à l'intérieur du bloc précédent) ou en résolvant le mappage précédent et en commençant un bloc de mappage adjacent.
La raison pour laquelle l'exemple YAML original de cet article ne parvient pas à produire des données avec une hiérarchie est qu'il ne s'agit en fait que d'un seul bloc de données :la clé Store
a une valeur unique de Bakery Sourdough loaf Bagels
. YAML ignore l'espace car aucun nouveau bloc de mappage n'a été démarré.
Est-il possible de corriger l'exemple YAML en faisant précéder chaque élément de séquence d'un tiret et d'un espace ?
---
Store: Bakery
- Sourdough loaf
- Bagels
Encore une fois, c'est du YAML valide, mais c'est quand même assez plat :
$ ~/bin/json2yaml.py shop.yaml
{“Store”: “Bakery - Sourdough loaf - Bagels”}
Le problème est que ce fichier YAML ouvre un bloc de mappage et ne le ferme jamais. Pour fermer le Store
bloquer et en ouvrir un nouveau, vous devez commencer un nouveau mappage. La valeur du mappage peut être une séquence, mais vous avez besoin d'une clé d'abord.
Voici la résolution correcte (et étendue) :
---
Store:
Bakery:
- ‘Sourdough loaf’
- ‘Bagels’
Cheesemonger:
- ‘Blue cheese’
- ‘Feta’
Dans JSON, cela se résout en :
{“Store”: {“Bakery”: [“Sourdough loaf”, “Bagels”],
“Cheesemonger”: [“Blue cheese”, “Feta”]}}
Comme vous pouvez le voir, cette directive YAML contient un mappage (Store
) à deux valeurs enfants (Bakery
et Cheesemonger
), chacune étant mappée à une séquence enfant.
Blocs de séquence YAML
Les mêmes principes s'appliquent si vous démarrez une directive YAML en tant que séquence. Par exemple, cette directive YAML est valide :
Flour
Water
Salt
Chaque élément est distinct lorsqu'il est affiché au format JSON :
[“Flour”, “Water”, “Salt”]
Mais ce fichier YAML n'est pas valide car il tente de démarrer un bloc de mappage à un niveau adjacent à un bloc de séquence :
---
- Flour
- Water
- Salt
Sugar: caster
Il peut être réparé en déplaçant le bloc de mappage dans la séquence :
---
- Flour
- Water
- Salt
- Sugar: caster
Vous pouvez, comme toujours, intégrer une séquence dans votre élément de mappage :
---
- Flour
- Water
- Salt
- Sugar:
- caster
- granulated
- icing
Vu sous l'angle de la portée JSON explicite, cet extrait YAML se lit comme suit :
[“Flour”, “Salt”, “Water”, {“Sugar”: [“caster”, “granulated”, “icing”]}]
[ Un guide gratuit de Red Hat :5 étapes pour automatiser votre entreprise. ]
Syntaxe YAML
Si vous souhaitez écrire confortablement en YAML, il est essentiel de connaître sa structure de données. Comme vous pouvez le constater, il n'y a pas grand-chose à retenir. Vous connaissez la cartographie et séquence blocs, afin que vous sachiez tout ce dont vous avez besoin pour travailler. Il ne reste plus qu'à se rappeler comment ils interagissent et comment ils interagissent les uns avec les autres. Bon codage !