Créer et appliquer un rôle réutilisable

AnsibleBeginner
Pratiquer maintenant

Introduction

Les rôles permettent de regrouper des valeurs par défaut, des tâches, des modèles (templates), des fichiers et des gestionnaires (handlers) dans une structure réutilisable. Ils permettent de garder les playbooks concis et facilitent le partage de l'automatisation.

Dans ce laboratoire, vous allez créer un rôle manuellement, y ajouter des valeurs par défaut, un modèle et des tâches, puis l'appliquer à deux alias d'hôtes.

Créer un projet de pratique pour les rôles

Dans cette étape, vous allez créer un projet avec un répertoire dédié aux rôles et deux alias d'hôtes web locaux.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,roles,playbooks,managed,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
roles_path = ./roles
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local
EOF

Le paramètre roles_path = ./roles indique à Ansible où rechercher les noms de rôles utilisés par les playbooks. Sans cela, Ansible pourrait ne rechercher que les chemins de rôles au niveau du système ou de l'utilisateur.

Créer la structure de répertoires du rôle

Dans cette étape, vous allez créer les répertoires clés du rôle. defaults stocke les variables à faible priorité, tasks contient la logique des tâches, et templates héberge les modèles Jinja2. Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible. Cela garantit la stabilité des commandes, même si LabEx exécute chaque étape séparément.

cd /home/labex/project/rhce-ansible
mkdir -p roles/web_banner/{defaults,tasks,templates}
find roles/web_banner -maxdepth 2 -type d | sort

La sortie doit afficher la racine du rôle ainsi que les répertoires defaults, tasks et templates. Ces noms sont significatifs pour Ansible ; par exemple, tasks/main.yml est le point d'entrée des tâches pour le rôle.

Ajouter des valeurs par défaut et un modèle au rôle

Dans cette étape, vous allez ajouter des variables par défaut et un modèle. Le rôle utilisera ces valeurs à moins qu'un playbook ou l'inventaire ne les remplace. Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible.

cd /home/labex/project/rhce-ansible
cat > roles/web_banner/defaults/main.yml <<'EOF'
---
banner_message: Welcome to RHCE Ansible Prep
EOF
cat > roles/web_banner/templates/banner.txt.j2 <<'EOF'
Host: {{ inventory_hostname }}
Message: {{ banner_message }}
EOF

Les valeurs par défaut sont des variables de rôle à faible priorité. Elles fournissent au rôle une valeur utilisable lorsque le playbook ou l'inventaire n'en fournit pas, tout en permettant aux appelants de les remplacer ultérieurement.

cat roles/web_banner/defaults/main.yml roles/web_banner/templates/banner.txt.j2

Le modèle combine l'alias de l'hôte actuel avec le message par défaut. Lorsque le rôle s'exécute pour deux hôtes, le même modèle doit générer deux lignes Host: différentes.

Ajouter les tâches du rôle et appliquer le rôle

Dans cette étape, vous allez ajouter tasks/main.yml et un playbook qui applique le rôle. Le rôle crée un répertoire pour l'hôte et génère un fichier de bannière par hôte. Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible.

cd /home/labex/project/rhce-ansible
cat > roles/web_banner/tasks/main.yml <<'EOF'
---
- name: Ensure host banner directory exists
  ansible.builtin.file:
    path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}"
    state: directory
    mode: '0755'

- name: Render host banner
  ansible.builtin.template:
    src: banner.txt.j2
    dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/banner.txt"
    mode: '0644'
EOF
cat > playbooks/apply-role.yml <<'EOF'
---
- name: Apply reusable web banner role
  hosts: web
  gather_facts: false
  roles:
    - role: web_banner
EOF

Le fichier de tâches du rôle contient l'implémentation, tandis que playbooks/apply-role.yml reste concis et se contente de nommer le rôle. C'est là tout l'intérêt des rôles : une structure réutilisable sans avoir à répéter chaque tâche dans chaque playbook.

ansible-playbook playbooks/apply-role.yml --syntax-check

Exécuter le playbook basé sur le rôle

Dans cette étape, vous allez exécuter le playbook et inspecter les fichiers générés. Le playbook reste court car le rôle contient l'implémentation réutilisable. Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible.

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/apply-role.yml | tee reports/role-run.txt

L'exécution doit lancer le rôle une fois par alias d'hôte dans le groupe web. Un récapitulatif réussi avec failed=0 signifie que le rôle a été trouvé via roles_path et que ses tâches ont été effectuées.

cat managed/web1/banner.txt managed/web2/banner.txt

Les fichiers générés doivent partager le même message mais présenter des lignes Host: différentes. Cela prouve que le rôle a réutilisé la même logique tout en générant des données spécifiques à chaque hôte.

Résumé

Vous avez construit une structure de rôle réutilisable, ajouté des valeurs par défaut, des tâches et un modèle, appliqué le rôle à partir d'un playbook et vérifié le résultat généré.