YAML – Memo Bases

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

 

Ressources

Fermer le menu
%d blogueurs aiment cette page :