I. Présentation

Dans ce tutoriel, nous allons apprendre à prendre en main Ansible et plus précisément afin de gérer un environnement Unix. Un précédent tutoriel exposait l'utilisation d'Ansible afin de gérer des serveurs Windows, vous le trouverez ici : Débutez avec Ansible et gérez vos serveurs Windows

Voici l'architecture de démo que nous allons utiliser :

1 serveur Ansible

2 serveurs Debian 8 (192.168.1.39 et 192.168.1.38)

II. Ansible, qu'est ce que c'est ?

Ansible est un outil qui permet d'automatiser et surtout de centraliser des tâches d'administration. Il s'agit d'un outil open-source qui agira comme un serveur d'administration et à partir duquel il sera possible de gérer plusieurs serveurs ou groupes de serveurs de façon centralisée.

Sans agent, il passe par le protocole SSH pour gérer les serveurs Linux à distance. Il s'agit d'un outil très efficace et complet qui permet des utilisations avancées, nous ne verrons que les bases de son utilisation dans ce tutoriel.

Ansible dispose également d'une interface graphique, elle est néanmoins payante. Son utilisation est généralement recommandée pour de très grosses infrastructures afin d'effectuer un suivi dans l'exécution des tâches, d'avoir différents graphiques, etc.

III. Installation d'Ansible

Nous allons commencer par installer notre serveur Ansible, naturellement, sa position au sein d'un réseau d'entreprise doit être bien pensée. Il doit être capable de joindre tous les serveurs qu'il va devoir gérer avec le protocole SSH. Également, sa sécurité et son accès sont à surveiller de prêt car, par définition, il permettra de lancer des actions sur d'autres serveurs. Je recommande ainsi de mettre en place des procédés d'hardening du serveur, mais également d'audit et de surveillance des logs et des connexions. Chaque accès à cette machine doit être tracé avec attention.

Pour une installation sous Debian 8, saisir les commandes suivantes en tant que root dans un terminal :

apt-get install python-pip pip install ansible

Ansible est donc installé, vous pourrez trouver sa configuration dans le répertoire /etc/ansible.

Voici le détail des fichiers présents par défaut :

hosts : Il s'agit du fichier qui permet de spécifier les machines clientes, celles qui pourront être assujetties aux commandes Ansible et à une gestion au travers Ansible. Également, ce fichier permet de spécifier des groupes de machines, afin d’accélérer la gestion de plusieurs machines disposant d'une même configuration par exemple

ansible.cfg : Il s'agit de la configuration principale d'Ansible, commandes, modules, plugins et configuration SSH s'y trouvent

IV. Rattachement aux serveurs gérés et premières commandes

A présent, notre serveur Ansible est prêt, nous devons établir notre premier contact entre les machines gérées (nos deux serveurs Debian web) et notre "tour de contrôle" qui est notre serveur Ansible. Comme indiqué plus haut, les échanges seront effectués en utilisant le protocole SSH. A ce titre, deux méthodes d'authentifications sont utilisables :

La méthode login/password : Méthode standard et la plus utilisée lors d'une connexion SSH manuelle, on saisie le login avec lequel on souhaite se connecter, puis le mot de passe

: Méthode standard et la plus utilisée lors d'une connexion SSH manuelle, on saisie le login avec lequel on souhaite se connecter, puis le mot de passe La méthode clé : un échange de clé est à établir. Le serveur souhaitant se connecter doit avoir sa clé publique comme autorisée du côté du serveur sur lequel il souhaite se connecter.

Note : pour plus de détails sur les méthodes de connexion, je vous oriente vers cette partie de mon cours SSH : Comprendre maîtriser SSH

Avec Ansible, nous préférons travailler avec l'échange de clé, il serait sinon nécessaire de saisir un mot de passe à chaque fois qu'une exécution de commande est effectuée sur un serveur distant. Cela est difficilement pensable pour plusieurs dizaines de serveurs. Pour cela, il est nécessaire de créer une paire de clé sur notre serveur Ansible, nous utiliserons pour cela la commande "ssh-keygen" :

A présent, je vais envoyer ma clé publique sur tous les serveurs que j'aurai à gérer avec Ansible :

ssh-copy-id root@192.168.1.38 ssh-copy-id root@192.168.1.38

Après chacune de ces deux commandes, le mot de passe de l'utilisateur root sur sera à saisir. Après cela, l'authentification SSH automatiquement prise en compte 🙂

N'oubliez pas la sécurité. Si vous pouvez éviter de vous connecter à vos serveurs managés en tant que root, c'est une bonne chose. Il faut bien évaluer la nécessité d'une connexion en root ainsi que son impact si le serveur Ansible est compromis. Par exemple, l'exécution de scripts de surveillance/monitoring ne nécessite pas forcément les droits root

A présent, nous allons ajouter nos deux serveurs dans la liste des hôtes pris en comptes par Ansible, il s'agit du fichier /etc/ansible/ansible_host. Nous allons plus précisément créer un groupe de machine, dénommé "web". ce groupe sera composé des machines suivantes dans mon cas :

Ainsi, lors qu’avec Ansible je déciderai de lancer des actions sur le groupe "web", toutes les machines composant ce groupe seront ciblées :).

Il faut savoir qu'Ansible permet d'utiliser des modules, qui facilite l'utilisation des fonctionnalités des OS Linux. Par exemple :

