Formation > Blog > DevOps > Tout savoir sur les fichiers YAML en 5 minutes

tout savoir sur les Fichiers YAML

Le langage YAML (Yet Another Markup Langague) est un langage de sérialisation de données lisible par l’homme servant à écrire des fichiers de configuration. Il est populaire, car il est conçu pour être facile à comprendre par rapport à d’autres langages de programmation. Pour toutes ces raisons, il est utilisé par des logiciels comme Kubernetes ou Ansible.

Dans cet article, nous allons voir les principales caractéristiques des fichiers YAML : la syntaxe et les types de données.

Si vous souhaitez vous former au DevOps, nous vous proposons notre article sur les meilleures manières de se former au DevOps. Nous décortiquons les différents moyens vous permettant de maîtriser ce domaine.

Syntaxe YAML

Les fichiers YAML utilisent l’extension .yaml ou .yml et suivent des règles syntaxiques précises. Il faut noter que les Fichiers YAML sont un surensemble de JSON et sont compatibles.

La syntaxe YAML emprunte des fonctions issues d’autres langages de programmation comme Perl, C, XML ou HTML.

Il n’y a pas de symboles de format habituels, tels que les accolades, les crochets, les balises ou les guillemets. Les fichiers YAML sont plus simples à lire, car ils utilisent l’indentation à la Python pour déterminer la structure et indiquer l’imbrication.

Les caractères de tabulation ne sont pas autorisés afin de maintenir la portabilité entre les systèmes, et les espaces blancs sont donc utilisés à la place.

Vous pouvez rajouter des commentaires sur le fichier avec le symbole # ou le symbole livre (£). Rajouter des commentaires sur vos fichiers YAML est une bonne pratique, car ils vous permettent de préciser l’intention du code.

Trois tirets (—) indiquent un début de document et trois points (…) la fin.

Voici un exemple de fichier YAML :

# exemple de fichier YAML
---
company: AmbientIT
domain:
 - devops
tutorial:
  - yaml:
      name: "YAML Ain't Markup Language"
      type: awesome
      born: 2001
  - json:
      name: JavaScript Object Notation
      type: great
      born: 2001
  - xml:
      name: Extensible Markup Language
      type: good
      born: 1996
...

Il faut noter que la structure d’un fichier YAML est un mappage ou une liste, et qu’elle suit une hiérarchie qui dépend de l’indentation et de la façon dont vous définissez vos valeurs clés. Les mappages permettent d’associer des paires de clé-valeur. Chaque clé doit être unique à la manière d’un dictionnaire python ou une affectation de variable dans un script bash. Les clés sont suivies d’un deux-points et d’une espace, puis de sa valeur. Par exemple :

clé: valeur

Lors de l’écriture d’un fichier YAML, vous devrez respecter ce mappage et le résoudre avant de pouvoir le clôturer et en créer un nouveau. Il est possible d’établir un nouveau mappage en augmentant le niveau d’indentation. L’indentation est très importante dans les fichiers YAML puisqu’elle sert à définir la hierarchie des données. Les indentations se présentent dans le code de la manière suivante :

animal:
  name: Cat
  age: 3

On peut voir dans cet exemple que name et age sont sous animal dans la hiérarchie du code.

Les fichiers YAML peuvent contenir des scalaires qui sont des données arbitraires en unicode. Elles peuvent servir de valeur comme des chaines, des nombres ou des dates.

Il est possible de vérifier la validité d’un fichier YAML graçe aux lints. L’utilisation de la commande yamllint permet de s’assurer que le fichier est valide et prêt à être transféré vers une application.

Types de données des fichiers YAMl

Les valeurs dans YAML sont semblables à celles que l’on retrouve dans Python ou Javascript. On appelle cela des paires scalaires. Il est généralement suffisant de mettre les chaînes de caractères entre guillemets, de ne pas mettre les nombres entre guillemets et de laisser l’analyseur syntaxique s’en charger.

Key-Value et Dictionnaire

La clé-valeur est l’élément de base de YAML. Chaque élément d’un document YAML est membre d’au moins un dictionnaire. La clé est toujours une chaîne de caractère. La valeur est un scalaire qui peut être n’importe quel type de données. les dictionnaires sont des structures de données qui contiennent des paires clé-valeur. Chaque clé d’un dictionnaire est unique et est associée à une valeur. Par exemple :

