Déploiement Automatisé de Serveurs avec Ansible et Playbooks

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

Étiquettes: Ansible playbook nginx MySQL Tomcat

Publié le 6 juillet à 23h20