Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici

Variables Ansible

Définition d’une variable

Les variables facilitent la gestion des données qui ne sont pas statiques, notamment dans les playbooks de Ansible. Ce chapitre a pour objectif de présenter ces différents points :

  • Nommer correctement les variables.

  • Définir l’emplacement des variables et leur étendue.

  • Les types de variables.

  • La récupération du résultat d’une commande.

1. Nom d’une variable

Le nom d’une variable doit commencer impérativement par une lettre. Les autres caractères peuvent être des lettres, des chiffres et des tirets bas (underscore). 

Noms corrects

  • serveur_messagerie

  • fichier01

  • fichier_01

Noms incorrects

Variables

Description

serveur messagerie

L’espace est interdit.

01_fichier

La variable ne doit pas commencer par un chiffre.

serveur.web

Le caractère point n’est pas autorisé.

serveur$1

Le caractère dollar n’est pas autorisé.

Comme dans tous les langages de développement, le nom doit représenter le sujet qu’il contient pour être davantage explicite. La variable http_port décrit bien qu’elle va stocker la valeur du port HTTP.

2. Étendue des variables

Ansible propose une vingtaine de manières pour définir des variables dans un projet. Vous pouvez les déclarer, entre autres, sur une ligne de commande, dans un inventaire ou bien encore dans un playbook. 

Si toutefois une même variable est définie à plusieurs endroits, nous sommes confrontés à un problème de préséance. Dans ce cas, le niveau ayant la priorité la plus élevée l’emporte.

Prenons un exemple. Les variables qui sont définies dans le fichier inventaire sont remplacées par celles du fichier playbook, lesquelles sont, à leur tour, remplacées par les variables définies sur la ligne de commande.

Le tableau ci-dessous répertorie l’ordre de préséance du moins au plus prioritaire :

Niveau

Emplacement

1

command line values

2

role defaults (la variable par défaut)

3

inventory file ou script group vars (dans l’inventaire)

4

inventory group_vars/all (dans l’inventaire)

5

playbook group_vars/all (dans le fichier playbook)

6

inventory group_vars (dans l’inventaire)

7

playbook group_vars...

Utilisation de variables Ansible

En plus des variables définies par l’utilisateur, il est possible d’accéder aux variables que Ansible fournit. En effet, chaque « play » exécute automatiquement le module setup avant la première tâche dans le but de rassembler les faits (facts en anglais). Il s’agit de la tâche Gathering Facts.

Exécution du module setup sur la machine locale

