Passer au contenu principal

Organisation (Ansible)

Les rôles

Un playbook de 300 lignes qui gère nginx, PostgreSQL, et un déploiement applicatif est ingérable. Les rôles permettent de décomposer cette complexité : chaque rôle encapsule une responsabilité unique, avec ses tâches, ses templates, ses variables et ses handlers. C'est l'unité de réutilisabilité d'Ansible.

Structure d'un rôle

roles/
└── nginx/
    ├── defaults/
    │   └── main.yml      # variables par défaut, facilement surchargées
    ├── vars/
    │   └── main.yml      # variables internes, haute priorité
    ├── tasks/
    │   └── main.yml      # liste de tâches principale
    ├── handlers/
    │   └── main.yml      # handlers du rôle
    ├── templates/
    │   └── nginx.conf.j2
    ├── files/
    │   └── dhparam.pem   # fichiers statiques
    ├── meta/
    │   └── main.yml      # dépendances, métadonnées Galaxy
    └── README.md

Seul tasks/main.yml est réellement obligatoire. Les autres répertoires sont créés selon les besoins.

Créer un rôle

ansible-galaxy role init roles/nginx

Cette commande crée la structure complète avec des fichiers vides.

defaults vs vars : comprendre la priorité

C'est la distinction la plus importante dans un rôle :

  • defaults/main.yml : priorité basse. Ce sont les valeurs par défaut que l'utilisateur du rôle peut et est censé surcharger via group_vars, host_vars, ou les vars du playbook. Mettre ici tout ce qui peut varier selon l'environnement.
  • vars/main.yml : priorité haute. Ces variables sont internes au rôle et ne doivent pas être surchargées de l'extérieur. Réservé aux constantes internes (chemins de fichiers système, noms de binaires).
# defaults/main.yml
nginx_user: www-data
nginx_worker_processes: "{{ ansible_processor_vcpus }}"
nginx_keepalive_timeout: 65
nginx_server_tokens: "off"

Utiliser un rôle dans un playbook

---
- name: Configurer les serveurs web
  hosts: web
  become: true
  roles:
    - role: nginx
      vars:
        nginx_keepalive_timeout: 30
    - role: certbot

Les rôles sont exécutés dans l'ordre. Les variables passées via vars: dans la déclaration du rôle ont une priorité plus haute que les group_vars, mais plus basse que les extra_vars.

Depuis Ansible 2.4, on peut aussi inclure un rôle dans les tâches :

tasks:
  - name: Inclure le rôle nginx
    ansible.builtin.include_role:
      name: nginx
    vars:
      nginx_keepalive_timeout: 30

include_role permet d'inclure un rôle de façon conditionnelle ou dans une boucle, ce que la section roles: ne permet pas.

Dépendances

# meta/main.yml
dependencies:
  - role: common
  - role: ssl
    vars:
      ssl_domain: "{{ app_domain }}"

Les dépendances sont résolues et exécutées avant le rôle lui-même. Elles sont dédupliquées : si deux rôles dépendent de common, celui-ci ne s'exécute qu'une seule fois.

Découper tasks/main.yml

Pour un rôle complexe, le fichier tasks/main.yml peut importer des sous-fichiers :

# tasks/main.yml
- name: Installation
  ansible.builtin.import_tasks: install.yml

- name: Configuration
  ansible.builtin.import_tasks: configure.yml

- name: TLS
  ansible.builtin.import_tasks: tls.yml
  when: nginx_tls_enabled | default(false)

import_tasks est statique (évalué avant l'exécution, les when s'appliquent à toutes les tâches incluses). include_tasks est dynamique (évalué à l'exécution, permet les variables dans le nom de fichier).