Qu’est ce que YAML
YAML est l’acronyme récursif de "YAML Ain’t Markup Language", signifiant "YAML n’est pas un langage de balises". Il est relativement proche dans son utilisation des langages XML, JSON et CSV.
YAML est un langage de sérialisation de données utilisé, par exemple, pour le déploiement de configurations par Ansible ou pour la configuration d’applications multi-containers via Docker Compose.
L’extension des fichiers YAML est .yaml ou .yml.
La syntaxe en bref
Dictionnaires
key1: value1 key2: value2 key3: value3
Equivaut à :
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
Listes
- item1 - item2 - item3
Equivaut à :
['item1', 'item2', 'item3']
Imbrication de dictionnaires dans une liste
- item1: key11: value11 key12: value12 - item2 - item3: key31: key311: value311 key312: value312 key32: - item321 - item322 - item323
ou
- item1: {key11: value11, key12: value12} - item2 - item3: {key31: {key311: value311, key312: value312}, key32: [item321, item322, item323]}
Equivaut à :
[{'item1': {'key11': 'value11', 'key12': 'value12'}}, 'item2', {'item3': {'key31': {'key311': 'value311', 'key312': 'value312'}, 'key32': ['item321', 'item322', 'item323']}}]
Les différents types de key: value
cle: valeur autre_cle: une autre valeur valeur_numerique: 100 valeur_flottante: 0.25 notation_scientifique: 1e+12 booleen: true valeur_null: null autre_valeur_null: ~ cle avec espaces: valeur chaine_de_caracteres: ceci est une chaine de caracteres sans guillemets chaine_avec_guillemets: "ceci est une chaine de caracteres contenant : et true" datetime: 2001-12-15T02:59:43.1Z datetime_avec_espaces: 2001-12-14 21:59:43.10 -5 date: 2002-12-14
Ceci équivaut, sous Python, à :
{'autre_cle': 'une autre valeur', 'autre_valeur_null': None, 'booleen': True, 'chaine_avec_guillemets': 'ceci est une chaine de caracteres contenant : et true', 'chaine_de_caracteres': 'ceci est une chaine de caracteres sans guillemets', 'cle': 'valeur', 'cle avec espaces': 'valeur', 'date': datetime.date(2002, 12, 14), 'datetime': datetime.datetime(2001, 12, 15, 2, 59, 43, 100000), 'datetime_avec_espaces': datetime.datetime(2001, 12, 15, 2, 59, 43, 100000), 'notation_scientifique': '1e+12', 'valeur_flottante': 0.25, 'valeur_null': None, 'valeur_numerique': 100}
Value sur plusieurs lignes
key1: | Ligne1 Ligne2 Ligne3 key2: > Ligne1 Ligne2 Ligne3
Equivaut à :
{'key1': 'Ligne1\nLigne2\n\nLigne3\n', 'key2': 'Ligne1 Ligne2\nLigne3\n'}
Key sur plusieurs lignes
? | cle sur plusieurs lignes : valeur de cette cle
Equivaut à :
{'cle sur\nplusieurs lignes\n': 'valeur de cette cle'}
Transcription du YAML vers Python
Utiliser Online YAML Parser.
Ou alors utiliser le module Python PyYAML :
# pip install pyyaml
Soit le fichier Yaml de test yaml-file.yml suivant :
- hosts: webservers vars: http_port: 80 max_clients: 200 remote_user: root tasks: - name: ensure apache is at the latest version yum: name: httpd state: latest - name: write the apache config file template: src: /srv/httpd.j2 dest: /etc/httpd.conf notify: - restart apache - name: ensure apache is running service: name: httpd state: started handlers: - name: restart apache service: name: httpd state: restarted
>>> import yaml >>> import pprint >>> y = yaml.load(open("yaml-file.yml")) >>> pprint.pprint(y, width=1) [{'handlers': [{'name': 'restart apache', 'service': {'name': 'httpd', 'state': 'restarted'}}], 'hosts': 'webservers', 'remote_user': 'root', 'tasks': [{'name': 'ensure apache is at the latest version', 'yum': {'name': 'httpd', 'state': 'latest'}}, {'name': 'write the apache config file', 'notify': ['restart apache'], 'template': {'dest': '/etc/httpd.conf', 'src': '/srv/httpd.j2'}}, {'name': 'ensure apache is running', 'service': {'name': 'httpd', 'state': 'started'}}], 'vars': {'http_port': 80, 'max_clients': 200}}]
Transcription du Python vers YAML
Utiliser le module Python PyYAML :
# pip install pyyaml
>>> import yaml >>> x = [{'tasks': [{'yum': {'state': 'latest', 'name': 'httpd'}, 'name': 'ensure apache is at the latest version'}, {'name': 'write the apache config file', 'template': {'dest': '/etc/httpd.conf', 'src': '/srv/httpd.j2'}, 'notify': ['restart apache']}, {'name': 'ensure apache is running', 'service': {'state': 'started', 'name': 'httpd'}}], 'remote_user': 'root', 'hosts': 'webservers', 'vars': {'http_port': 80, 'max_clients': 200}, 'handlers': [{'name': 'restart apache', 'service': {'state': 'restarted', 'name': 'httpd'}}]}] >>> pprint.pprint(x, width=1) [{'handlers': [{'name': 'restart apache', 'service': {'name': 'httpd', 'state': 'restarted'}}], 'hosts': 'webservers', 'remote_user': 'root', 'tasks': [{'name': 'ensure apache is at the latest version', 'yum': {'name': 'httpd', 'state': 'latest'}}, {'name': 'write the apache config file', 'notify': ['restart apache'], 'template': {'dest': '/etc/httpd.conf', 'src': '/srv/httpd.j2'}}, {'name': 'ensure apache is running', 'service': {'name': 'httpd', 'state': 'started'}}], 'vars': {'http_port': 80, 'max_clients': 200}}] >>> yaml.dump(x, open("from-python.yaml", "w"), default_flow_style=False)
Ce qui crée le fichier from-python.yml suivant :
- handlers: - name: restart apache service: name: httpd state: restarted hosts: webservers remote_user: root tasks: - name: ensure apache is at the latest version yum: name: httpd state: latest - name: write the apache config file notify: - restart apache template: dest: /etc/httpd.conf src: /srv/httpd.j2 - name: ensure apache is running service: name: httpd state: started vars: http_port: 80 max_clients: 200