Structurer un projet Ansible
Un projet Ansible qui a grandi sans structure devient rapidement ingérable : des variables redéfinies à plusieurs endroits, des playbooks qui copient du code, des inventaires mélangés. Une architecture propre dès le départ coûte peu et se rentabilise rapidement.
Layout recommandé
mon-projet/
├── ansible.cfg # configuration du projet
├── requirements.yml # dépendances Galaxy
├── .gitignore
├── README.md
│
├── inventory/
│ ├── prod/
│ │ ├── hosts.yml # inventaire production
│ │ ├── group_vars/
│ │ │ ├── all.yml
│ │ │ ├── web.yml
│ │ │ └── db/
│ │ │ ├── vars.yml
│ │ │ └── vault.yml # secrets chiffrés
│ │ └── host_vars/
│ │ └── db01.example.com.yml
│ └── staging/
│ ├── hosts.yml
│ └── group_vars/
│ └── all.yml
│
├── roles/
│ ├── common/
│ ├── nginx/
│ └── myapp/
│
├── playbooks/
│ ├── site.yml # playbook principal
│ ├── web.yml
│ ├── db.yml
│ └── deploy.yml
│
└── collections/ # si installation localeansible.cfg par projet
[defaults]
inventory = inventory/prod/
roles_path = roles/
collections_paths = collections/
remote_user = debian
private_key_file = ~/.ssh/id_ed25519
forks = 20
stdout_callback = yaml
callbacks_enabled = profile_tasks
[ssh_connection]
pipelining = True
control_path = /tmp/ansible-ssh-%%h-%%p-%%rSéparer prod et staging
La séparation par dossier d'inventaire permet de cibler un environnement précis :
# Prod
ansible-playbook -i inventory/prod/ playbooks/site.yml
# Staging
ansible-playbook -i inventory/staging/ playbooks/site.ymlLes variables communes (versions d'applications, configurations générales) vont dans group_vars/all.yml de chaque environnement. Les overrides spécifiques à prod ou staging sont dans leurs propres group_vars/.
.gitignore
# Mots de passe Vault
.vault_pass
*.vault_password
# Fichiers de retry Ansible
*.retry
# Collections et rôles installés localement (à régénérer via requirements.yml)
collections/
# Ne pas ignorer roles/ si les rôles internes sont dans le repo
# Cache Python
__pycache__/
*.pyc
# Fichiers d'inventaire dynamique cache
.cache/Playbooks orientés domaine
Plutôt qu'un playbook monolithique site.yml, décomposer par domaine fonctionnel :
# playbooks/site.yml — orchestrateur principal
---
- import_playbook: common.yml
- import_playbook: web.yml
- import_playbook: db.yml
- import_playbook: monitoring.ymlChaque playbook peut être exécuté indépendamment. Le playbook principal les orchestre dans l'ordre.
README.md minimal
Un README utile répond à : comment lancer le projet, quelles sont les prérequis, comment ajouter un hôte :
# Infrastructure Ansible
## Prérequis
- Python 3.10+, pip
- `pip install ansible ansible-lint`
- `ansible-galaxy install -r requirements.yml`
- Accès SSH aux serveurs (clé dans ~/.ssh/id_ed25519)
## Lancer
```bash
# Déploiement complet prod
ansible-playbook -i inventory/prod/ playbooks/site.yml
# Dry-run
ansible-playbook -i inventory/prod/ playbooks/site.yml --check --diff
# Un seul hôte
ansible-playbook -i inventory/prod/ playbooks/web.yml --limit web01.example.com
```
## Vault
Le mot de passe Vault est dans 1Password, vault "Infra".
`export ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass`