Introduction à Ansible pour la Gestion de Configuration et le Déploiement d'Applications

Ansible est un puissant outil d'automatisation écrit en Python, conçu pour la gestion de configuration et le déploiement d'applications. Il intègre les meilleures fonctionnalités des outils d'orchestration existants, offrant des capacités comparables à celles de Puppet et SaltStack.

Ansible excelle dans la gestion et le déploiement d'applications sur des centaines, voire des milliers de machines simultanément. Il élimine la nécessité de se connecter individuellement à chaque serveur pour exécuter des tâches ; toutes les opérations peuvent être centralisées sur un nœud de contrôle Ansible.

L'architecture d'Ansible repose sur des modules. Ansible lui-même fournit le cadre d'exécution, tandis que les modules réalisent les tâches spécifiques. Par exemple, le module copy est utilisé pour transférer des fichiers vers des hôtes distants, et le module service permet de gérer le cycle de vie des services (démarrage, arrêt, redémarrage).

Une caractéristique distinctive d'Ansible est son approche sans agent (Agentless). Contrairement aux systèmes nécessitant l'installation d'un agent sur chaque machine gérée, Ansible fonctionne de manière similaire à une commande standard. Une seule installation d'Ansible sur le nœud de contrôle suffit. Il utilise généralement SSH pour se connecter aux hôtes distants, sans nécessiter de services supplémentaires sur ces derniers.

Lorsque vous exécutez des commandes ou des playbooks Ansible, ceux-ci sont décomposés en tâches exécutables. Ansible utilise ensuite des modules et des plugins pour interagir avec les hôtes cibles via SSH, en envoyant des fichiers temporaires pour exécution et en collectant les résultats. Ces fichiers temporaires sont automatiquement supprimés une fois les tâches terminées.

La plupart des modules Ansible sont idempotents. L'idempotence signifie qu'exécuter une opération plusieurs fois produit le même résultat que de l'exécuter une seule fois, sans effets secondaires indésirables. Par exemple, arrêter un service qui est déjà arrêté n'a aucun impact supplémentaire. De nombreux modules Ansible vérifient d'abord l'état de la cible avant d'exécuter une action, ce qui rend l'exécution répétée de tâches sûre et prévisible.

Installation et Configuration d'Ansible

Prérequis Environnementaux

  • Nœud de contrôle Ansible : 192.168.70.10
  • Hôtes gérés : 192.168.70.5, 192.168.70.15
  1. Installation d'Ansible sur le Nœud de Contrôle
# Installer le dépôt EPEL
sudo yum install -y epel-release

# Installer Ansible
sudo yum install -y ansible

  1. Structure des Répertoires d'Ansible

La configuration principale d'Ansible se trouve dans /etc/ansible/.

  • ansible.cfg : Fichier de configuration principal d'Ansible.
  • hosts : Fichier d'inventaire définissant les hôtes et les groupes à gérer.
  • roles/ : Répertoire pour les rôles réutilisables.
  1. Configuration du Fichier d'Inventaire

Modifiez le fichier /etc/ansible/hosts pour définir vos groupes d'hôtes.

sudo vim /etc/ansible/hosts

[webservers]
192.168.70.5

[dbservers]
192.168.70.15

Vous pouvez aussi utiliser des noms d'hôtes si leur résolution DNS est correctement configurée ou si vous modifiez le fichier /etc/hosts localement.

  1. Configuration de l'Authentification par Clé SSH

Pour permettre à Ansible de se connecter sans mot de passe, configurez l'authentification par clé SSH.

# Générer une paire de clés SSH sur le nœud de contrôle
ssh-keygen -t rsa -b 4096

# Copier la clé publique sur les hôtes gérés
# Assurez-vous que 'sshpass' est installé si vous utilisez des mots de passe temporaires pour la copie
sshpass -p 'votre_mot_de_passe' ssh-copy-id root@192.168.70.5
sshpass -p 'votre_mot_de_passe' ssh-copy-id root@192.168.70.15

Remplacez votre_mot_de_passe par le mot de passe réel de l'utilisateur root sur les hôtes gérés si vous n'utilisez pas de clé pré-existante pour l'utilisateur root. Il est recommandé d'utiliser des utilisateurs non-root avec des privilèges sudo.