user:
  name: John
  age: 30

Autres types de données

YAML prend en charge tous les types de données numériques. Un entier peut être décimal, hexadécimal ou octal.

Les chaînes YAML sont Unicode. Dans la plupart des cas, il n’est pas nécessaire de les mettre entre guillemets.

Vous entrez les nulls avec un tilde (~) ou la chaîne de caractères null non citée.

YAML indique les valeurs booléennes à l’aide des mots-clés True, On et Yes pour true. False est indiqué par False, Off ou No.

Vous pouvez spécifier des tableaux ou des listes sur une seule ligne. Vous pouvez également les placer sur plusieurs lignes.

Par exemple, vous pouvez écrire une liste de course de deux manières différente, en ligne comme ceci :

fruits: [apple, banana, orange, mango]

Ou sous forme de liste plus classique

fruits:
  - apple
  - banana
  - orange
  - mango

Les deux manières de faire fonctionnent exactement pareil et ont leurs avantages et leurs inconvénients. La liste en ligne représente un gain de place, mais celle sur plusieurs niveaux vous offre une lisibilité accrue.

YAML pour Kubernetes

Kubernetes fonctionne sur la base d’un état défini et d’un état réel. Les objets Kubernetes représentent l’état d’un cluster et indiquent à quoi vous voulez que la charge de travail ressemble. Les ressources Kubernetes, telles que les pods, les objets et les déploiements, peuvent être créées à l’aide de fichiers YAML.

Vous fournirez les informations requises à kubectl sous la forme d’un fichier YAML. Kubectl convertira le fichier en YAML pour vous lorsqu’il effectuera la demande d’API. Les fichiers de configuration Kubernetes ressemblent à ça :

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
  labels:
    app: example
spec:
  containers:
  - name: example-container
    image: example/image

ApiVersion indique la version de l’API Kubernetes utilisée pour créer l’objet. La version de l’API dépend du type d’objet. Un pod se crée en « v1 » alors qu’un deployment en « apps/v1 ».

Kind spécifie le type d’objet créé. Il existe de nombreux objets dans Kubernetes comme Pod, Service, Volume, Namespace, Deployment et d’autres.

Metadata est la section servant à décrire l’objet. Les métadonnées englobent des informations comme name, labels et annotations.

  • Name est le nom de l’objet que vous créez.
  • Labels sont des paires clé-valeur que vous pouvez attacher à vos objets pour les organiser et les sélectionner.
  • Annotations sont également des paires clé-valeur qui peuvent contenir des informations supplémentaires pour des outils et des bibliothèques.

Enfin spec est la section contenant les détails spécifiques de l’objet que vous souhaitez créer. Par exemple pour un pod, il faut spécifier les conteneurs qu’il va exécuter ou les volumes à monter.

Chaque objet dans Kubernetes a une description qui décrit les différentes propriétés que l’objet peut avoir.

YAML pour Ansible

L’utilisation des fichiers YAML dans Ansible permet d’écrire des playbook qui sont des scénarios d’automatisation décrivant l’état souhaité du système via une liste de « play ». Chaque « play » exécute une ou plusieurs taches qui sollicitent chacune un module Ansible. Les modules accomplissent leur tâche dans n’importe quel langage supportant le format JSON.

Voici un exemple de playbook Ansible:

---
- name: Example Playbook
  hosts: webservers
  tasks:
    - name: Ensure Apache is installed
      apt: 
        name: apache2
        state: present
    - name: Ensure Apache is running
      service: 
        name: apache2
        state: started
...

Dans cet exemple, nous avons un playbook avec un play. Le play est exécuté sur le groupe d’hôtes webservers et il comprend deux tâches : la première assure que le package apache2 est installé et la seconde assure que le service apache2 est en cours d’exécution.