[root@server1 projet]# ansible localhost -m setup 
localhost | SUCCESS => { 
   "ansible_facts": { 
       "ansible_all_ipv4_addresses": [ 
           "10.14.8.0" 
       ], 
       "ansible_all_ipv6_addresses": [ 
           "fe80::8a9b:6241:9ed3:ef1a" 
       ], 
       "ansible_apparmor": { 
           "status": "disabled" 
       }, 
       "ansible_architecture": "x86_64", 
 
**** sortie tronquée **** 
 
 
       "ansible_distribution": "CentOS", 
       "ansible_bios_date": "04/01/2014", ...

Récupérer le résultat d’une commande

L’instruction register permet de récupérer le résultat d’une commande, qui sera enregistré dans une variable temporaire. Ce qui permettra d’y accéder ultérieurement. 

Récupérer le résultat d’une commande dans un playbook

La commande shell ls /home va être exécutée sur toutes les machines gérées définies dans l’inventaire. Avec l’instruction register, déclarez une variable home_resultat pour récupérer le résultat :

--- 
- name: Récupérer le résultat d'une commande ls /home 
  hosts: all 
  tasks: 
    - name: contenu de /home 
      shell: ls /home 
      register: home_resultat 
 
    - name: affiche la liste des valeurs 
      debug: 
        var: home_resultat 

Vous obtenez toutes les valeurs de retour :

[root@server1 projet]# ansible-playbook pb.yml 
 
PLAY [Récupérer le résultat d'une commande ls /home]*********** 
 
TASK [Gathering Facts] **************************************** 
ok: [server3.staff.local] 
ok: [server2.staff.local] 
 
TASK [contenu de /home] *************************************** 
changed: [server3.staff.local] 
changed: [server2.staff.local] 
 
TASK [affiche la liste des valeurs] *************************** 
ok: [server2.staff.local] => { 
   "home_resultat": { 
       "changed": true, 
       "cmd": "ls /home", 
       "delta": "0:00:00.004417", 
       "end": "2019-12-29...

Variables externes

Les variables peuvent être déclarées dans un fichier externe au playbook. Par conséquent, il faudra définir ce fichier dans le playbook avec l’instruction vars_files.

Variables définies en dehors du playbook

Créez un répertoire pour stocker les fichiers de variables externes :

root@server1 projet]# mkdir vars 
[root@server1 projet]# 

Puis avec l’éditeur de texte vi, concevez le fichier ./vars/ext_vars.yml où seront définies les variables externes comme ceci :

[root@server1 projet]# cat vars/ext_vars.yml 
--- 
port_ssh: 80 
service: 
 debian: apache2 
 rhel: httpd 
[root@server1 projet]# 

Le contenu du fichier playbook :

[root@server1 projet]# cat pb.yml 
--- 
- name: Variables définies dans un fichier externe 
  hosts: all 
  vars_files: vars/ext_vars.yml 
  tasks: 
    - name: "Afficher les variables" 
      debug: 
        msg: 
          - "Port TCP {{ port_ssh }}" 
          - "Service web Debian {{ service['debian'] }}" 
          - "Service Web RHEL   {{ service.rhel }}" 
[root@server1...

Variables définies sur la ligne de commande

Comme vu précédemment, les variables d’inventaire sont remplacées par les variables définies dans un playbook. Ces dernières peuvent être aussi remplacées par des variables qui sont passées en tant qu’arguments sur la ligne de commande. Elles sont appelées variables supplémentaires.

Les variables supplémentaires sont utiles lorsqu’il faut remplacer la valeur d’une variable définie pour une exécution ponctuelle d’un playbook.

Interprétation des variables

[root@server1 projet]# ansible-playbook playbook.yml \ 
> -e "distro=Red Hat" 
 
PLAY [Découvrir les variables de Ansible]*********************** 
 
TASK [Gathering Facts]****************************************** 
ok: [server3.staff.local] 
ok: [server2.staff.local] 
 
TASK [Afficher les variables] *********************************** 
ok: [server2.staff.local] => { 
   "msg": [ 
       "Red", 
       "Je suis dans le dossier host_vars" 
   ] 
} 
 
**** sortie tronquée ****  

Si vous essayez de passer en argument la valeur d’une variable avec un espace ou d’autres caractères sujets à être interprétés...

Chiffrer les variables

Avec Ansible Vault, il est possible de chiffrer des variables sensibles qui stockent par exemple des mots de passe.

1. Présentation de Ansible Vault

De base, les informations sont stockées dans divers emplacements sous forme de texte clair dans des variables. Le risque est que n’importe quel utilisateur ayant accès aux fichiers puisse accéder à ces données sensibles.

Ansible Vault, fourni avec Ansible, permet de chiffrer et de déchiffrer n’importe quel fichier de données grâce à la commande ansible-vault. Cette dernière utilise les fonctions cryptographiques d’une boîte à outils Python externe.

La protection des fichiers est effectuée par un chiffrement symétrique AES256 avec un mot de passe comme clé secrète.

Pour de plus amples informations sur cette commande, veuillez consulter le site suivant : https://docs.ansible.com/ansible/latest/user_guide/vault.html

2. Gestion d’un fichier chiffré

Cette section va étudier les points suivants :

  • Créer, consulter ou modifier un fichier chiffré.

  • Chiffrer ou déchiffrer un fichier existant.

  • Changer le mot de passe  d’un fichier chiffré.

  • Exécuter un playbook avec un fichier chiffré.

a. Création

La création d’un fichier chiffré s’effectue avec la commande ansible-vault avec l’option create suivie du nom du fichier.

Création du fichier user_david.yml

[root@server1 projet]# ansible-vault create user_david.yml 
New Vault password: stage 
Confirm New Vault password: stage 

Puis, la commande va créer le nouveau fichier à l’aide de l’éditeur de texte par défaut, en l’occurrence vi :

--- 
- name: Création de l'utilisateur David Lamber 
  hosts: all 
  tasks: 
    - name: David Lamber 
      user: 
        name: david 
        group: users 
        groups: adm,sys 
        state: present 
        shell: /bin/bash 
        password: "{{ david_passwd }}" 
        generate_ssh_key: true 
  vars: ...