Les bases de YAML
YAML est un format de données délimité par l’indentation, standardisé sous le nom de YAML 1.2 et pensé pour des fichiers de configuration que des humains écrivent et que des programmes lisent. L’imbrication vient des espaces plutôt que des accolades, les scalaires nus reçoivent leur type par inférence, et les commentaires commencent par #. Ces trois commodités provoquent presque tous les bugs YAML du monde réel ; ce guide enseigne donc règles et pièges ensemble.
Les bases de YAML en clair
YAML est le format dans lequel la configuration arrive. Les manifests Kubernetes, les workflows GitHub Actions, les fichiers docker-compose et les playbooks Ansible sont tous du YAML : des maps imbriquées écrites avec des espaces, des listes écrites avec des tirets, et guère un crochet à l’horizon. Le nom signifiait à l’origine Yet Another Markup Language ; les auteurs l’ont ensuite reformulé en YAML Ain’t Markup Language — la lecture la plus exacte, puisqu’il décrit des données, pas des documents.
Le standard actuel est YAML 1.2 (2009), et son changement le plus important est discret : la 1.1 typait les mots nus yes, no, on et off comme des booléens, la 1.2 ne le fait plus. La plupart des logiciels chargent encore les règles 1.1 par défaut, si bien que la même ligne de texte peut signifier des choses différentes selon l’outil. YAML 1.2 a aussi rendu presque tous les documents JSON valides en YAML — la façon la plus propre de résumer la grammaire en une phrase.
Ce guide couvre ce dont un débutant a besoin — règles d’indentation, typage des scalaires, guillemets, blocs scalaires, ancres et commentaires — et se termine par la liste exacte de ce que les convertisseurs de ce site acceptent et refusent. Tout s’exécute dans votre navigateur, rien n’est envoyé : les exemples peuvent donc être collés et manipulés sans risque.
Comme YAML 1.2 traite la plupart des documents JSON comme du YAML valide, toute config que vous pouvez réduire à des accolades bénéficie immédiatement d’un outil : collez-la dans le formateur JSON et il la formatera, la validera et signalera la ligne et la colonne exactes de chaque erreur de syntaxe.
Quand un fichier tout neuf pourrait honnêtement passer par les deux formats, la comparaison JSON vs YAML résume les compromis dans une table de décision et vous dit quel format chaque type de document réclame.
L’indentation est la syntaxe
Dans YAML, les espaces ne sont pas de la décoration — elles sont toute la structure. Un mapping, c’est une clé, un deux-points, une espace, puis une valeur ; une valeur imbriquée s’écrit à la ligne suivante, plus indentée, et deux lignes de même indentation sont sœurs. Les tabulations y sont purement et simplement interdites : la spécification ne parvient pas à se décider sur la largeur d’une tabulation, alors les parseurs les rejettent au lieu de deviner. Les éditeurs n’arrêtent pas d’insérer des tabulations au copier-coller, et voilà pourquoi tant de fichiers ont l’air parfaits et refusent de se parser.
La convention est de deux espaces par niveau. Quatre ou six sont tout aussi valables — la spécification n’interdit que les tabulations — mais deux, c’est ce qu’utilisent Kubernetes et Compose, ce qu’attend chaque linter et ce qui évite aux manifests profonds de défiler sur le côté. Mélanger les largeurs dans un même fichier, c’est ainsi que naissent les erreurs d’indentation ; choisissez donc deux espaces et laissez l’éditeur veiller au respect.
- Un niveau = un nombre fixe d’espaces, au choix ; deux est la convention.
- Les tabulations dans l’indentation sont rejetées par les parseurs, pas converties.
- Un élément de séquence peut se placer à l’indentation de sa clé parente — le tiret fait office de marqueur.
- Les valeurs peuvent aussi s’écrire en ligne, en style flow : ports: [8080].
Un mapping imbriqué avec une séquence
services:
web:
image: nginx:1.27
ports:
- "8080:80"
cache:
image: redis:7L'arbre que construit un parseur
services ├─ web │ ├─ image: "nginx:1.27" │ └─ ports: ["8080:80"] └─ cache └─ image: "redis:7"
Les scalaires et le problème de la Norvège
Les valeurs entre guillemets sont des chaînes, toujours. Les valeurs nues sont typées par inférence, et c’est de cette inférence que vient la réputation de YAML : un 8080 nu devient le nombre 8080 et une valeur vide devient null, ce qui aide — jusqu’à ce que l’inférence type quelque chose que vous pensiez comme du texte, un code pays ou une chaîne de version par exemple.
L’échec classique, c’est la liste de codes pays ISO dans laquelle NO — la Norvège — se parse en booléen false : le problème de la Norvège, drôle jusqu’à ce qu’il désactive en silence un drapeau de déploiement. La version 1.1 allait bien plus loin, comme le montre le tableau. Le schéma cœur de la 1.2 ne résout que true et false comme booléens et lit le reste du tableau ci-dessous comme des chaînes ordinaires ou des nombres décimaux — mais comme tant de logiciels déployés appliquent encore les règles 1.1, l’habitude défensive consiste à mettre entre guillemets tout ce qui doit rester une chaîne.
| Vous avez écrit | YAML 1.1 l’interprète comme | Le schéma cœur de YAML 1.2 l’interprète comme |
|---|---|---|
| no | le booléen false | la chaîne « no » |
| on / off | les booléens true / false | les chaînes « on » / « off » |
| 12:30 | l’entier 750 (sexagésimal) | la chaîne « 12:30 » |
| 0640 | l’entier 416 (octal) | l’entier 640 (décimal) |
| 2026-09-19 | un objet date | la chaîne « 2026-09-19 » |
| ~ | null | null |
Guillemets et blocs scalaires
YAML propose trois façons d’écrire une chaîne. Sans guillemets, c’est le défaut, et cela convient à la plupart des valeurs. Les guillemets simples sont littéraux — la seule échappatoire consiste à doubler le guillemet ('it''s fine'). Les guillemets doubles acceptent les échappements par antislash tels que \n et \t, le style qu’emploie JSON. La règle défensive se transmet : si une valeur contient quoi que ce soit qui pourrait passer pour de la structure — deux-points, dièses, mots réservés — mettez-la délibérément entre guillemets.
Le texte multiligne passe par les blocs scalaires. Un bloc littéral, écrit |, conserve chaque retour à la ligne exactement comme tapé — la forme qui convient aux scripts shell et aux certificats. Un bloc plié, écrit >, réunit les lignes en un seul paragraphe fluide — la forme qui convient à une longue description. Tous deux acceptent un indicateur de chomping : |- supprime le retour à la ligne final, |+ garde tous ceux de la fin, et | seul en garde exactement un.
Deux styles de blocs scalaires
script: | set -e make build make deploy summary: > Deploys finish in under a minute.
Ce que résolvent les scalaires
script: "set -e\nmake build\nmake deploy\n" summary: "Deploys finish in under a minute.\n"
Ancres, alias et réutilisation
YAML permet à un nœud de porter un nom que d’autres nœuds référencent. Écrivez &name après une clé pour ancrer sa valeur ; écrivez *name n’importe où ailleurs pour en faire un alias, et le parseur substitue une copie du nœud ancré. Des jobs qui partagent une même politique de réessai pointent alors vers une définition unique, et la modification n’a à être faite qu’une fois.
Deux extensions s’appuient sur ce mécanisme. Les clés de fusion, écrites <<: *name, injectent chaque clé d’un mapping ancré dans le mapping courant — monnaie courante dans les fichiers Compose et Ansible, et convention de l’ère 1.1 qui n’a jamais intégré la grammaire cœur de la 1.2. Les ancres peuvent aussi être détournées : des alias imbriqués dans des alias permettent à dix définitions de s’étendre en un million de nœuds — l’attaque billion-laughs — aussi les parseurs dignes de confiance plafonnent-ils l’expansion et signalent-ils le plafond au lieu de se figer.
Une ancre et deux alias
defaults: &base retries: 3 timeout: 30s staging: retries: 3 timeout: 30s log: *base
Ce que reçoit le consommateur
defaults: { retries: 3, timeout: "30s" }
log alias: { retries: 3, timeout: "30s" } (staging.log)Commentaires et documents multiples
Les commentaires commencent par # et courent jusqu’à la fin de la ligne ; un dièse à l’intérieur d’une chaîne entre guillemets ne compte pas. C’est le plus grand avantage ergonomique de YAML sur JSON, qui a supprimé les commentaires par conception, et la raison pour laquelle la config tenue par des humains gravite ici : le fichier s’explique en ligne, et les revues citent une ligne et son commentaire dans un même hunk de diff.
Un même fichier peut aussi contenir plusieurs documents, séparés par des lignes de trois tirets ; un --- en tête est le marqueur de début optionnel et ... termine un document. C’est ainsi qu’un seul artefact embarque côte à côte une config de staging et une config de production. Les convertisseurs de ce site parsent chaque document et opèrent sur le dernier, à l’image du comportement des CLI courantes.
Deux documents, un fichier
env: staging region: eu-1 --- env: production region: us-2
Ce qu'utilisent les convertisseurs
env: production region: us-2 (the last document)
Ce que les convertisseurs de ce site acceptent
Chaque parseur YAML est le parseur d’un sous-ensemble — la grammaire 1.2 complète est célèbre pour sa taille — et un convertisseur mérite la confiance en déclarant son sous-ensemble au lieu de vous laisser le découvrir par l’échec. La bibliothèque YAML de ce site implémente le schéma cœur de la 1.2 sur les constructions block et flow qui apparaissent dans les vrais fichiers de configuration, avec des limites délibérées là où la spécification autorise un travail sans bornes. Le tableau tient lieu de contrat.
| Fonctionnalité | Statut ici | Comportement |
|---|---|---|
| Mappings et séquences block | Accepté | Imbrication à toute profondeur, deux espaces ou toute indentation cohérente |
| Style flow [1, 2] et {a: 1} | Accepté | Y compris des documents JSON entiers collés tels quels |
| Commentaires et scalaires entre guillemets | Accepté | Les deux styles de guillemets, tous les styles de blocs scalaires |
| Tabulations dans l’indentation | Refusé | Rejet avec le numéro de la ligne fautive |
| Clés explicites (? key) | Refusé | Aucun équivalent JSON — les clés JSON doivent être des chaînes |
| Clés de fusion (<<) | Refusé | Développez la fusion à la main, ou faites un alias direct sur les valeurs |
| Directive %YAML 1.1 | Avertissement | Le schéma cœur de la 1.2 est appliqué ; yes et no restent des chaînes |
| Documents multiples | Parsé | Les convertisseurs opèrent sur le dernier document |
| Expansion des alias | Plafonnée | Les chaînes d’alias profondes sont plafonnées et signalées, jamais déroulées |
Questions fréquentes
Mon YAML est-il envoyé quand j’utilise ces convertisseurs ?
Non. Chaque convertisseur de ce site s’exécute en JavaScript dans votre onglet ; il n’y a ni étape d’envoi ni backend pour en recevoir. Vérifiez-le dans les DevTools : ouvrez le panneau Network, convertissez un fichier et regardez la liste des requêtes rester vide. La Content-Security-Policy du site bloque aussi les connexions sortantes des scripts de la page.
Pourquoi mon fichier refuse-t-il de se parser alors qu’il a l’air correct ?
Trois coupables couvrent la plupart des cas : une tabulation cachée dans l’indentation (les parseurs refusent les tabulations sans appel), un vestige de la 1.1 comme un no nu ou une clé de fusion qu’un parseur 1.2 refusera de deviner, ou un scalaire sans guillemets que l’inférence a typé en quelque chose que vous n’aviez pas voulu. Un bon convertisseur nomme la ligne ; celui de ce site le fait.
YAML est-il un sur-ensemble de JSON ?
Dans YAML 1.2, essentiellement oui : un document JSON avec ses accolades et ses crochets intacts se parse en YAML sans modification. L’inverse n’est jamais vrai. Commentaires, ancres, clés nues, blocs scalaires multilignes et documents multiples dans un même fichier n’ont pas de représentation JSON, si bien que convertir du YAML en JSON est une porte à sens unique pour tout fichier qui les utilise.
Comment éviter le problème de la Norvège ?
Mettez entre guillemets tout scalaire dont le type vous importe. Un NO nu se parse en booléen false sous les règles de la 1.1, et on, off, yes et no suivent le même sort ; le schéma cœur de la 1.2 les garde en chaînes, mais bien des logiciels déployés chargent encore la 1.1. Quoter codes pays, feature flags et chaînes de version est l’habitude au coût nul.
Vaut-il mieux utiliser des ancres ou simplement répéter les valeurs ?
Répétez les valeurs quand les copies risquent de diverger ; ancrez-les et aliasez-les quand elles sont réellement un fait unique défini une seule fois. Les ancres gardent la config DRY mais coûtent en lisibilité locale — le lecteur doit sauter à la définition. Les clés de fusion sont la partie la moins portable : beaucoup de parseurs, dont les convertisseurs de ce site, les refusent plutôt que de deviner l’ordre d’injection.
Deux espaces ou quatre espaces pour l’indentation YAML ?
Les deux sont valables — la spécification interdit les tabulations, pas un nombre d’espaces en particulier — aussi s’agit-il de convention, pas de correction. Deux espaces ont gagné : Kubernetes et Compose les utilisent, chaque linter en fait son défaut, et l’imbrication profonde reste lisible. Ce qui compte, c’est de ne jamais mélanger les largeurs dans un même fichier.
Où puis-je lire les normes citées ici ?
Quels outils liés devriez-vous utiliser ensuite ?
- Qu’est-ce que le JSONGuide en langage clairOuvrir
- JSON vs YAMLComparatif point par pointOuvrir
- Formater du JSONIndente, trie les clés et supprime les commentairesOuvrir
- Syntaxe des expressions cronGuide en langage clairOuvrir
- Décoder une expression cronLit une planification et montre quand elle se déclencheOuvrir
- Outils texteComparez, convertissez et remaniez du texte brut et du code.Ouvrir