Passer au contenu principal

Organisation (Ansible)

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 locale

ansible.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-%%r

Sé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.yml

Les 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.yml

Chaque 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`