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.