Rendez YAML aussi simple qu’il y paraît

Si vous avez déjà essayé d’écrire YAML, vous avez peut-être d’abord été satisfait de son apparence apparemment facile. À première vue, le YAML qui est souvent utilisé pour les fichiers de configuration, les playbooks Ansible et les bases de données de fichiers plats semble plus ou moins aussi intuitif qu’une liste de courses. Cependant, il y a beaucoup de nuances dans la structure de YAML, et elle cache un dangereux secret : YAML est en fait un langage très précis, structuré et étonnamment strict. La bonne nouvelle est que vous n’avez besoin de comprendre que deux choses pour savoir comment fonctionne YAML.
La vérité à propos de YAML est qu’il n’y a que deux structures de données dans YAML : les séquences et les mappages. Ce sont deux noms fantaisistes pour représenter ce que vous découvrirez sont des concepts très familiers. Cet article les explique tous les deux, et plus important encore, comment ils fonctionnent ensemble pour faire de YAML un moyen puissant de représenter les données qui vous intéressent.
Qu’est-ce qu’une séquence YAML ?
Une séquence YAML est une liste. Dans sa forme la plus simple, il y a un élément par ligne, chaque ligne commençant par un tiret et un espace.
Voici un exemple :
Different languages have different ways of representing this kind of data. In Python, for example, the same list can be written as ['Linux', 'BSD', 'Illumos']
. When you write a list in real life, for instance before you go shopping for groceries, you probably approximate a YAML sequence.
What’s a YAML mapping?
A YAML mapping is a key term combined with a definition for that term. A mapping in other languages is called a key and value pair or a dictionary.
Here’s an example:
---
Kernel: Linux
CPU: AMD
RAM: '16 GB'
Différentes langues ont différentes manières de représenter ce type de données. En Python, par exemple, les mêmes données peuvent être écrites comme {"Kernel": "Linux", "CPU": "AMD", "RAM": "16 GB"}
. Dans la vraie vie, vous pouvez utiliser ce type de structure pour planifier, par exemple, une soirée de jeux avec des amis. Un ami s’inscrit pour apporter des collations, un autre s’inscrit pour apporter un jeu de cartes, un autre un jeu de société, etc.
Peignage des séquences et des mappages
Vous connaissez maintenant la syntaxe de YAML. Les séquences et les mappages sont les deux seuls types de blocs de construction disponibles dans YAML, et tout ce que vous souhaitez représenter dans YAML peut être placé dans une séquence ou un mappage.
Ou les deux!
Oui, les séquences et les mappages peuvent être combinés et imbriqués, ce qui est l’une des raisons pour lesquelles YAML semble souvent intuitif et pourtant complexe à la fois. Cependant, il n’y a que quatre combinaisons possibles, et une fois que vous apprenez à les voir, YAML commence à se sentir aussi simple qu’il y paraît.
Séquences de mappage
Lorsque vous voulez qu’un terme clé ait plusieurs valeurs, vous utilisez un mappage de séquences. Autrement dit, vous commencez par un mappage (clés), mais vous insérez une liste pour les valeurs :
---
Linux:
- Fedora
- Slackware
BSD:
- FreeBSD
- NetBSD
Dans cet exemple de code, Linux est la première clé, et sa valeur est une séquence, qui contient Feutre et Slackware. La deuxième clé est BSD, qui a une valeur d’une séquence contenant FreeBSD et NetBSD.
Cartographie des mappages
Lorsque vous voulez qu’un terme clé ait des valeurs qui ont elles-mêmes à la fois des clés et des valeurs, vous utilisez un mappage de mappages. C’est-à-dire que vous commencez avec un mappage (clés), mais vous insérez un autre mappage pour les valeurs.
Celui-ci peut être trompeur, mais il révèle pourquoi une terminologie spéciale est utilisée dans YAML : ce n’est pas parce que vous créez une liste de mappages que vous avez créé un séquence. Voici une cartographie des mappages :
---
Desktop:
CPU: RISC-V
RAM: '32 GB'
Laptop:
CPU: AMD
RAM: '16 GB'
Pour la plupart des gens, cela ressemble à une liste. Et techniquement, c’est une liste. Mais il est important de reconnaître qu’il est ne pas une séquence YAML. C’est un mappage, qui contient des mappages. Étant un quasi-expert en YAML, vous pouvez repérer la différence par rapport au manque flagrant de tirets.
De toutes les constructions des playbooks Ansible, je trouve que celle-ci trompe le plus les gens. En tant qu’humains, nous aimons les listes, et quand nous voyons une structure de données qui est littéralement une liste, la plupart des gens sont obligés de la traduire en une séquence YAML. Mais en YAML, bien qu’une séquence soit une liste, une liste n’est pas toujours une séquence.
Séquence de séquences
Tout comme vous pouvez imbriquer des mappages, vous pouvez imbriquer une séquence dans une séquence :
---
- [Linux, FreeBSD, Illumos]
- [YAML, XML, JSON]
C’est probablement la structure de données la moins courante que je rencontre dans les utilisations réelles de YAML, mais parfois vous avez besoin d’une liste de listes.
Séquence de mappages
Vous pouvez également créer une séquence contenant des mappages. Ce n’est pas très courant pour la façon dont les humains trient les données, mais pour les ordinateurs, cela peut être une construction importante.
Voici un exemple :
---
-
CPU: AMD
RAM: '16 GB'
-
CPU: Intel
RAM: '16 GB'
Comme YAML, c’est peut-être la syntaxe la moins intuitive. Je trouve cela plus clair lorsqu’il est rendu en Python :
[{"CPU": "AMD", "RAM": "16 GB"}, {"CPU": "Intel", "RAM": "16 GB"}]
Les crochets représentent une structure de liste et la liste contient deux dictionnaires. Chaque dictionnaire contient des paires clé et valeur.
Construire un meilleur YAML
Vous connaissez maintenant les deux composants de YAML et comment ils peuvent être combinés pour représenter des structures de données complexes. La question est : qu’allez-vous construire avec YAML ?
J’utilise YAML, comme beaucoup de gens, pour les playbooks Ansible. Je l’ai également utilisé comme format de configuration facile, comme feuille de personnage pour D&D, comme représentation d’une structure de répertoires requise pour l’organisation du projet, et bien plus encore. Tant que vous vous familiarisez avec les concepts de séquences et de mappages, vous trouverez peut-être que YAML est un format facile à écrire, à lire et (à condition de disposer de la bonne bibliothèque) à analyser.
Si vous travaillez souvent avec YAML, téléchargez notre Aide-mémoire YAML pour vous aider à visualiser les structures de données de base et leurs combinaisons et pour vous aider à vous souvenir de certaines des conventions syntaxiques supplémentaires à votre disposition. Avec un peu de pratique, vous constaterez que YAML est vraiment aussi simple qu’il y paraît !