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