Aller au contenu principal

Les variables dans Ansible

Introduction

Dans Ansible, les variables permettent de rendre vos playbooks dynamiques et flexibles. Elles vous permettent de personnaliser des tâches sans avoir à réécrire du code, simplement en passant des valeurs différentes à chaque exécution. Les variables sont utilisées pour remplacer des valeurs fixes par des données variables, comme des noms d'utilisateur, des chemins d'accès, des adresses IP, etc...

Les différents types de Variables dans Ansible

Variables définies dans le Playbook

Vous pouvez définir des variables directement dans un playbook sous la section vars. Ces variables seront disponibles uniquement dans ce playbook.

---
- name: Exemple avec des variables dans le playbook
hosts: localhost
vars:
nom_utilisateur: "admin"
chemin_app: "/opt/app"

tasks:
- name: Créer un utilisateur
user:
name: "{{ nom_utilisateur }}"
state: present

- name: Créer un répertoire
file:
path: "{{ chemin_app }}"
state: directory

Dans cet exemple, nom_utilisateur et chemin_app sont des variables définies dans le playbook. Elles sont utilisées dans les tâches en les appelant entre accolades {{ }}.

Variables définies dans l'Inventaire

Les variables peuvent également être définies dans un fichier d'inventaire, pour des hôtes ou des groupes d'hôtes spécifiques.

[webservers]
web1 ansible_host=192.168.1.1 nom_utilisateur=webadmin1
web2 ansible_host=192.168.1.2 nom_utilisateur=webadmin2

Ces variables seront disponibles lorsque vous utiliserez ces hôtes dans un playbook.

---
- name: Exemple avec variables dans l'inventaire
hosts: webservers
tasks:
- name: Créer un utilisateur sur le serveur
user:
name: "{{ nom_utilisateur }}"
state: present

Dans cet exemple, nom_utilisateur est appelé pour créer un utilisateur sur l'hôte.

Variables dans les Fichiers de Rôle

Les rôles sont une manière d'organiser vos playbooks dans Ansible. Les rôles peuvent avoir leurs propres variables, stockées dans un fichier vars/main.yml.

roles/
mon_role/
vars/
main.yml
tasks/
main.yml

Fichier vars/main.yml dans le rôle :

nom_utilisateur: "admin"
chemin_application: "/opt/mon_application"

Dans ce fichier, nous définissons des tâches qui utilisent les variables définies dans vars/main.yml.

---
- name: Créer un utilisateur
user:
name: "{{ nom_utilisateur }}"
state: present

- name: Créer le répertoire de l'application
file:
path: "{{ chemin_application }}"
state: directory

Accéder aux facts (variables système)

Ansible collecte automatiquement des informations sur les systèmes appelées facts. Vous pouvez accéder à ces variables système, comme l'adresse IP, le système d'exploitation, la mémoire, etc.

---
- name: Utilisation des facts dans un playbook
hosts: localhost
gather_facts: yes
tasks:
- name: Afficher l'adresse IP
debug:
msg: "L'adresse IP de cet hôte est {{ ansible_default_ipv4.address }}"

Dans cet exemple, la variable ansible_default_ipv4.address contient l'adresse IP de l'hôte, collectée par Ansible.

Extra Vars

Les extra vars (ou variables supplémentaires) sont des variables que vous passez en ligne de commande lors de l'exécution d'un playbook. Elles sont utiles pour définir des variables à la volée sans avoir besoin de modifier un fichier de configuration, un playbook ou un inventaire.

ansible-playbook playbook.yml --extra-vars "nom_utilisateur=admin chemin_application=/opt/mon_application"

Les extra vars peuvent être passées en tant que paires clé-valeur, ou bien sous forme de fichier JSON ou YAML.

Passer des extra vars sous forme de paires clé-valeur

Disons que vous avez un playbook playbook.yml qui utilise deux variables : nom_utilisateur et chemin_application.

---
- name: Exemple avec extra vars
hosts: localhost
tasks:
- name: Créer un utilisateur
user:
name: "{{ nom_utilisateur }}"
state: present

- name: Créer un répertoire
file:
path: "{{ chemin_application }}"
state: directory

Vous pouvez les définir directement via la ligne de commande.

ansible-playbook playbook.yml --extra-vars "nom_utilisateur=admin chemin_application=/opt/app"

Passer des extra vars avec un fichier JSON ou YAML

Vous pouvez aussi définir vos extra vars dans un fichier JSON ou YAML. Cela peut être utile si vous avez un grand nombre de variables à passer.

Voici un exemple avec un fichier JSON nommé vars.json.

{
"nom_utilisateur": "admin",
"chemin_application": "/opt/app"
}

Commande à executer pour utiliser les variables du fichier JSON.

ansible-playbook playbook.yml --extra-vars "@vars.json"

Voici un exemple avec un fichier YAML nommé vars.yml:

nom_utilisateur: admin
chemin_application: /opt/app

Commande à executer pour utiliser les variables du fichier YAML.

ansible-playbook playbook.yml --extra-vars "@vars.yml"

Passer des extra vars complexes

Si vous devez passer des structures complexes comme des dictionnaires ou des listes, vous pouvez le faire avec des extra vars en format JSON ou YAML.

Voici un exemple avec une liste et un dictionnaire dans un fichier JSON.

{
"utilisateur": {
"nom": "admin",
"groupe": "admins"
},
"applications": ["nginx", "mysql", "redis"]
}

Commande à executer pour utiliser les variables complexes du fichier JSON.

ansible-playbook playbook.yml --extra-vars "@vars.json"

Dans ce cas, vous pourrez accéder aux variables utilisateur.nom, utilisateur.groupe, et applications dans votre playbook.

Précédence des Extra Vars

Les extra vars ont une très haute priorité dans l'ordre de hiérarchie des variables d'Ansible. Voici l'ordre de priorité des différentes sources de variables, du moins prioritaire au plus haut niveau de priorité.

  • Variables dans les fichiers d'inventaire
  • Variables dans les rôles
  • Variables dans le playbook
  • Extra vars

Cela signifie que si vous définissez une variable à la fois dans un fichier d'inventaire, dans un rôle et via la ligne de commande avec --extra-vars, c'est la valeur de la variable passée avec extra vars qui prévaudra.

Ressources supplémentaire

Voici un lien vers la documentation ansible