Aller au contenu principal

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.

100 % local

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:7

L'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 écritYAML 1.1 l’interprète commeLe schéma cœur de YAML 1.2 l’interprète comme
nole booléen falsela chaîne « no »
on / offles booléens true / falseles chaînes « on » / « off »
12:30l’entier 750 (sexagésimal)la chaîne « 12:30 »
0640l’entier 416 (octal)l’entier 640 (décimal)
2026-09-19un objet datela chaîne « 2026-09-19 »
~nullnull

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 iciComportement
Mappings et séquences blockAccepté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 guillemetsAcceptéLes deux styles de guillemets, tous les styles de blocs scalaires
Tabulations dans l’indentationRefusé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.1AvertissementLe schéma cœur de la 1.2 est appliqué ; yes et no restent des chaînes
Documents multiplesParséLes convertisseurs opèrent sur le dernier document
Expansion des aliasPlafonnéeLes 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 ?

  • YAML 1.2 — Spécification YAML, version 1.2 (révision 1.2.2)
  • YAML 1.1 — Spécification YAML, version 1.1