Modules en Ligne de Commande Ansible

La syntaxe générale des commandes Ansible est : ansible <groupe_cible> -m <module> -a '<arguments>'</arguments></module></groupe_cible>

ansible-doc : Aide sur les Modules

Pour lister tous les modules disponibles :

ansible-doc -l

Pour obtenir des informations détaillées sur un module spécifique :

ansible-doc -s <nom_du_module>

  1. Module command

Exécute des commandes simples sur les hôtes distants. Il ne supporte pas les fonctionnalités avancées du shell comme les pipes ou les redirections.

# Exécuter la commande 'date' sur l'hôte 192.168.70.5
ansible 192.168.70.5 -m command -a 'date'

# Exécuter 'date' sur tous les hôtes du groupe 'webservers'
ansible webservers -m command -a 'date'

# Exécuter 'ls /' sur tous les hôtes (le module 'command' est utilisé par défaut si aucun module n'est spécifié)
ansible all -a 'ls /'

# Utilisation des paramètres 'chdir', 'creates', 'removes'
ansible all -m command -a "chdir=/home ls ./"

  1. Module shell

Exécute des commandes via le shell de l'hôte distant, supportant les pipes, redirections, et autres fonctionnalités du shell.

# Changer le mot de passe d'un utilisateur via stdin (exemple simplifié)
ansible dbservers -m shell -a 'echo "nouv_mot_de_passe" | passwd --stdin testuser'

# Récupérer l'adresse IP (exemple avec awk et cut)
ansible webservers -m shell -a 'ifconfig ens33 | awk "NR==2 {print \$2}" | cut -d " " -f2'

  1. Module cron

Gère les tâches planifiées (cron jobs) sur les hôtes distants. Paramètres clés : minute, hour, day, month, weekday, job, name, state (present ou absent).

# Ajouter une tâche cron
ansible webservers -m cron -a 'minute="*/5" job="/usr/bin/touch /tmp/testfile" name="create_test_file"'

# Afficher les tâches cron
ansible webservers -a 'crontab -l'

# Supprimer une tâche cron par son nom
ansible webservers -m cron -a 'name="create_test_file" state=absent'

  1. Module user

