Ce guide détaille la mise en place d'un environnement de déploiement automatisé pour une pile applicative complète, utilisant Ansible et des playbooks pour orchestrer l'installation sur plusieurs serveurs Debian.
Environnement Cible
| Système | Adresse IP | Nom d'hôte | Nom de domaine |
|---|---|---|---|
| debian12.8 | 192.168.100.6 | ctrl-ansible | ctrl-ansible.example.com |
| debian12.8 | 192.168.100.12 | noeud-app1 | noeud-app1.example.com |
| debian12.8 | 192.168.100.15 | noeud-app2 | noeud-app2.example.com |
| debian12.8 | 192.168.100.16 | noeud-app3 | noeud-app3.example.com |
Logiciels cibles : Ansible-2.9.13, Nginx-1.26.2, MySQL-8.0.40, Tomcat-10.1.34, Java-JDK11.
Configuration Initiale des Nœuds
Metre à jour les paquets et installer les utilitaires de base :
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y vim
Configurer le nom d'hôte dans /etc/hostname sur chaque machine, par exemple pour le contrôleur :
ctrl-ansible
Exemple de configuration réseau statique dans /etc/network/interfaces :
auto lo
iface lo inet loopback
auto ens33
iface ens33 inet static
address 192.168.100.12
netmask 255.255.255.0
gateway 192.168.100.254
dns-nameservers 8.8.8.8 114.114.114.114
Ajuster la configuration SSH dans /etc/ssh/sshd_config pour autoriser l'accès root par mot de passe si nécessaire, puis générer une paire de clés sur le nœud de contrôle :
ssh-keygen -t ed25519 -C "cle-ansible"
Distribuer la clé publique vers tous les nœuds depuis le contrôleur :
for host in ctrl-ansible noeud-app1 noeud-app2 noeud-app3; do
ssh-copy-id root@$host
done
Installation d'Ansible sur le Nœud de Contrôle
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3 python3-pip python3-dev libffi-dev gcc libssl-dev
pip3 install ansible==2.9.13
Structure des Rôles Ansible
Organisation des fichiers pour le déploiement de la pile LNMT :
deploiement_lnmt/
├── inventaire/
│ └── hosts.yml
├── roles/
│ ├── configuration_base/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── handlers/
│ │ └── main.yml
│ ├── installation_nginx/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ ├── templates/
│ │ │ └── nginx.conf.j2
│ │ └── handlers/
│ │ └── main.yml
│ ├── installation_mysql/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ ├── templates/
│ │ │ └── my.cnf.j2
│ │ └── handlers/
│ │ └── main.yml
│ ├── installation_tomcat/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ ├── templates/
│ │ │ └── server.xml.j2
│ │ └── handlers/
│ │ └── main.yml
│ └── installation_java/
│ ├── tasks/
│ │ └── main.yml
│ └── handlers/
│ └── main.yml
└── playbook_principal.yml
Fichier d'Inventaire
Définition des hôtes dans le fichier YAML :
all:
hosts:
ctrl-ansible:
ansible_host: 192.168.100.6
noeud-app1:
ansible_host: 192.168.100.12
noeud-app2:
ansible_host: 192.168.100.15
noeud-app3:
ansible_host: 192.168.100.16
vars:
ansible_user: root
ansible_ssh_private_key_file: "/chemin/vers/cle_privee"
Playbook Principal et Variables
Fichier playbook_principal.yml :
---
- name: Déploiement complet de l'environnement LNMT
hosts: all
become: true
vars_files:
- variables/globales.yml
roles:
- configuration_base
- installation_java
- installation_mysql
- installation_tomcat
- installation_nginx
Fichier variables/globales.yml contenant les versions et paramètres :
---
mot_de_passe_racine_mysql: "M0tDeP4ss3!Secur1se"
version_java_cible: "11"
version_nginx: "1.26.2"
version_mysql: "8.0.40"
version_tomcat: "10.1.34"
Détails des Rôles
Rôle configuraton_base/tasks/main.yml
---
- name: Mise à jour complète des paquets du système
apt:
update_cache: yes
upgrade: dist
- name: Désactivation de la partition swap
command: "swapoff --all"
notify: supprimer_entree_swap_fstab
- name: Installation des paquets système essentiels
apt:
name:
- build-essential
- libpcre3-dev
- zlib1g-dev
- libssl-dev
- libaio1
- wget
- curl
state: present
- name: Arrêt et désactivation du pare-feu ufw
service:
name: ufw
state: stopped
enabled: false
Fichier correspondant handlers/main.yml :
---
- name: supprimer_entree_swap_fstab
lineinfile:
path: /etc/fstab
regexp: '.*swap.*'
state: absent
Rôle installation_mysql/tasks/main.yml (extrait)
---
- name: Téléchargement des sources de MySQL
get_url:
url: "https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-{{ version_mysql }}.tar.gz"
dest: "/tmp/mysql-{{ version_mysql }}.tar.gz"
- name: Extraction de l'archive MySQL dans /opt
unarchive:
src: "/tmp/mysql-{{ version_mysql }}.tar.gz"
dest: /opt
remote_src: yes
# ... [tâches de compilation, configuration et démarrage similaires mais avec des noms de variables modifiés]
- name: Définition du mot de passe root de MySQL
command: >
/usr/local/mysql/bin/mysqladmin -u root password '{{ mot_de_passe_racine_mysql }}'
Validation du Déploiement
Créer un playbook de vérification, par exemple verifier_services.yml :
---
- name: Vérifier l'état des services déployés
hosts: all
become: true
tasks:
- name: Collecter les informations sur les services systemd
service_facts:
- name: S'assurer que Nginx est actif
assert:
that:
- ansible_facts.services['nginx'].state == 'running'
fail_msg: "Le service Nginx n'est pas démarré."
- name: S'assurer que MySQL est actif
assert:
that:
- ansible_facts.services['mysql'].state == 'running'
fail_msg: "Le service MySQL n'est pas démarré."
- name: S'assurer que Tomcat est actif
assert:
that:
- ansible_facts.services['tomcat'].state == 'running'
fail_msg: "Le service Tomcat n'est pas démarré."
Exécution des commandes depuis le répertoire du projet :
ansible-playbook -i inventaire/hosts.yml playbook_principal.yml
ansible-playbook -i inventaire/hosts.yml verifier_services.yml