Concepts clés
| Concept | Description |
|---|---|
| Inventaire | Liste des machines cibles (hosts) |
| Playbook | Fichier YAML décrivant les tâches à exécuter |
| Role | Collection réutilisable de tâches, handlers, variables |
| Module | Unité d'action (apt, copy, service, template...) |
| Task | Appel d'un module avec des paramètres |
| Handler | Tâche déclenchée par un notify (ex: redémarrer nginx) |
| Facts | Informations collectées sur les machines cibles |
Inventaire
# inventory.ini
[web]
web-01 ansible_host=10.0.1.10
web-02 ansible_host=10.0.1.11
[db]
db-01 ansible_host=10.0.2.10
[production:children]
web
db
[all:vars]
ansible_user=deploy
ansible_ssh_private_key_file=~/.ssh/deploy_keyCommandes ad-hoc
$ansible all -i inventory.ini -m ping
Tester la connectivité de tous les hosts
$ansible web -m shell -a 'uptime'
Exécuter une commande sur le groupe web
$ansible db -m apt -a 'name=postgresql state=present' --become
Installer PostgreSQL sur les serveurs DB
$ansible all -m setup
Collecter les facts de toutes les machines
Playbook
# deploy.yml
---
- name: Deploy web application
hosts: web
become: true
vars:
app_version: "2.1.0"
app_port: 3000
tasks:
- name: Install Node.js
apt:
name: nodejs
state: present
update_cache: true
- name: Create app directory
file:
path: /opt/app
state: directory
owner: deploy
group: deploy
mode: "0755"
- name: Copy application files
copy:
src: ./dist/
dest: /opt/app/
owner: deploy
notify: Restart app
- name: Deploy systemd service
template:
src: templates/app.service.j2
dest: /etc/systemd/system/app.service
notify: Restart app
- name: Ensure app is running
systemd:
name: app
state: started
enabled: true
daemon_reload: true
handlers:
- name: Restart app
systemd:
name: app
state: restarted$ansible-playbook -i inventory.ini deploy.yml
$ansible-playbook deploy.yml --check
Dry run — affiche ce qui serait changé sans l'appliquer
$ansible-playbook deploy.yml --diff
Affiche les différences dans les fichiers modifiés
$ansible-playbook deploy.yml --limit web-01
Exécuter uniquement sur un host spécifique
$ansible-playbook deploy.yml --tags deploy
Exécuter uniquement les tâches avec le tag 'deploy'
Roles
roles/
└── nginx/
├── tasks/
│ └── main.yml
├── handlers/
│ └── main.yml
├── templates/
│ └── nginx.conf.j2
├── files/
├── vars/
│ └── main.yml
└── defaults/
└── main.yml
# Utilisation dans un playbook
- hosts: web
roles:
- nginx
- { role: app, app_version: "2.1.0" }$ansible-galaxy init mon-role
Créer la structure d'un rôle
$ansible-galaxy install geerlingguy.docker
Installer un role depuis Galaxy
Templates Jinja2
# templates/nginx.conf.j2
server {
listen {{ app_port | default(80) }};
server_name {{ ansible_fqdn }};
location / {
proxy_pass http://127.0.0.1:{{ backend_port }};
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
{% if ssl_enabled %}
listen 443 ssl;
ssl_certificate {{ ssl_cert_path }};
ssl_certificate_key {{ ssl_key_path }};
{% endif %}
}Modules courants
| Module | Usage |
|---|---|
apt / yum | Gestion des paquets |
copy | Copier des fichiers |
template | Déployer des templates Jinja2 |
file | Gérer fichiers et répertoires |
service / systemd | Gérer les services |
user / group | Gérer utilisateurs et groupes |
git | Cloner des repos |
docker_container | Gérer des conteneurs Docker |
uri | Requêtes HTTP |
wait_for | Attendre qu'un port soit ouvert |
Bonnes pratiques
- Idempotence : relancer le playbook ne doit rien casser
- Handlers : utiliser
notifypour les redémarrages de services - Vault : chiffrer les secrets avec
ansible-vault - Tags : taguer les tâches pour des exécutions sélectives
- Check mode : toujours tester avec
--checkavant d'appliquer
$ansible-vault encrypt vars/secrets.yml
Chiffrer un fichier de secrets
$ansible-playbook deploy.yml --ask-vault-pass
Exécuter avec un fichier vault