Chapitre 2 - Déployer une Infrastructure Docker avec Ansible - Pratique 02
Table des Matières
- Introduction
- Étape 1 : Installer Docker et Docker Compose
- Étape 2 : Créer et Démarrer les Conteneurs
- Étape 3 : Configurer l'Accès SSH pour Ansible
- Étape 4 : Créer l'Inventaire Ansible avec Groupes
- Étape 5 : Lister les Hôtes par Groupe
- Étape 6 : Tester la Connectivité et Exécuter des Commandes
- Étape 7 : Exécuter des Actions Spécifiques sur des Groupes
- Étape 8 : Écrire et Exécuter un Playbook Ansible
- Étape 9 : Vérifier le Déploiement
- Conclusion
Introduction
Dans ce chapitre pratique, nous allons maîtriser l'utilisation avancée d'Ansible pour orchestrer et automatiser une infrastructure Docker moderne et évolutive. Notre environnement sera constitué d'un ensemble diversifié de conteneurs basés sur différentes distributions Linux (Ubuntu, Debian, AlmaLinux), offrant ainsi un terrain d'apprentissage idéal pour :
- Orchestrer et administrer une flotte de conteneurs Docker via une gestion centralisée et industrialisée
- Implémenter des automatisations intelligentes adaptées aux spécificités de chaque distribution Linux (Ubuntu, Debian, AlmaLinux)
- Concevoir une architecture conteneurisée robuste suivant les principes DevOps et les meilleures pratiques
- Établir une stratégie d'automatisation évoluée exploitant tout le potentiel d'Ansible
- Développer des playbooks hautement réutilisables avec une approche modulaire et maintenable
- Mettre en place un pipeline d'automatisation complet de bout en bout
Cette partie 2 vous guidera dans l'automatisation d'une infrastructure Docker hétérogène (Ubuntu, Debian, AlmaLinux) avec Ansible à travers des cas pratiques concrets.
🔧 Étape 1 🛠️ : Installer Docker et Docker Compose
Sur votre machine de contrôle (Ubuntu Desktop 22.04 ou Ubuntu Server 22.04), exécutez les commandes suivantes pour installer Docker et Docker Compose :
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release git
git clone https://github.com/SkillFlowCoach/install-docker-ubuntu2204.git
cd install-docker-ubuntu2204/
chmod +x install-docker.sh
sudo ./install-docker.sh
apt install docker-compose -y
docker-compose version
Important : Ce script d'installation est spécifiquement conçu pour Ubuntu 22.04 et ses dérivés. Pour les autres distributions Linux :
- Debian/Ubuntu autres versions : Consultez la documentation officielle Docker pour Debian ou Ubuntu
- RHEL/CentOS/Fedora : Suivez le guide d'installation sur la documentation RHEL
- SUSE/openSUSE : Référez-vous aux instructions SUSE
Pour toutes les distributions, assurez-vous d'installer également Docker Compose en suivant la documentation dédiée.
🔙 Revenir à la Table des Matières
🔧 Étape 2 🛠️ : Créer et Démarrer les Conteneurs
2.1. Créer un Répertoire de Travail
Créez un nouveau répertoire pour votre projet et accédez-y :
mkdir pratique2
cd pratique2
2.2. Créer le Fichier docker-compose.yml
Créez le fichier docker-compose.yml
:
nano docker-compose.yml
2.3. Contenu du Fichier docker-compose.yml
Architecture de l'infrastructure à créer avec docker-compose :
+----------------------+
| Ansible Controller |
| Ubuntu 22.04 |
| IP: 172.20.0.X |
+----------------------+
|
|
--------------------------------------------------------------------------
| | | | | | |
+---------+ +---------+ +---------+ +---------+ +---------+ +---------+ +---------+
| Node1 | | Node2 | | Node3 | | Node4 | | Node5 | | Node6 | | NodeX |
| Ubuntu | | Debian | | AlmaLin | | AlmaLin | | Ubuntu | | Ubuntu | | (opt) |
| 172.20.0.2| 172.20.0.3| 172.20.0.4| 172.20.0.5| 172.20.0.6| 172.20.0.7| ... |
+---------+ +---------+ +---------+ +---------+ +---------+ +---------+ +---------+
Légende :
- Ansible Controller : Machine principale de contrôle sous Ubuntu 22.04.
- Nodes (Node1 à Node6) :
- Node1 : Ubuntu
- Node2 : Debian
- Node3, Node4 : AlmaLinux
- Node5, Node6 : Ubuntu
- Toutes les machines sont sur le réseau
ansible_network
avec des adresses IP statiques dans le sous-réseau172.20.0.0/24
.
Copiez et collez le contenu suivant dans le fichier, en veillant à ce que la configuration pour les conteneurs AlmaLinux soit correcte :
version: '3'
services:
node1:
image: ubuntu:latest
container_name: node1
networks:
ansible_network:
ipv4_address: 172.20.0.2
command: /bin/bash -c "apt update && apt install -y openssh-server python3 && service ssh start && tail -f /dev/null"
expose:
- "22"
- "80"
node2:
image: debian:latest
container_name: node2
networks:
ansible_network:
ipv4_address: 172.20.0.3
command: /bin/bash -c "apt update && apt install -y openssh-server python3 && service ssh start && tail -f /dev/null"
expose:
- "22"
- "80"
node3:
image: almalinux:latest
container_name: node3
networks:
ansible_network:
ipv4_address: 172.20.0.4
command: /bin/bash -c "yum update -y && yum install -y openssh-server passwd python3 && echo 'root:root' | chpasswd && ssh-keygen -A && /usr/sbin/sshd -D"
expose:
- "22"
- "80"
node4:
image: almalinux:latest
container_name: node4
networks:
ansible_network:
ipv4_address: 172.20.0.5
command: /bin/bash -c "yum update -y && yum install -y openssh-server passwd python3 && echo 'root:root' | chpasswd && ssh-keygen -A && /usr/sbin/sshd -D"
expose:
- "22"
- "80"
node5:
image: ubuntu:latest
container_name: node5
networks:
ansible_network:
ipv4_address: 172.20.0.6
command: /bin/bash -c "apt update && apt install -y openssh-server python3 && service ssh start && tail -f /dev/null"
expose:
- "22"
- "80"
node6:
image: ubuntu:latest
container_name: node6
networks:
ansible_network:
ipv4_address: 172.20.0.7
command: /bin/bash -c "apt update && apt install -y openssh-server python3 && service ssh start && tail -f /dev/null"
expose:
- "22"
- "80"
networks:
ansible_network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
Remarques Importantes :
- Python3 est installé sur tous les conteneurs pour assurer la compatibilité avec Ansible.
- Les conteneurs AlmaLinux exécutent
sshd -D
pour garder le conteneur actif. - Les ports
22
et80
sont exposés pour SSH et HTTP.
2.4. Démarrer les Conteneurs
Exécutez la commande suivante pour démarrer tous les conteneurs en arrière-plan :
docker-compose up -d
Vérifiez que les conteneurs sont en cours d'exécution :
docker ps
🔙 Revenir à la Table des Matières
🔧 Étape 3 🛠️ : Configurer l'Accès SSH 🔑 pour Ansible
3.1. Générer une Clé SSH (si elle n'existe pas)
Générez une clé SSH sans phrase de passe :
ssh-keygen -t rsa -b 2048 -N "" -f ~/.ssh/id_rsa
3.2. Copier la Clé Publique vers Chaque Conteneur
Pour tous les conteneurs (node1
à node6
) :
for i in {1..6}; do
docker exec -it node$i mkdir -p /root/.ssh
docker cp ~/.ssh/id_rsa.pub node$i:/root/.ssh/authorized_keys
docker exec -it node$i chmod 600 /root/.ssh/authorized_keys
done
3.3. Vérifier la Connexion SSH pour Chaque Conteneur
Supprimez les anciennes entrées d'hôtes connus pour éviter les conflits (optionnelle):
Vérifiez la connexion SSH :
for i in {1..6}; do
IP=172.20.0.$((i+1))
ssh -o StrictHostKeyChecking=no root@$IP exit
done
🔙 Revenir à la Table des Matières
🔧 Étape 4 🛠️ : Créer l'Inventaire Ansible avec Groupes
Créez un fichier inventory.ini
dans votre répertoire de travail :
nano inventory.ini
Ajoutez le contenu suivant :
[node_containers]
node1 ansible_host=172.20.0.2 ansible_user=root ansible_python_interpreter=/usr/bin/python3
node2 ansible_host=172.20.0.3 ansible_user=root ansible_python_interpreter=/usr/bin/python3
node3 ansible_host=172.20.0.4 ansible_user=root ansible_python_interpreter=/usr/bin/python3
node4 ansible_host=172.20.0.5 ansible_user=root ansible_python_interpreter=/usr/bin/python3
node5 ansible_host=172.20.0.6 ansible_user=root ansible_python_interpreter=/usr/bin/python3
node6 ansible_host=172.20.0.7 ansible_user=root ansible_python_interpreter=/usr/bin/python3
[web]
node1
node5
[database]
node2
node3
[mail]
node4
node6
🔙 Revenir à la Table des Matières
🔧 Étape 5 🛠️ : Lister les Hôtes par Groupe
5.1. Lister les Hôtes du Groupe web
ansible web -i inventory.ini --list-hosts
5.2. Lister les Hôtes du Groupe mail
ansible mail -i inventory.ini --list-hosts
5.3. Lister Tous les Hôtes Définis
ansible all -i inventory.ini --list-hosts
5.4. Lister les Détails d'un Hôte Spécifique (node1
)
ansible node1 -i inventory.ini --list-hosts
🔙 Revenir à la Table des Matières
🔧 Étape 6 🛠️ : Tester la Connectivité et Exécuter des Commandes
6.1. Tester la Connectivité avec ping
pour Tous les Conteneurs
ansible all -m ping -i inventory.ini
6.2. Afficher la Date Actuelle sur node1
ansible node1 -m command -a "date" -i inventory.ini
6.3. Afficher la Date Actuelle sur Tous les Conteneurs
ansible all -m command -a "date" -i inventory.ini
🔙 Revenir à la Table des Matières
🔧 Étape 7 🛠️ : Exécuter des Actions Spécifiques sur des Groupes
7.1. Redémarrer le Service Apache sur le Groupe web
Nous devons tenir compte des différences entre les distributions :
- Sur Ubuntu/Debian, le service Apache s'appelle
apache2
. - Sur AlmaLinux, le service s'appelle
httpd
.
Cependant, dans le groupe web
, nous avons node1
et node5
, qui sont tous deux des conteneurs Ubuntu. Nous utiliserons donc apache2
.
Installer Apache sur le Groupe web
:
ansible web -m apt -a "name=apache2 state=present" -i inventory.ini
Démarrer et Activer le Service Apache :
ansible web -m service -a "name=apache2 state=started enabled=yes" -i inventory.ini
Redémarrer le Service Apache sur le Groupe web
ansible web -m service -a "name=apache2 state=restarted" -i inventory.ini
Note : Si vous aviez des conteneurs AlmaLinux dans le groupe web
, vous devriez utiliser des conditions ou séparer les tâches.
7.2. Vérifier l'Uptime sur le Groupe mail
Le conteneur node4
(AlmaLinux) semble ne pas avoir la commande uptime
installée par défaut. Nous allons installer procps
qui fournit uptime
.
7.2.1. Installer procps
sur les Conteneurs AlmaLinux
ansible mail -m yum -a "name=procps-ng state=present" -i inventory.ini
7.2.2. Vérifier l'Uptime
ansible mail -m command -a "uptime" -i inventory.ini
ansible node4 -m command -a "uptime" -i inventory.ini
ansible node6 -m command -a "uptime" -i inventory.ini
7.3. Vérifier l'Utilisation du Disque sur le Groupe database
La commande df
devrait être disponible sur toutes les distributions.
ansible database -m command -a "df -h" -i inventory.ini
7.4. Installer vim
sur le Groupe database
Nous avons des conteneurs Ubuntu/Debian et AlmaLinux dans le groupe database
. Nous devons utiliser le gestionnaire de paquets approprié pour chaque distribution.
7.4.1. Créer un Playbook pour Gérer les Différentes Distributions
Créez un fichier install_vim.yml
:
nano install_vim.yml
Contenu :
- name: Install vim on database servers
hosts: database
become: yes
tasks:
- name: Install vim on Debian-based systems
apt:
name: vim
state: present
when: ansible_facts['os_family'] == 'Debian'
- name: Install vim on RedHat-based systems
yum:
name: vim-enhanced
state: present
when: ansible_facts['os_family'] == 'RedHat'
7.4.2. Exécuter le Playbook
ansible-playbook -i inventory.ini install_vim.yml
🔙 Revenir à la Table des Matières
🔧 Étape 8 🛠️ : Écrire et Exécuter un Playbook Ansible
8.1. Créer un Playbook pour Configurer Apache sur Tous les Serveurs Web
Créez un fichier configure_apache.yml
:
nano configure_apache.yml
Contenu :
- name: Configure Apache on Web Servers
hosts: web
become: yes
tasks:
- name: Install Apache on Debian-based systems
apt:
name: apache2
state: present
when: ansible_facts['os_family'] == 'Debian'
- name: Start Apache on Debian-based systems
service:
name: apache2
state: started
enabled: true
when: ansible_facts['os_family'] == 'Debian'
- name: Install Apache on RedHat-based systems
yum:
name: httpd
state: present
when: ansible_facts['os_family'] == 'RedHat'
- name: Start Apache on RedHat-based systems
service:
name: httpd
state: started
enabled: true
when: ansible_facts['os_family'] == 'RedHat'
- name: Create index.html
copy:
content: "<h1>Bienvenue sur votre serveur web!</h1>"
dest: /var/www/html/index.html
8.2. Exécuter le Playbook
ansible-playbook -i inventory.ini configure_apache.yml
🔙 Revenir à la Table des Matières
🔧 Étape 9 🛠️ : Vérifier le Déploiement
9.1. Obtenir les Adresses IP des Conteneurs
for i in {1..6}; do
IP=172.20.0.$((i+1))
echo "node$i IP: $IP"
done
9.2. Vérifier l'Accès aux Serveurs Web
Utilisez curl
pour tester les serveurs web :
for i in 1 5; do
IP=172.20.0.$((i+1))
echo "Testing node$i at $IP:"
curl http://$IP
echo -e "\n------------------------\n"
done
Vous devriez voir le message :
<h1>Bienvenue sur votre serveur web!</h1>
Conclusion
Nous avons réussi à :
- Installer Docker et Docker Compose.
- Créer et démarrer plusieurs conteneurs Docker de différentes distributions.
- Configurer l'accès SSH pour Ansible.
- Créer un inventaire Ansible avec des groupes.
- Exécuter des commandes spécifiques en tenant compte des différences entre les distributions.
- Écrire et exécuter des playbooks Ansible pour automatiser des tâches.
Conseils Supplémentaires
- Modules Ansible Appropriés : Utilisez le module
apt
pour Debian/Ubuntu etyum
pour RedHat/AlmaLinux. - Conditions dans les Playbooks : Utilisez les conditions
when
pour exécuter des tâches spécifiques à une distribution. - Installer les Paquets Nécessaires : Assurez-vous que les commandes que vous voulez utiliser sont disponibles (par exemple, installer
procps
pour la commandeuptime
sur AlmaLinux). - Gestion des Services : Le nom du service Apache diffère selon la distribution (
apache2
vshttpd
).