Le module "shell" permet de passer des commandes bash au travers Ansible, par exemple : ansible web -m shell -a "ls -l /home/"

permet de passer des commandes bash au travers Ansible, par exemple : Le module "ping" permet de tester l'envoi de commande via Ansible en effectuer un ping, par exemple : ansible web -m ping

permet de tester l'envoi de commande via Ansible en effectuer un ping, par exemple : Le module "apt" permet la gestion des paquet comme la commande "apt-get", par exemple : ansible web -m apt -a name=tree

Voici la liste des modules existants sur le site officiel d'Ansible : Modules Ansible

Vous l'aurez peut-être compris, l’argument "-m" permet de spécifier le module à utiliser, l'argument "-a" permet spécifier les arguments du module et juste après le nom de la commande ("ansible"), le nom de la cible ou du groupe cible doit être spécifié 🙂

Voici quelques tests que vous pourrez réaliser. Une fois que la connectivité réseau et l'authentification SSH par clé sera assurée, utilisons la commande "ping" sur notre groupe de serveur "web" :

ansible web -m ping

Voici le retour attendu :

Nous voyons ici que le retour de la commande, coloré en vert, indique un bloc par serveur, avec l'IP du serveur correspondant à chaque bloc. De cette façon, nous somme capable de voir, pour chaque serveur, si la commande est un succès ou non, et quelques informations supplémentaires.

A présente, essayons d'exécuter un commande standard, tel que "ls", sur chaqun de nos serveurs. Nous utiliserons pour cela le module "shell" comme suivant :

ansible web -m shell -a "ls -l /home/"

Voici le retour attendu :

Une fois encore, nous avons, pour chaque serveur composant notre groupe de serveur "web", le retour de l'opération Ansible, et le retour de la commande, c'est à dire le contenu du /home/ de chaque serveur. On commence ici à voir l'intérêt d'Ansible pour la gestion d'un large parc de serveur.

Même chose avec la commande "uptime" :

ansible web -m shell -a "uptime"

Voici le retour attendu :

Retour intéressant, imaginez que vous ayant à gérer 20 serveur de cette manière, plutôt que de se connecter/déconnecter à chaque fois, il suffit de se connecter à Ansible, de viser le bon groupe de machine (pré-réglé bien sur) et le tour est joué ! 🙂

V. Installation d'un environnement web

Afin d'avoir un contexte un peu plus réaliste, nous allons imaginer le scénario suivant :

Dans une infrastructure web, deux nouveau serveurs viennent d'être mis en production et ils attendent l'installation de leurs services. Nous allons gérer l'installation des serveurs directement depuis Ansible sur nos deux serveurs. Nous installerons Apache2, puis PHP, et enfin nous créerons un premier fichier à la racine web de chaque serveur.

Nous allons utiliser cette fois ci le module "apt" qui permet de gérer les packages pour les OS Debian/Ubuntu comme l'indique la documentation Ansible : module Ansible apt

Chaque module possède son lot de fonctionnalité et de paramètre. Nous pouvons par exemple commencer par mettre à jour notre liste de paquet à partir des dépôts

ansible web -m apt -a update-cache=yes

A présent, nous allons installer les package "php5" et "apache2" :

ansible web -m apt -a name="apache2,php5"

Bien ! Maintenant que notre environnement web est installé. Nous allons placer un fichier "page.html" à la racine de ceux-ci. Nous utiliserons pour cela le module "copy" qui permet de copier des fichiers à distance ! (de la machine Ansible vers les serveurs gérés donc)

Nous allons créer un fichier HTML simple et le copier vers nos deux serveurs en une seule commande. Voici son contenu :

<html> <body> <h1> Serveur web </h1> </body> </html>

Ce fichier est positionné dans le répertoire /opt/ sur mon serveur Ansible et je souhaite le copier dans le répertoire /var/www/html/ de chacun de mes deux serveurs, j'utiliserais le module copy de cette façon :

ansible web -m copy -a "src=/opt/page.html dest=/var/www/html/"

Voici une partie du retour attendu, pour un serveur spécifique..

A noter qu'il est tout a fait possible de gérer d'autres éléments grâce au module "copy", par exemple, affecter directement l'utilisateur et le groupe "www-data" en tant que propriétaire du fichier :

ansible web -m copy -a "src=/opt/page.html dest=/var/www/html/ owner=www-data group=www-data"

Vous pourrez maintenant joindre le fichier "page.html" sur chacun de vos serveurs :). L'opération ici effectuée est relativement simple, on peut imaginer effectuer la même chose aussi simplement pour plusieurs dizaines de serveur, ou au contraire sur un seul, en spécifiant son IP comme suivant :

ansible 192.168.1.38 -m copy -a "src=/opt/page.html dest=/var/www/html/"

Une dernière pour la route, vous souhaitez redémarrer le service apache2 ? On utilisera le module service qui permet d'effectuer ce genre d'opération :

ansible web -m service -a "name=apache2 state=restarted"

Voici le retour attendu :

A présent, rien ne nous empêche de créer un pool de serveur "database" et de configurer ces serveurs de la même manière 🙂

J’essaierai de parler des options plus avancées d'Ansible dans de prochain tutoriels, l'utilisation des playbooks est par exemple très intéressante.