⚙️ Provisioning — Vagrant & Ansible
| Formation | BTS SIO option SISR — IRIS Mediaschool |
|---|---|
| Bloc | B2 — Administration Systèmes & Cloud |
| Module | M2.4 — Virtualisation & Cloud |
| Prérequis | Virtualisation (C2.4.1), Conteneurisation Docker (C2.4.2) |
🎯 Objectifs
- Créer des environnements virtuels reproductibles avec Vagrant
- Automatiser le provisioning et la configuration avec Ansible
- Écrire des Vagrantfiles et des playbooks Ansible
- Combiner Vagrant et Ansible pour déployer des infrastructures complètes
- Comprendre l'approche Infrastructure as Code (IaC)
📖 Vagrant — Environnements virtuels reproductibles
Qu'est-ce que Vagrant ?
Vagrant est un outil open source développé par HashiCorp qui permet de créer, configurer et gérer des machines virtuelles de manière automatisée et reproductible. Au lieu de configurer manuellement une VM dans VirtualBox ou VMware, on décrit l'environnement souhaité dans un fichier texte appelé Vagrantfile.
L'intérêt principal : chaque membre d'une équipe peut recréer exactement le même environnement en une seule commande (vagrant up). Fini les « ça marche sur ma machine » !
Architecture de Vagrant
- Vagrantfile : fichier Ruby décrivant la configuration de la VM (OS, réseau, provisioning)
- Providers : backends de virtualisation (VirtualBox, VMware, Hyper-V, libvirt)
- Boxes : images de base pré-packagées (ex:
ubuntu/jammy64,debian/bookworm64,generic/rocky9) - Provisioners : outils de configuration automatique (Shell, Ansible, Puppet, Chef)
- Synced folders : dossiers partagés entre l'hôte et la VM
Commandes essentielles
# Initialiser un projet Vagrant
vagrant init ubuntu/jammy64
# Démarrer la VM (télécharge la box si nécessaire)
vagrant up
# Se connecter en SSH à la VM
vagrant ssh
# Arrêter la VM (sans la supprimer)
vagrant halt
# Redémarrer la VM
vagrant reload
# Relancer uniquement le provisioning
vagrant provision
# Supprimer complètement la VM
vagrant destroy -f
# Voir l'état de toutes les VMs
vagrant status
vagrant global-status
Exemple de Vagrantfile
Vagrant.configure("2") do |config|
# Image de base
config.vm.box = "ubuntu/jammy64"
config.vm.hostname = "srv-web"
# Réseau : IP privée sur un réseau host-only
config.vm.network "private_network", ip: "192.168.56.10"
# Port forwarding : accès au port 80 de la VM via le port 8080 de l'hôte
config.vm.network "forwarded_port", guest: 80, host: 8080
# Dossier partagé
config.vm.synced_folder "./site", "/var/www/html"
# Ressources de la VM
config.vm.provider "virtualbox" do |vb|
vb.memory = 2048
vb.cpus = 2
vb.name = "srv-web-ubuntu"
end
# Provisioning avec un script Shell
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
systemctl enable nginx
systemctl start nginx
SHELL
end
Vagrantfile multi-machines
Vagrant permet de décrire plusieurs VMs dans un même fichier, idéal pour simuler une infrastructure complète :
Vagrant.configure("2") do |config|
# Serveur Web
config.vm.define "web" do |web|
web.vm.box = "ubuntu/jammy64"
web.vm.hostname = "srv-web"
web.vm.network "private_network", ip: "192.168.56.10"
web.vm.provider "virtualbox" do |vb|
vb.memory = 1024
vb.cpus = 1
end
end
# Serveur Base de données
config.vm.define "db" do |db|
db.vm.box = "ubuntu/jammy64"
db.vm.hostname = "srv-db"
db.vm.network "private_network", ip: "192.168.56.11"
db.vm.provider "virtualbox" do |vb|
vb.memory = 2048
vb.cpus = 2
end
end
# Serveur de supervision
config.vm.define "monitor" do |mon|
mon.vm.box = "ubuntu/jammy64"
mon.vm.hostname = "srv-monitor"
mon.vm.network "private_network", ip: "192.168.56.12"
mon.vm.provider "virtualbox" do |vb|
vb.memory = 1024
end
end
end
Utilisez vagrant up web pour ne démarrer qu'une seule VM du Vagrantfile multi-machines, ou vagrant ssh db pour vous connecter directement à la VM db.
Boxes Vagrant
Les boxes sont des images de base téléchargées depuis le Vagrant Cloud. Quelques boxes populaires :
| Box | OS | Usage |
|---|---|---|
ubuntu/jammy64 | Ubuntu 22.04 LTS | Serveurs web, développement |
debian/bookworm64 | Debian 12 | Serveurs stables, minimalistes |
generic/rocky9 | Rocky Linux 9 | Alternative à CentOS / RHEL |
gusztavvargadr/windows-server-2022-standard | Windows Server 2022 | Active Directory, services Windows |
📖 Ansible — Automatisation et gestion de configuration
Qu'est-ce qu'Ansible ?
Ansible est un outil d'automatisation IT open source développé par Red Hat. Il permet de configurer des serveurs, déployer des applications et orchestrer des tâches de manière déclarative. Sa particularité : il est agentless (sans agent) — il se connecte aux machines cibles via SSH (Linux) ou WinRM (Windows) sans rien installer dessus.
Concepts fondamentaux
- Inventaire (
inventory) : liste des machines cibles, organisées en groupes - Playbook : fichier YAML décrivant les tâches à exécuter sur les cibles
- Rôle : ensemble structuré de tâches, variables, templates et handlers réutilisable
- Module : unité de travail (ex:
apt,copy,service,user,template) - Task : une action unitaire utilisant un module
- Handler : tâche déclenchée conditionnellement (ex: redémarrer un service après une modification)
- Facts : variables automatiquement collectées sur les hôtes (OS, IP, RAM...)
Fichier d'inventaire
# inventory.ini
[webservers]
srv-web ansible_host=192.168.56.10
[dbservers]
srv-db ansible_host=192.168.56.11
[monitoring]
srv-monitor ansible_host=192.168.56.12
[all:vars]
ansible_user=vagrant
ansible_ssh_private_key_file=.vagrant/machines/web/virtualbox/private_key
Premier playbook
# playbook.yml
---
- name: Installer et configurer Nginx
hosts: webservers
become: yes # exécuter en root (sudo)
tasks:
- name: Mettre à jour le cache apt
apt:
update_cache: yes
cache_valid_time: 3600
- name: Installer Nginx
apt:
name: nginx
state: present
- name: Copier la page d'accueil
copy:
src: files/index.html
dest: /var/www/html/index.html
owner: www-data
group: www-data
mode: '0644'
notify: Redémarrer Nginx
- name: S'assurer que Nginx est démarré et activé
service:
name: nginx
state: started
enabled: yes
handlers:
- name: Redémarrer Nginx
service:
name: nginx
state: restarted
Commandes Ansible
# Tester la connexion à tous les hôtes
ansible all -i inventory.ini -m ping
# Exécuter une commande ad-hoc sur les serveurs web
ansible webservers -i inventory.ini -m shell -a "df -h"
# Lancer un playbook
ansible-playbook -i inventory.ini playbook.yml
# Lancer un playbook en mode check (simulation, sans modification)
ansible-playbook -i inventory.ini playbook.yml --check
# Lancer un playbook avec verbosité
ansible-playbook -i inventory.ini playbook.yml -vvv
# Lister les facts d'un hôte
ansible srv-web -i inventory.ini -m setup
Modules Ansible les plus utilisés
| Module | Description | Exemple |
|---|---|---|
apt / yum | Gérer les paquets | apt: name=nginx state=present |
service | Gérer les services systemd | service: name=nginx state=started |
copy | Copier un fichier vers la cible | copy: src=file.conf dest=/etc/ |
template | Copier un fichier Jinja2 avec variables | template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf |
user | Gérer les utilisateurs | user: name=deploy state=present |
file | Gérer fichiers/répertoires | file: path=/data state=directory mode=0755 |
lineinfile | Modifier une ligne dans un fichier | lineinfile: path=/etc/hosts line="..." |
command / shell | Exécuter une commande | shell: "ufw allow 80/tcp" |
firewalld / ufw | Gérer le firewall | ufw: rule=allow port=443 |
docker_container | Gérer des conteneurs Docker | docker_container: name=web image=nginx |
Variables et templates Jinja2
Ansible utilise le moteur de templates Jinja2 pour générer dynamiquement des fichiers de configuration :
# vars/main.yml
---
server_name: "cours.iris.a3n.fr"
http_port: 80
max_connections: 1024
# templates/nginx.conf.j2
server {
listen {{ http_port }};
server_name {{ server_name }};
worker_connections {{ max_connections }};
location / {
root /var/www/html;
index index.html;
}
}
Structure d'un rôle Ansible
roles/
└── webserver/
├── tasks/
│ └── main.yml # Tâches principales
├── handlers/
│ └── main.yml # Handlers (redémarrages...)
├── templates/
│ └── nginx.conf.j2 # Templates Jinja2
├── files/
│ └── index.html # Fichiers statiques
├── vars/
│ └── main.yml # Variables du rôle
├── defaults/
│ └── main.yml # Variables par défaut (surchargeables)
└── meta/
└── main.yml # Métadonnées et dépendances
Un playbook utilisant des rôles :
# site.yml
---
- name: Configurer les serveurs web
hosts: webservers
become: yes
roles:
- webserver
- name: Configurer les bases de données
hosts: dbservers
become: yes
roles:
- mysql
📖 Combiner Vagrant et Ansible
Le duo parfait
La combinaison Vagrant + Ansible est un workflow très puissant pour le BTS SIO SISR :
- Vagrant crée les VMs (l'infrastructure)
- Ansible configure les VMs (le provisioning)
On obtient ainsi une infrastructure complète reproductible en une seule commande : vagrant up crée les VMs puis lance automatiquement les playbooks Ansible.
Vagrantfile avec provisioning Ansible
Vagrant.configure("2") do |config|
config.vm.define "web" do |web|
web.vm.box = "ubuntu/jammy64"
web.vm.hostname = "srv-web"
web.vm.network "private_network", ip: "192.168.56.10"
web.vm.provider "virtualbox" do |vb|
vb.memory = 1024
end
end
config.vm.define "db" do |db|
db.vm.box = "ubuntu/jammy64"
db.vm.hostname = "srv-db"
db.vm.network "private_network", ip: "192.168.56.11"
db.vm.provider "virtualbox" do |vb|
vb.memory = 2048
end
end
# Provisioning Ansible (lancé après la dernière VM)
config.vm.define "db" do |db|
db.vm.provision "ansible" do |ansible|
ansible.playbook = "site.yml"
ansible.inventory_path = "inventory.ini"
ansible.limit = "all"
end
end
end
Vagrant + Ansible est le combo idéal pour vos TP et projets. Vous pouvez versionner votre Vagrantfile et vos playbooks dans Git, et tout le monde peut recréer l'environnement identique. C'est une compétence très recherchée en entreprise pour les profils SISR.
📖 Comparaison des outils de provisioning
| Critère | Vagrant | Ansible | Docker Compose |
|---|---|---|---|
| Type | Gestion de VMs | Gestion de configuration | Orchestration de conteneurs |
| Cible | Machines virtuelles | Serveurs (physiques, VMs, cloud) | Conteneurs Docker |
| Agent | Nécessite un provider (VirtualBox...) | Agentless (SSH) | Nécessite Docker Engine |
| Langage | Ruby (Vagrantfile) | YAML (playbooks) | YAML (docker-compose.yml) |
| Idempotence | Oui (crée si absent) | Oui (natif) | Oui |
| Usage idéal | Environnements de dev/TP | Configuration de serveurs en production | Déploiement d'applications conteneurisées |
| Isolation | Complète (VM) | Aucune (configure l'existant) | Conteneur (processus isolé) |
📖 Infrastructure as Code (IaC)
Vagrant et Ansible s'inscrivent dans la philosophie Infrastructure as Code : l'infrastructure est décrite dans des fichiers texte versionnés, ce qui apporte :
- Reproductibilité : même résultat à chaque exécution
- Traçabilité : historique des modifications via Git
- Collaboration : les fichiers sont partagés et revus en équipe
- Automatisation : déploiement en une commande
- Documentation vivante : le code décrit l'infrastructure réelle
Ne stockez jamais de mots de passe ou de clés privées en clair dans vos fichiers IaC. Utilisez ansible-vault pour chiffrer les secrets : ansible-vault encrypt vars/secrets.yml
📝 QCM — Testez vos connaissances
- Qu'est-ce que Vagrant ?
- Quel fichier configure un environnement Vagrant ?
- Qu'est-ce qu'un playbook Ansible ?
- Ansible nécessite-t-il un agent sur les machines cibles ?
- Quelle commande lance un environnement Vagrant ?
- Qu'est-ce qu'un rôle Ansible ?
- Quel est l'avantage de combiner Vagrant et Ansible ?
📝 Afficher les corrections
- Un outil de gestion d'environnements de développement virtualisés — Vagrant automatise la création et configuration de machines virtuelles via un Vagrantfile.
- Le Vagrantfile — Le Vagrantfile est un script Ruby décrivant les VM, leurs ressources et leur provisioning.
- Un fichier YAML décrivant les tâches d'automatisation — Le playbook définit les hôtes cibles et les tâches à exécuter dans l'ordre.
- Non, il est agentless — Ansible se connecte via SSH (Linux) ou WinRM (Windows) sans agent installé sur les cibles.
- vagrant up — vagrant up crée et démarre les VM définies dans le Vagrantfile.
- Un ensemble réutilisable de tâches organisées — Les rôles structurent le code Ansible en tasks, handlers, templates, files et defaults.
- Vagrant crée les VM, Ansible les configure automatiquement — Vagrant provisionne les VM avec Ansible pour obtenir un environnement reproductible en une commande.
Vagrant permet de créer des VMs reproductibles en une commande. Ansible automatise la configuration des serveurs de manière agentless via SSH. Ensemble, ils forment un workflow IaC complet : Vagrant crée l'infrastructure, Ansible la configure. Ces outils sont essentiels pour le technicien SISR en entreprise.
