Introduction : Ne Réinventez Pas la Roue
L'un des principes fondamentaux du développement logiciel est de ne pas réinventer la roue. Pourquoi passer des heures à écrire un rôle Ansible pour installer Docker, configurer PostgreSQL ou déployer un cluster Kubernetes quand quelqu'un l'a déjà fait — et probablement mieux que vous ne le feriez en partant de zéro ? C'est exactement la philosophie derrière Ansible Galaxy.
Ansible Galaxy est à la fois une plateforme communautaire (galaxy.ansible.com) et un outil en ligne de commande (ansible-galaxy) qui permettent de partager, découvrir et installer des rôles et des collections Ansible. Avec des milliers de rôles disponibles couvrant pratiquement tous les cas d'usage imaginables, Galaxy est un accélérateur incontournable pour vos projets d'automatisation.
Architecture en un coup d'œil

Dans cet article, nous allons explorer en profondeur l'écosystème Ansible Galaxy : comment chercher et installer des rôles et collections, comment gérer vos dépendances avec un fichier requirements.yml, et comment contribuer vous-même à la communauté en publiant vos propres rôles. Nous aborderons également les différences entre rôles et collections, ainsi que les collections les plus populaires à connaître.
Qu'est-ce qu'Ansible Galaxy ?
Ansible Galaxy se présente sous deux facettes complémentaires :
La plateforme web : galaxy.ansible.com
Le site galaxy.ansible.com est un hub communautaire où les développeurs du monde entier publient et partagent leurs rôles et collections Ansible. Vous y trouverez :
- Des milliers de rôles couvrant l'installation et la configuration de pratiquement tous les logiciels courants (Nginx, Apache, Docker, PostgreSQL, MySQL, Redis, Elasticsearch, etc.).
- Des collections regroupant des modules, plugins, rôles et documentation autour d'un thème ou d'une technologie (AWS, Azure, Docker, Kubernetes, etc.).
- Des évaluations et statistiques : nombre de téléchargements, étoiles, dernière mise à jour, compatibilité avec les plateformes.
- De la documentation : chaque rôle ou collection bien maintenue inclut un README détaillé avec les variables disponibles et des exemples d'utilisation.
Lorsque vous cherchez un rôle sur Galaxy, prêtez attention à plusieurs indicateurs de qualité :
- Nombre de téléchargements : un rôle très téléchargé est généralement éprouvé.
- Date de dernière mise à jour : un rôle non mis à jour depuis 3 ans risque d'être incompatible avec les versions récentes d'Ansible.
- Présence de tests CI : les meilleurs rôles sont testés automatiquement avec Molecule et des pipelines CI/CD.
- Qualité de la documentation : un README complet avec toutes les variables documentées est un signe de maturité.
L'outil en ligne de commande : ansible-galaxy
La commande ansible-galaxy est l'interface en ligne de commande qui interagit avec la plateforme Galaxy. Elle permet de chercher, installer, initialiser et gérer des rôles et des collections directement depuis votre terminal :
# Afficher l'aide générale
ansible-galaxy --help
# Aide spécifique aux rôles
ansible-galaxy role --help
# Aide spécifique aux collections
ansible-galaxy collection --helpChercher des Rôles et des Collections
Recherche en ligne de commande
Vous pouvez chercher des rôles directement depuis votre terminal avec la commande ansible-galaxy search :
# Chercher des rôles liés à nginx
ansible-galaxy search nginx
# Chercher avec des filtres
ansible-galaxy search nginx --platforms Ubuntu
ansible-galaxy search nginx --author geerlingguy
# Afficher les détails d'un rôle spécifique
ansible-galaxy info geerlingguy.nginxLa commande ansible-galaxy info affiche des informations détaillées sur un rôle : description, auteur, licence, plateformes supportées, versions disponibles et dépendances.
Recherche sur le site web
Pour une recherche plus visuelle et interactive, rendez-vous sur galaxy.ansible.com. L'interface web permet de filtrer par type (rôle ou collection), par plateforme, par tag et par auteur. Vous pouvez également consulter le code source du rôle directement sur GitHub, ce qui est précieux pour évaluer la qualité du code avant de l'adopter.
Auteurs de référence
Certains auteurs sont particulièrement reconnus dans la communauté Ansible pour la qualité et la fiabilité de leurs rôles. En voici quelques-uns à connaître :
- geerlingguy (Jeff Geerling) : auteur prolifique de dizaines de rôles très populaires (nginx, docker, php, mysql, postgresql, java, etc.). Ses rôles sont considérés comme des références en termes de bonnes pratiques.
- robertdebock : maintient une large collection de rôles bien testés avec Molecule.
- cloudalchemy : rôles spécialisés dans le monitoring (Prometheus, Grafana, Alertmanager).
Installer des Rôles depuis Galaxy
Installation simple
L'installation d'un rôle depuis Galaxy se fait en une seule commande :
# Installer un rôle depuis Galaxy
ansible-galaxy install geerlingguy.nginx
# Installer une version spécifique
ansible-galaxy install geerlingguy.nginx,3.1.0
# Installer dans un répertoire personnalisé
ansible-galaxy install geerlingguy.nginx --roles-path ./roles
# Forcer la réinstallation (mise à jour)
ansible-galaxy install geerlingguy.nginx --forcePar défaut, les rôles sont installés dans le répertoire ~/.ansible/roles/. Vous pouvez modifier ce chemin par défaut dans votre fichier ansible.cfg :
# ansible.cfg
[defaults]
roles_path = ./roles:~/.ansible/rolesInstallation depuis d'autres sources
La commande ansible-galaxy install ne se limite pas à la plateforme Galaxy. Elle supporte également d'autres sources :
# Depuis un dépôt Git
ansible-galaxy install git+https://github.com/user/mon-role.git
# Depuis un dépôt Git avec une version spécifique (tag, branche, commit)
ansible-galaxy install git+https://github.com/user/mon-role.git,v2.0.0
# Depuis une archive tar.gz
ansible-galaxy install https://example.com/roles/mon-role.tar.gz,v1.0,mon_role
# Depuis un dépôt Git privé via SSH
ansible-galaxy install git+ssh://git@github.com/user/mon-role-prive.gitLister et supprimer des rôles
# Lister les rôles installés
ansible-galaxy list
# Supprimer un rôle
ansible-galaxy remove geerlingguy.nginxLe Fichier requirements.yml
Pour un projet professionnel, il est impensable de gérer les dépendances manuellement. Le fichier requirements.yml joue le même rôle que package.json pour Node.js ou requirements.txt pour Python : il déclare toutes les dépendances du projet de manière reproductible.
Structure du fichier requirements.yml
Voici un fichier requirements.yml complet illustrant toutes les possibilités :
# requirements.yml
---
# ============================================
# Rôles
# ============================================
roles:
# Rôle depuis Ansible Galaxy (syntaxe simple)
- name: geerlingguy.docker
version: "6.1.0"
# Rôle depuis Galaxy avec alias
- name: geerlingguy.nginx
version: "3.1.0"
# Rôle depuis Galaxy sans version fixe (dernière version)
- name: geerlingguy.certbot
# Rôle depuis Galaxy avec un nom personnalisé
- name: geerlingguy.postgresql
version: "3.4.0"
# Rôle depuis un dépôt Git public
- name: mon_role_custom
src: https://github.com/mon-org/ansible-role-custom.git
scm: git
version: main
# Rôle depuis un dépôt Git privé (via SSH)
- name: role_interne
src: git@gitlab.entreprise.com:infra/ansible-role-interne.git
scm: git
version: v2.3.1
# Rôle depuis une archive HTTP
- name: role_archive
src: https://artifacts.entreprise.com/roles/mon-role-1.0.tar.gz
# Rôle pour la sécurité
- name: devsec.hardening
version: "8.0.0"
# Rôles pour le monitoring
- name: cloudalchemy.prometheus
version: "2.24.0"
- name: cloudalchemy.grafana
version: "0.17.0"
- name: cloudalchemy.node_exporter
version: "2.0.0"
# ============================================
# Collections
# ============================================
collections:
# Collection communautaire générale
- name: community.general
version: ">=8.0.0"
# Collection Docker
- name: community.docker
version: "3.8.0"
# Collection pour les systèmes POSIX
- name: ansible.posix
version: "1.5.4"
# Collection pour la cryptographie
- name: community.crypto
version: "2.18.0"
# Collection AWS
- name: amazon.aws
version: "7.2.0"
# Collection Azure
- name: azure.azcollection
version: "2.2.0"
# Collection Kubernetes
- name: kubernetes.core
version: "3.0.0"
# Collection MySQL
- name: community.mysql
version: "3.9.0"
# Collection PostgreSQL
- name: community.postgresql
version: "3.3.0"
# Collection depuis un dépôt Git privé
- name: mon_namespace.ma_collection
source: https://gitlab.entreprise.com/ansible/collections/ma-collection.git
type: git
version: main
# Collection depuis un fichier tar.gz
- name: entreprise.custom
source: https://artifacts.entreprise.com/collections/entreprise-custom-1.0.0.tar.gz
type: urlInstaller les dépendances depuis requirements.yml
# Installer tous les rôles déclarés
ansible-galaxy install -r requirements.yml
# Installer toutes les collections déclarées
ansible-galaxy collection install -r requirements.yml
# Installer les deux en une seule commande (Ansible 2.10+)
ansible-galaxy install -r requirements.yml
# Forcer la réinstallation de tout
ansible-galaxy install -r requirements.yml --force
# Installer dans un chemin spécifique
ansible-galaxy install -r requirements.yml --roles-path ./roles
ansible-galaxy collection install -r requirements.yml -p ./collectionsIl est recommandé d'intégrer l'installation des dépendances dans votre pipeline CI/CD et dans un Makefile pour simplifier l'onboarding des nouveaux membres de l'équipe :
# Makefile
.PHONY: setup deps lint run
setup: deps
deps:
pip install ansible ansible-lint molecule molecule-docker
ansible-galaxy install -r requirements.yml --force
ansible-galaxy collection install -r requirements.yml --force
lint:
ansible-lint playbooks/
run:
ansible-playbook -i inventory/production playbooks/site.ymlCollections vs Rôles : Comprendre les Différences
Avec l'arrivée d'Ansible 2.10, les collections sont devenues le format de distribution privilégié. Mais quelle est la différence avec les rôles ? Et quand utiliser l'un plutôt que l'autre ?
Les rôles
Un rôle est une unité d'automatisation qui encapsule des tâches, variables, templates, fichiers et handlers pour accomplir une fonction spécifique (installer Nginx, configurer PostgreSQL, etc.). Les rôles existaient depuis les premières versions d'Ansible.
Caractéristiques des rôles :
- Contiennent uniquement des tâches d'automatisation (pas de modules custom).
- Structure standardisée (tasks/, handlers/, defaults/, etc.).
- Peuvent être partagés sur Galaxy individuellement.
- Ont un namespace basé sur l'auteur :
geerlingguy.nginx.
Les collections
Une collection est un package plus large qui peut contenir des modules, plugins, rôles, documentation et playbooks. C'est le format de distribution moderne d'Ansible.
Caractéristiques des collections :
- Peuvent contenir des modules (écritures de nouvelles fonctionnalités Ansible).
- Peuvent contenir des plugins (filter, lookup, callback, connection, etc.).
- Peuvent contenir des rôles (un ou plusieurs).
- Ont un namespace structuré :
namespace.collection(ex:community.docker). - Utilisent un système de versioning sémantique.
- Sont le format recommandé depuis Ansible 2.10.
Tableau comparatif
Voici un résumé des différences clés :
- Contenu : un rôle contient des tâches, variables et templates. Une collection peut contenir des modules, plugins, rôles et documentation.
- Namespace : rôle =
auteur.role, collection =namespace.collection. - Installation : rôle via
ansible-galaxy install, collection viaansible-galaxy collection install. - Emplacement par défaut : rôles dans
~/.ansible/roles/, collections dans~/.ansible/collections/. - Format recommandé : les collections sont le format moderne privilégié.
En pratique : pour partager de l'automatisation (tâches, templates, handlers), un rôle suffit. Si vous développez des modules custom, des plugins ou si vous voulez distribuer un ensemble cohérent de composants, utilisez une collection.
Installer et Utiliser des Collections
Installation de collections
# Installer une collection depuis Galaxy
ansible-galaxy collection install community.docker
# Installer une version spécifique
ansible-galaxy collection install community.docker:3.8.0
# Installer dans un chemin personnalisé
ansible-galaxy collection install community.docker -p ./collections
# Installer depuis un fichier tar.gz
ansible-galaxy collection install /chemin/vers/community-docker-3.8.0.tar.gz
# Lister les collections installées
ansible-galaxy collection list
# Vérifier si une collection est installée
ansible-galaxy collection list community.dockerUtiliser les modules d'une collection dans un playbook
Une fois une collection installée, vous utilisez ses modules avec leur nom complet qualifié (FQCN — Fully Qualified Collection Name) :
# playbook.yml
---
- name: Gérer des conteneurs Docker avec la collection community.docker
hosts: docker_hosts
become: true
tasks:
- name: S'assurer que Docker est installé
ansible.builtin.apt:
name: docker.io
state: present
- name: Démarrer le service Docker
ansible.builtin.service:
name: docker
state: started
enabled: true
# Utilisation du module docker_container de community.docker
- name: Lancer un conteneur Nginx
community.docker.docker_container:
name: mon_nginx
image: nginx:latest
state: started
ports:
- "8080:80"
restart_policy: unless-stopped
volumes:
- /var/www/html:/usr/share/nginx/html:ro
# Utilisation du module docker_network
- name: Créer un réseau Docker
community.docker.docker_network:
name: mon_reseau
driver: bridge
# Utilisation du module docker_image
- name: Tirer une image Docker
community.docker.docker_image:
name: redis
tag: "7-alpine"
source: pullVous pouvez également déclarer les collections utilisées au niveau du play avec le mot-clé collections: pour éviter de répéter le namespace complet :
# playbook.yml
---
- name: Gérer les conteneurs
hosts: docker_hosts
become: true
collections:
- community.docker
tasks:
- name: Lancer un conteneur
docker_container:
name: mon_app
image: mon_image:latest
state: startedBonne pratique : utilisez toujours les FQCN (noms complets qualifiés) dans vos playbooks de production. Cela rend le code explicite et évite les conflits si deux collections définissent un module du même nom.
Les Collections Populaires à Connaître
Voici les collections les plus utilisées dans l'écosystème Ansible. Les connaître vous fera gagner un temps considérable.
community.general
C'est la collection "couteau suisse" d'Ansible. Elle contient des centaines de modules qui ne sont pas spécifiques à un éditeur ou une technologie particulière :
# Exemples de modules de community.general
- name: Gérer un dépôt APT
community.general.apt_repo:
repo: "ppa:ondrej/php"
state: present
- name: Attendre qu'un service soit prêt
community.general.wait_for:
host: "{{ db_host }}"
port: 5432
delay: 5
timeout: 60
- name: Gérer les tâches cron avec des noms
community.general.cron:
name: "Sauvegarde quotidienne"
minute: "0"
hour: "2"
job: "/opt/scripts/backup.sh"
- name: Manipuler un fichier INI
community.general.ini_file:
path: /etc/application/config.ini
section: database
option: host
value: db.example.com
- name: Gérer les paquets pip
community.general.pip_package_info:
clients: pip3community.docker
Indispensable pour tout ce qui touche à Docker et Docker Compose :
# Modules clés de community.docker
- name: Gérer un conteneur
community.docker.docker_container:
name: app
image: mon_app:latest
state: started
- name: Gérer Docker Compose
community.docker.docker_compose_v2:
project_src: /opt/mon-projet
state: present
- name: Construire une image
community.docker.docker_image_build:
name: mon_app
tag: latest
path: /opt/mon-projet
- name: Gérer les volumes
community.docker.docker_volume:
name: data_volume
state: present
- name: Se connecter à un registry
community.docker.docker_login:
registry_url: https://registry.entreprise.com
username: "{{ registry_user }}"
password: "{{ registry_password }}"ansible.posix
Collection pour les systèmes POSIX (Linux, macOS) avec des modules essentiels :
# Modules clés de ansible.posix
- name: Gérer les ACL de fichiers
ansible.posix.acl:
path: /var/www/html
entity: www-data
etype: user
permissions: rwx
state: present
- name: Configurer SELinux
ansible.posix.selinux:
state: enforcing
policy: targeted
- name: Monter un système de fichiers
ansible.posix.mount:
path: /mnt/data
src: /dev/sdb1
fstype: ext4
state: mounted
- name: Gérer les limites systèmes (ulimits)
ansible.posix.sysctl:
name: net.ipv4.ip_forward
value: "1"
sysctl_set: true
state: present
reload: true
- name: Synchroniser des fichiers (rsync)
ansible.posix.synchronize:
src: /opt/local/data/
dest: /opt/remote/data/
rsync_opts:
- "--exclude=*.tmp"community.crypto
Pour la gestion des certificats, clés et opérations cryptographiques :
# Générer une clé privée
- name: Créer une clé privée RSA
community.crypto.openssl_privatekey:
path: /etc/ssl/private/server.key
size: 4096
# Générer un CSR
- name: Créer une demande de signature de certificat
community.crypto.openssl_csr:
path: /etc/ssl/certs/server.csr
privatekey_path: /etc/ssl/private/server.key
common_name: www.codeclan.fr
organization_name: CodeClan
# Générer un certificat auto-signé
- name: Créer un certificat auto-signé
community.crypto.x509_certificate:
path: /etc/ssl/certs/server.crt
privatekey_path: /etc/ssl/private/server.key
csr_path: /etc/ssl/certs/server.csr
provider: selfsignedAutres collections notables
- amazon.aws : modules pour AWS (EC2, S3, RDS, Lambda, etc.).
- azure.azcollection : modules pour Microsoft Azure.
- google.cloud : modules pour Google Cloud Platform.
- kubernetes.core : modules pour Kubernetes (k8s, helm).
- community.mysql : gestion de MySQL/MariaDB.
- community.postgresql : gestion de PostgreSQL.
- ansible.netcommon : modules réseau communs.
- community.windows : modules pour Windows.
Créer un Rôle Galaxy-Compatible
Si vous souhaitez publier votre rôle sur Galaxy, il doit respecter certaines conventions pour être bien référencé et facilement utilisable par la communauté.
Initialiser le rôle
# Créer la structure du rôle
ansible-galaxy init mon_role_galaxy
# La structure créée est déjà compatible Galaxy
tree mon_role_galaxy/Remplir les métadonnées (meta/main.yml)
Le fichier meta/main.yml est crucial pour Galaxy. Il fournit toutes les informations nécessaires au référencement de votre rôle :
# meta/main.yml
---
galaxy_info:
role_name: mon_role_galaxy
author: votre_pseudo_github
description: "Rôle pour installer et configurer MonApplication sur Ubuntu et Debian"
company: "CodeClan"
license: "MIT"
min_ansible_version: "2.14"
platforms:
- name: Ubuntu
versions:
- focal # 20.04
- jammy # 22.04
- noble # 24.04
- name: Debian
versions:
- bullseye # 11
- bookworm # 12
- name: EL # Enterprise Linux (RHEL, CentOS, Rocky)
versions:
- "8"
- "9"
galaxy_tags:
- system
- configuration
- web
- nginx
# Liens utiles
issue_tracker_url: https://github.com/votre_user/ansible-role-mon-role/issues
repository: https://github.com/votre_user/ansible-role-mon-role
dependencies: []Écrire un README de qualité
Un bon README est essentiel pour l'adoption de votre rôle. Voici les sections recommandées :
# README.md — Structure recommandée
# Mon Rôle Galaxy
## Description
Brève description du rôle et de ce qu'il fait.
## Prérequis
- Ansible >= 2.14
- Systèmes supportés : Ubuntu 22.04+, Debian 12+
## Variables du rôle
| Variable | Défaut | Description |
|----------|--------|-------------|
| `app_port` | `8080` | Port d'écoute |
| `app_user` | `appuser` | Utilisateur système |
## Dépendances
Liste des rôles dont celui-ci dépend.
## Exemple d'utilisation
Playbook d'exemple.
## Tests
Comment lancer les tests (Molecule).
## Licence
MIT
## Auteur
Votre nomPréparer le dépôt Git
Galaxy s'appuie sur les dépôts GitHub pour héberger les rôles. Voici les conventions à suivre :
# Convention de nommage du dépôt
# Format : ansible-role-{nom_du_role}
# Exemple : ansible-role-nginx
# Initialiser le dépôt Git
cd mon_role_galaxy
git init
git add .
git commit -m "feat: initial role structure"
# Créer un tag de version (sémantique)
git tag -a v1.0.0 -m "Version 1.0.0 - Initial release"
# Pousser vers GitHub
git remote add origin git@github.com:user/ansible-role-mon-role.git
git push origin main --tagsPublier sur Ansible Galaxy
Connexion et import
Pour publier un rôle sur Galaxy, vous devez vous connecter avec votre compte GitHub :
- Rendez-vous sur galaxy.ansible.com et connectez-vous avec GitHub.
- Accédez à "My Content" dans votre profil.
- Cliquez sur "Add Content" et sélectionnez votre dépôt GitHub.
- Galaxy importera automatiquement votre rôle en analysant le
meta/main.yml.
Vous pouvez aussi importer via la ligne de commande :
# Se connecter (nécessite un token GitHub)
# Récupérez votre token sur galaxy.ansible.com > Preferences > API Token
# Importer le rôle
ansible-galaxy role import votre_user ansible-role-mon-role
# Vérifier l'import
ansible-galaxy role info votre_user.mon_roleMettre à jour un rôle publié
Pour publier une nouvelle version, il suffit de créer un nouveau tag Git et de relancer l'import :
# Faire vos modifications
git add .
git commit -m "feat: add SSL support"
# Créer un nouveau tag
git tag -a v1.1.0 -m "Version 1.1.0 - Added SSL support"
git push origin main --tags
# Relancer l'import sur Galaxy
ansible-galaxy role import votre_user ansible-role-mon-rolePublier une collection
La publication d'une collection suit un processus légèrement différent :
# Construire la collection (crée un fichier tar.gz)
ansible-galaxy collection build
# Publier sur Galaxy
ansible-galaxy collection publish ./mon_namespace-ma_collection-1.0.0.tar.gz --api-key YOUR_API_KEYAnsible Automation Hub
En plus d'Ansible Galaxy (communautaire et gratuit), Red Hat propose Ansible Automation Hub, une plateforme de distribution de contenu Ansible certifié et supporté par Red Hat.
Différences entre Galaxy et Automation Hub
- Galaxy : communautaire, gratuit, contenu non certifié. Tout le monde peut publier. Idéal pour les projets personnels et les équipes qui évaluent et testent elles-mêmes les rôles.
- Automation Hub : contenu certifié par Red Hat, support commercial, accès via souscription Red Hat Ansible Automation Platform. Idéal pour les entreprises qui ont besoin de garanties de qualité et de support.
Configurer Automation Hub
Pour utiliser Automation Hub comme source de collections, configurez votre fichier ansible.cfg :
# ansible.cfg
[galaxy]
server_list = automation_hub, galaxy
[galaxy_server.automation_hub]
url = https://console.redhat.com/api/automation-hub/content/published/
auth_url = https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token
token = VOTRE_TOKEN_AUTOMATION_HUB
[galaxy_server.galaxy]
url = https://galaxy.ansible.com/Avec cette configuration, Ansible cherchera d'abord les collections sur Automation Hub (contenu certifié), puis sur Galaxy (contenu communautaire) en fallback.
Private Automation Hub
Les entreprises peuvent également déployer un Private Automation Hub en interne pour héberger leurs propres collections et rôles privés. C'est une solution idéale pour :
- Distribuer du contenu Ansible interne sans le rendre public.
- Contrôler exactement quelles versions de collections sont disponibles pour les équipes.
- Servir de proxy/cache pour Galaxy et Automation Hub.
# ansible.cfg avec Private Automation Hub
[galaxy]
server_list = private_hub, automation_hub, galaxy
[galaxy_server.private_hub]
url = https://hub.entreprise.com/api/galaxy/content/published/
token = VOTRE_TOKEN_PRIVE
[galaxy_server.automation_hub]
url = https://console.redhat.com/api/automation-hub/content/published/
token = VOTRE_TOKEN_RH
[galaxy_server.galaxy]
url = https://galaxy.ansible.com/Bonnes Pratiques pour Gérer les Dépendances Galaxy
Versionner les dépendances
Épinglez toujours les versions de vos dépendances dans requirements.yml. Sans version fixe, une mise à jour automatique d'un rôle ou d'une collection pourrait casser votre infrastructure :
# BIEN : versions fixées
roles:
- name: geerlingguy.docker
version: "6.1.0"
collections:
- name: community.docker
version: "3.8.0"
# À ÉVITER : pas de version
roles:
- name: geerlingguy.docker # Quelle version sera installée ?Intégrer dans le pipeline CI/CD
# .gitlab-ci.yml
---
stages:
- deps
- lint
- test
- deploy
install_dependencies:
stage: deps
script:
- pip install ansible ansible-lint
- ansible-galaxy install -r requirements.yml --force
- ansible-galaxy collection install -r requirements.yml --force
artifacts:
paths:
- roles/
- collections/
lint:
stage: lint
script:
- ansible-lint playbooks/
needs:
- install_dependencies
test:
stage: test
script:
- molecule test
needs:
- install_dependenciesAuditer régulièrement les dépendances
Planifiez des revues régulières de vos dépendances Galaxy :
- Vérifiez si des mises à jour de sécurité sont disponibles.
- Testez les nouvelles versions en staging avant de les déployer en production.
- Remplacez les rôles abandonnés par des alternatives maintenues.
- Envisagez d'internaliser (fork) les rôles critiques pour réduire la dépendance externe.
Ne pas commiter les dépendances
Ajoutez les répertoires de dépendances à votre .gitignore, comme vous le feriez avec node_modules/ :
# .gitignore
roles/geerlingguy.*
roles/devsec.*
roles/cloudalchemy.*
collections/
*.retryExemple Pratique : Projet Complet avec Galaxy
Mettons tout en pratique avec un projet Ansible complet utilisant des rôles et collections Galaxy pour déployer une application web :
# requirements.yml
---
roles:
- name: geerlingguy.docker
version: "6.1.0"
- name: geerlingguy.nginx
version: "3.1.0"
- name: geerlingguy.certbot
version: "4.1.0"
- name: geerlingguy.postgresql
version: "3.4.0"
- name: devsec.hardening
version: "8.0.0"
collections:
- name: community.general
version: "8.0.0"
- name: community.docker
version: "3.8.0"
- name: community.postgresql
version: "3.3.0"
- name: ansible.posix
version: "1.5.4"# playbooks/site.yml
---
- name: Configuration de base et sécurité
hosts: all
become: true
roles:
- role: devsec.hardening
- name: Déployer l'application web
hosts: webservers
become: true
pre_tasks:
- name: Mettre à jour le cache APT
ansible.builtin.apt:
update_cache: true
cache_valid_time: 3600
roles:
- role: geerlingguy.docker
- role: geerlingguy.nginx
vars:
nginx_remove_default_vhost: true
nginx_vhosts:
- listen: "80"
server_name: "app.codeclan.fr"
extra_parameters: |
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
- role: geerlingguy.certbot
vars:
certbot_auto_renew: true
certbot_create_if_missing: true
certbot_certs:
- domains:
- app.codeclan.fr
tasks:
- name: Déployer l'application avec Docker
community.docker.docker_container:
name: mon_application
image: "registry.entreprise.com/mon-app:latest"
state: started
restart_policy: unless-stopped
ports:
- "3000:3000"
env:
DATABASE_URL: "postgresql://{{ db_user }}:{{ db_pass }}@{{ db_host }}:5432/{{ db_name }}"
NODE_ENV: production
- name: Configurer la base de données
hosts: databases
become: true
roles:
- role: geerlingguy.postgresql
vars:
postgresql_databases:
- name: mon_app_db
postgresql_users:
- name: mon_app_user
password: "{{ vault_db_password }}"
db: mon_app_db
priv: "ALL"# Déployer le tout
ansible-galaxy install -r requirements.yml
ansible-galaxy collection install -r requirements.yml
ansible-playbook -i inventory/production playbooks/site.yml --ask-vault-passConclusion
Ansible Galaxy est un accélérateur de productivité indispensable pour tout praticien Ansible. En combinant des rôles communautaires éprouvés avec vos propres rôles métier, vous construisez une automatisation robuste sans partir de zéro. Les collections, format moderne de distribution, enrichissent encore cet écosystème en apportant des modules, plugins et rôles dans des packages cohérents.
Les points clés à retenir :
- Utilisez
requirements.ymlpour déclarer et versionner toutes vos dépendances. - Préférez les collections (format moderne) et utilisez les FQCN dans vos playbooks.
- Évaluez la qualité des rôles avant de les adopter (mises à jour, tests, documentation).
- Contribuez à la communauté en publiant vos propres rôles et collections.
- En entreprise, envisagez Ansible Automation Hub ou un Private Automation Hub pour le contenu certifié.
Dans le prochain article, nous aborderons un sujet critique pour la sécurité de vos déploiements : Ansible Vault. Vous apprendrez à chiffrer vos secrets (mots de passe, clés API, certificats) pour ne jamais les exposer en clair dans vos fichiers Ansible.