Gère les comptes utilisateurs. Paramètres clés : name (obligatoire), state (present/absent), uid, group, shell, password (mot de passe chiffré), comment, remove (pour supprimer le répertoire personnel avec l'utilisateur).

# Créer un utilisateur
ansible dbservers -m user -a 'name=appuser uid=1001 group=developers shell=/bin/bash comment="Application User"'

# Supprimer un utilisateur et son répertoire personnel
ansible dbservers -m user -a 'name=appuser state=absent remove=yes'

  1. Module group

Gère les groupes d'utilisateurs. Paramètres clés : name (obligatoire), gid, system (yes/no), state (present/absent).

# Créer un groupe
ansible dbservers -m group -a 'name=developers gid=1001 system=yes'

# Assigner un utilisateur à un groupe principal
ansible dbservers -m user -a 'name=appuser group=developers'

  1. Module copy

Copie des fichiers depuis le nœud de contrôle vers les hôtes gérés. Paramètres clés : src (fichier source), dest (destination), owner, group, mode (permissions), content (pour écrire du contenu directement).

# Copier un fichier de configuration
ansible dbservers -m copy -a 'src=/etc/local/myconfig.conf dest=/etc/myconfig.conf owner=root mode=0644'

# Créer un fichier avec un contenu spécifique
ansible dbservers -m copy -a 'content="ServerName mydomain.com" dest=/etc/httpd/conf.d/custom.conf'

  1. Module file

Gère les fichiers et répertoires (création, suppression, modification de permissions, liens symboliques). Paramètres clés : path (obligatoire), state (touch, directory, link, absent), owner, group, mode, src (pour les liens).

# Créer un répertoire
ansible dbservers -m file -a 'path=/opt/data state=directory owner=appuser mode=0755'

# Créer un lien symbolique
ansible dbservers -m file -a 'path=/opt/app/config.link src=/etc/app/config.prod state=link'

# Supprimer un fichier
ansible dbservers -m file -a 'path=/opt/oldfile.txt state=absent'

  1. Module hostname

Définit le nom d'hôte d'une machine distante. Paramètre clé : name.

ansible dbservers -m hostname -a 'name=db01.example.com'

  1. Module ping

Vérifie la connectivité avec les hôtes distants.

ansible all -m ping

  1. Module yum

Gère les paquets RPM via le gestionnaire de paquets YUM. Paramètres clés : name, state (present/absent).

# Installer un paquet
ansible webservers -m yum -a 'name=nginx state=present'

# Désinstaller un paquet
ansible webservers -m yum -a 'name=httpd state=absent'

  1. Modules service et systemd

Gèrent les services système. Le module systemd est privilégié pour les systèmes utilisant systemd. Paramètres clés : name, state (started, stopped, restarted, reloaded), enabled (yes/no).

# Vérifier l'état d'un service
ansible webservers -a 'systemctl status nginx'

# Démarrer et activer un service au démarrage
ansible webservers -m systemd -a 'name=nginx state=started enabled=yes'

  1. Module script

Exécute un script local sur les hôtes distants.

# Créer un script local
cat << EOF > /tmp/deploy_app.sh
#!/bin/bash
echo "Deployment started..." > /opt/app_deployment.log
# Ajoutez ici vos commandes de déploiement
echo "Deployment finished." >> /opt/app_deployment.log
EOF
chmod +x /tmp/deploy_app.sh

# Exécuter le script sur les hôtes cibles
ansible webservers -m script -a '/tmp/deploy_app.sh'

# Vérifier le résultat sur un hôte distant
ansible webservers -a 'cat /opt/app_deployment.log'

  1. Module setup

Collecte des informations (facts) sur les hôtes gérés.

# Collecter tous les facts
ansible webservers -m setup

# Filtrer les facts pour ne récupérer que les informations réseau IPv4
ansible dbservers -m setup -a 'filter=ansible_all_ipv4_addresses'

Inventaire Ansible

L'inventaire permet de définir les hôtes et de les organiser en groupes logiques.

Formats d'Inventaire

Vous pouvez spécifier des plages d'adresses IP ou des séquences de caractères.

# Fichier /etc/ansible/hosts

[webservers]
192.168.70.5:8080       # Spécifier un port différent de SSH
192.168.70.1[2:5]       # Hosts 192.168.70.12, 192.168.70.13, 192.168.70.14, 192.168.70.15

[dbservers]
db-[a:f].example.org    # Hosts db-a, db-b, ..., db-f

Variables dans l'Inventaire

Vous pouvez définir des variables directement dans le fichier d'inventaire pour personnaliser le comportement d'Ansible.

  • ansible_host : IP ou nom d'hôte à utiliser pour la connexion.
  • ansible_port : Port SSH à utiliser.
  • ansible_user : Utilisateur à utiliser pour la connexion SSH.
  • ansible_password : Mot de passe pour la connexion SSH (moins sécurisé, préférez les clés).
  • ansible_ssh_private_key_file : Chemin vers la clé privée SSH.
  • ansible_become : Permet l'escalade de privilèges (ex: sudo).
  • ansible_become_method : Méthode d'escalade (sudo, su).
  • ansible_become_user : Utilisateur cible après escalade (par défaut root).
  • ansible_become_password : Mot de passe pour l'escalade de privilèges.
  1. Variables au niveau de l'Hôte
[webservers]
server1.example.com ansible_host=192.168.70.20 ansible_user=deployer ansible_ssh_private_key_file=/path/to/deployer_key

  1. Variables au niveau du Groupe Pour définir des variables communes à tous les hôtes d'un groupe :
[webservers:vars]
ansible_user=deployer
ansible_ssh_private_key_file=/path/to/deployer_key
ansible_become=yes
ansible_become_method=sudo

[all:vars]
ansible_port=22

  1. Groupes Imbriqués (Children) Vous pouvez organiser des groupes au sein d'autres groupes pour une gestion hiérarchique.
[nginx_servers]
192.168.70.25
192.168.70.30

[apache_servers]
192.168.70.31
192.168.70.32

[web_cluster:children]
nginx_servers
apache_servers

Cela permet de cibler l'ensemble des hôtes des groupes nginx_servers et apache_servers en utilisant le groupe parent web_cluster.

Étiquettes: Ansible Gestion de configuration automatisation Déploiement SSH

Publié le 12 août à 11h57