Les rôles Ansible aident à rendre la structure moins complexe en ajoutant une "sous-couche" (ou couche d'abstraction) aux playbooks Ansible.
L'objectif est de fournir des "rôles" prédéfini adapté à différents scénarios.
Créer le dossier "rôles" dans votre dossier projet ansible, voici l'arboresence actuelle de mon dossier projet :
On y retrouve l'ansible.cfg contenant la configuration, les credentials dans files/secrets, les groups_vars pour du Windows ET Linux dans mon cas. Le fichier hosts, le main.yml et un README.
A partir de là nous allons créer un dossier "roles" et dedans un fichier "requirements.yml"
mkdir roles && vim roles/requirements.yml
Dans le fichier "requirements.yml" nous allons renseigner les différents rôles qu'ansible va aller télécharger. Par exemple rôle pour configurer installer wordpress via docker.
- src: https://github.com/diranetafen/ansible-role-containerized-wordpress.git
Pour trouver ces rôles, rendez-vous sur la galaxie Ansible
A partir de là nous allons créer ou modifier un fichier .yml contenant notre playbook. Dans mon cas je vais en créer un nouveau appelé "wordpress.yml"
Ce fichier va contenir le code suivant :
---
- hosts: linux
become: true
vars:
system_user: user
vars_files:
- files/secrets/credentials.yml
pre_tasks:
- name: create www-data
user: name=www-data state=present
roles:
- { role: ansible-role-containerized-wordpress }
Il ressemble a quelques détails près aux playbooks qu'on a l'habitude de voir à une exception près, au lieu d'avoir des tasks il contient une ligne roles contenant en dessous une liste plus ou moins exhaustive de rôles.
Une fois que c'est fait, nous allons installer le rôle sur notre machine, pour cela, exécutez la commande ansible-galaxy
ansible-galaxy install -r roles/requirements.yml
Elle vous retournera que le rôle a été installé
- extracting ansible-role-containerized-wordpress to /home/user/.ansible/roles/ansible-role-containerized-wordpress
- ansible-role-containerized-wordpress was installed successfully
A partir de là, vous pouvez exécuter votre playbook sans problème :
ansible-playbook -i hosts.yml --ask-vault-pass wordpress.yml
Il est possible de créer son propre rôle. Pour cela rien de plus simple, nous allons nous rendre dans le dossier "roles" créé précédement et utiliser la commande ansible-galaxy a nouveau pour récupérer "dynamic_motd".
cd roles && ansible-galaxy init dynamic_motd
Cette commande va vous créer l'arborescence suivant pour le rôle dynamic_motd :
A partir de là, vous pouvez commencer à coder !
Dans un premier temps, je vais aller définir des variables "default" qui n'ont pas énormement d'impact sur les hosts ou sur d'autres éléments importants de monde code.
Par exemple je vais ajouter ceci dans le defaults/main.yml :
---
motd_message: "\n
================================\n
-- Welcome to {{ ansible_facts['fqdn'] }} --\n
================================"
Je déclare la variable "motd_message" ici les doubles astérisques se complèteront plus tard avec le hostname du serveur.
A partir de là je vais créer un template motd, dans le dossier templates, je vais crér un fichier appelé motd.j2, Jinja2 est le standard utilisé par Ansible.
Voici le contenu de motd.j2 :
{{ motd_message }}
System information:
OS: {{ ansible_distribution }} {{ ansible_distribution_version }}
Hostname: {{ ansible_hostname }}
IP Address: {{ ansible_default_ipv4.address }}
{{ custom_message | default('') }}
Je vais créer une role task, pour cela on va éditer tasks/main.yml
---
# tasks file for dynamic_motd
- name: Copy dynamic motd template
template:
src: motd.j2
dest: /etc/motd
become: yes
A la racine, je créé un fichier dynamic_motd_playbook.yml qui va contenir le code suivant :
---
# tasks file for dynamic_motd
- name: Configure Dynamic motd
hosts: linux
become: yes
vars_files:
- files/secrets/credentials.yml
roles:
- dynamic_motd
A partir de là nous pouvons exécuter le playbook :
ansible-playbook -i hosts.yml --ask-vault-pass dynamic_motd_playbook.yml
Je vérifie en me connectant sur la/les machines cibles si j'ai le message à la connexion, par exemple ici sur une machine suse :
================================
-- Welcome to v-s15SUSE-cible --
================================
System information:
OS: openSUSE Leap 15.5
Hostname: v-s15SUSE-cible
IP Address: 192.168.10.210