Un Gestion de la configuration des rôles Ansible avec des valeurs par défaut
Introduction
La gestion de la configuration des rôles Ansible peut rapidement devenir complexe, surtout lorsque les rôles sont réutilisés dans différents projets ou environnements.
Une approche courante consiste à définir des valeurs par défaut directement dans les fichiers defaults/main.yml des rôles.
Cependant, cette méthode peut présenter des limitations, notamment en termes de flexibilité et de clarté.
Dans cet article, je vais vous présenter une méthode alternative que j'utilise pour gérer la configuration de mes rôles Ansible. Cette approche repose sur l'utilisation de dictionnaires de valeurs par défaut et de configurations personnalisées, jointes dynamiquement lors de l'exécution du playbook.
Pourquoi cette approche ?
1. Validation explicite des variables requises
Cette méthode permet de définir explicitement quelles variables sont requises (en les initialisant à null) et de valider leur présence lors de l'exécution du rôle.
2. Meilleure lisibilité La configuration devient plus lisible et plus facile à maintenir, car les valeurs par défaut et les personnalisations sont clairement séparées.
3. Jointure récursive
L'utilisation de ansible.builtin.combine avec l'option recursive=true permet de joindre les dictionnaires de manière récursive, préservant ainsi la structure hiérarchique des données.
Mise en place
Définir les valeurs par défaut
Dans le fichier de variables du rôle (généralement role/defaults/main.yaml), définissez un dictionnaire <role_defaults contenant les valeurs par défaut pour votre rôle.
Les variables requises doivent être initialisées à null.
La dernière ligne du bloc ci-dessous est la plus importante, c'est elle qui va faire la jointure entre votre configuration custom et la configuration par défaut lors de l'éxecution du playbook.
role_defaults:
subrole:
version: v1.132.0
username: null
role_config: "{{ role_defaults | ansible.builtin.combine(role_custom, recursive=true) }}"
Valider les variables requises
Dans les tâches de votre rôle, utilisez le module ansible.builtin.assert pour valider que les variables requises sont bien définies.
- name: Ensure general configuration variables are set
ansible.builtin.assert:
that:
- role_config.subrole.username is not none and role_config.subrole.username != ""
Définir les configurations personnalisées
Dans le fichier du playbook qui utilise le rôle, définissez un dictionnaire role_custom contenant les valeurs personnalisées pour votre rôle.
role_custom:
subrole:
username: "mon_utilisateur"
Exemple complet
Voici un exemple complet illustrant cette approche :
Fichier de variables du rôle (role/defaults/main.yaml)
role_defaults:
subrole:
version: v1.132.0
username: null
password: null
enabled: true
role_config: "{{ role_defaults | ansible.builtin.combine(role_custom, recursive=true) }}"
Tâches du rôle (role/tasks/main.yaml)
- name: Ensure required configuration variables are set
ansible.builtin.assert:
that:
- role_config.subrole.username is not none and role_config.subrole.username != ""
- role_config.subrole.password is not none and role_config.subrole.password != ""
- name: Display configuration
ansible.builtin.debug:
var: role_config
- name: Perform role tasks with merged configuration
ansible.builtin.debug:
msg: "{{ role_config.subrole.username }}"
Playbook qui utilise le rôle
- name: Mon playbook
vars:
role_custom:
subrole:
username: "admin"
password: "mon_mot_de_passe"
roles:
- role
Avantages et inconvénients
Avantages
- Clarté : La séparation entre les valeurs par défaut et les personnalisations rend la configuration plus facile à comprendre.
- Flexibilité : Il est facile de surcharger uniquement les valeurs nécessaires sans avoir à redéfinir toute la configuration.
- Validation : La validation explicite des variables requises permet de détecter rapidement les erreurs de configuration.
- Maintenabilité : Les modifications de la configuration sont plus faciles à gérer et à suivre.
Inconvénients
- Complexité accrue : Cette approche peut sembler plus complexe au premier abord, surtout pour les utilisateurs habitués à la méthode traditionnelle.
- Surcharge cognitive : Il faut bien comprendre le mécanisme de jointure pour éviter les erreurs de configuration.
Conclusion
Cette méthode de gestion de la configuration des rôles Ansible offre une grande flexibilité et une meilleure lisibilité, tout en permettant une validation explicite des variables requises. Bien qu'elle puisse sembler plus complexe au premier abord, elle se révèle très efficace pour les projets de grande envergure ou pour les rôles réutilisés dans différents contextes.