Les playbooks Ansible sont composés de plusieurs éléments écrit en YAML :

  • Play : comme vu plus haut, un play est une unité d’exécution qui associe un groupe d’hôtes à un ensemble de tâches.
  • Hosts : vous devez définir un host sur lequel les taches seront exécutées pour chaque play.
  • Tasks : ce sont des actions que vous souhaitez exécuter. Chaque tache appelle un module, une unité de code effectuant une action spécifique.
  • Variables : les variables sont utilisées pour définir et réutiliser des valeurs dans votre playbook. Les variables peuvent être définies à tous les niveaux du fichier.
  • Handlers : ce sont des tâches spéciales déclenchées par un changement.
  • Rôles : les rôles sont utilisés pour grouper des tâches, des handlers, des fichiers et des templates liés à un objectif spécifique dans une structure de dossier standard.
  • Templates : Ansible utilise jinja2 pour générer des fichiers à partir de modèles.

Dans un code YAML dans Ansible cela se présente sous cette forme :

---
- hosts: target
  vars:
    variable1: valeur1
    variable2: valeur2
  tasks:
    - name: Nom de la tâche
      module:
        key1: value1
        key2: value2
  handlers:
    - name: Nom du gestionnaire
      module:
        key1: value1
        key2: value2
...

Dans Ansible, un module est une unité de code qu’Ansible exécute sur chaque nœud cible. Ansible est fournis avec une grande collection de modules intégrés pour gérer divers aspects des systèmes, tels que l’installation de packages (apt, yum), la gestion des services (service, systemd), et la gestion des fichiers (file, copy).

En utilisant des fichiers YAML, les utilisateurs d’Ansible peuvent automatiser des tâches répétitives sans avoir besoin de connaître des fonctionnalités avancées ou des langages de programmations compliqués à apprendre et à utiliser.

YAML vs YML : quelles différences ?

Au cours de votre utilisation d’outils DevOps (comme ceux vu plus haut), vous avez peut-être été confronté à l’extension de fichier .yml et vous vous êtes par conséquent demandé quelle était la différence avec le format YAML.

La réponse est simple, il n’y en a aucune. Que vous travailliez avec un fichier .yaml ou un fichier .yml, le contenu et la structure seront les mêmes.

Alors, me direz-vous, d’où viennent ces nomenclatures différentes ? Tout simplement de l’ère DOS, où les noms de fichiers étaient limités à un format 8.3, obligeant le nom « .yml ». Ce format obligeait effectivement que les noms de fichiers aient une longueur maximale de huit caractères et que l’extension soit de trois caractères.

Même si l’utilisation de l’extension .yaml ou .yml ne changent pas la donne en termes d’écriture et de syntaxe, il existe cependant des cas où la vigilance est de mise quant au bon nom à utiliser :

  • Cohérence du projet : si vous travaillez sur un projet existant qui utilise principalement une extension, il peut être préférable de s’en tenir à celle-ci par souci d’uniformité.
  • Compatibilité avec les outils et plateformes tiers : certains systèmes ou outils peuvent avoir des préférences ou des valeurs par défaut spécifiques pour les extensions de fichiers YAML. Pour éviter d’éventuelles corrections manuelles potentiellement chronophages, soyez sûr d’utiliser le bon nom de fichier.
  • Normes communautaires : les projets open sources collaboratifs ont presque systématiquement des normes internes sur le nommage des fichiers afin de faciliter la collaboration entre les contributeurs.

Conclusion

Les fichiers YAML sont de plus en plus courant dans les frameworks de programmation et de gestion d’application où les données sont stockées ou distribuées. Sa facilité de lecture et d’écriture ainsi que sa compatibilité avec de multiples langages de programmation en font un outil flexible et utilisable dans de nombreux contextes différents.

UNE QUESTION ? UN PROJET ? UN AUDIT DE CODE / D'INFRASTRUCTURE ?

Pour vos besoins d’expertise que vous ne trouvez nulle part ailleurs, n’hésitez pas à nous contacter.

ILS SE SONT FORMÉS CHEZ NOUS

partenaire sncf
partenaire hp
partenaire allianz
partenaire sfr
partenaire engie
partenaire boursorama
partenaire invivo
partenaire orange
partenaire psa
partenaire bnp
partenaire sncf
partenaire hp
partenaire allianz
partenaire sfr
partenaire engie
partenaire boursorama
partenaire invivo
partenaire orange
partenaire psa
partenaire bnp