
Ansible est un logiciel de déploiement/configuration à distance, créé par M. De Hann ( Redhat : Cobbler et Func) et est écrit en python. Il utilise seulement SSH et ne nécessite pas de serveur : une simple station de travail peut suffire. Il est bon de noter qu'il fonctionne en mode push (de Ansible vers le serveur cible). La machine hébergeant Ansible ne nécessite que python 2.4+, et Ansible est extensible en n'importe quel langage.
Cette solution est plutôt dédiée à un usage professionnel.
J'ai mis en œuvre Ansible sur plusieurs systèmes différents : Gentoo et CentOS.
Je décris ici l'installation des deux systèmes.
2 Solutions :
Il est nécessaire d'installer
les dépôts EPEL.
Ensuite :
Pour RHEL 8 :
Pour une base EL8 (Alma Linux), installer
centos-release-ansible (oui oui avec le nom centos dedans) disponible dans le repo extras :
Ensuite :
Ansible est disponible directement, et installable via
Sur la machine qui possède Ansible, configurer le fichier
/etc/hosts avec le nom des hôtes (si DNS non fonctionnel) :
On génère ensuite une paire de clés SSH :
Puis on copie notre clé sur chaque serveur :
On peut vérifier le bon fonctionnement en se connectant à chacune des machines...
Tout se passe dans le fichier
/etc/ansible/hosts. On édite le fichier. Voici un exemple :
Entre crochet, on trouve les groupes d'hôtes, avec les hôtes concernés en dessous.
Ici, j'ai donc 5 groupes, un
rhel7 avec les hôtes
samba et
lamp01 et le groupe
cluster avec
cluster1 et
cluster2 etc...
Il est tout à fait possible d'avoir Ansible installé sur une machine Gentoo, et d'installer des paquets sur une distribution Linux autre (CentOS, Debian ...)
Pour me simplifier la vie, j'ai créé un dossier ansible dans /root et j'ai fait des liens symboliques vers les fichiers de config.
C'est dans /root/ansible que je mets tous mes playbooks (on verra plus bas) :
Ansible s'articule autour de modules.
Plus d'infos sur les modules :
https://docs.ansible.com/ansible/latest/collections/all_plugins.html
Pour tester la communication, on peut utiliser le module ping d'Ansible :
all ici signifie
tous les hôtes :
Pour tester le bon fonctionnement, on va installer htop sur
inf en utilisant le module
dnf:
La console affiche l'état des opérations :
On peut aussi tester sur Gentoo en installant aussi htop sur les 2 machines du groupe
cluster en utilisant le module
portage:
La console affiche moins de choses, puisque les paquets sont déjà installés :
Et un test sur debian, avec le module
apt, installons
htop :
Par exemple, pour mettre à jour les serveurs rhel 7 :
Un playbook est une sorte de mégascript qui va automatiser des tâches de manière séquentielle.
Le chapeau contient :
Les hôtes peuvent être : 1 hôte ou all
Globalement, un playbook est composé de tâches comme ceci :
Voici une illustration avec un playbook "test" pour installer
htop sous Gentoo :
TODO Syntaxe ancienne a réviser
Ici, je vise les hôtes du groupe
cluster, et le playbook ne comporte qu'une seule tâche.
On lance le playbook via la commande
Une autre expérience intéressante consiste à relancer l’exécution du playbook
Tout devrait aller beaucoup plus vite, et à la place de "changed" après chaque instruction, on lit "ok". Les paquets ne sont pas réinstallés s'ils sont déjà présents.
Ce qui veut dire qu’un playbook est plus intelligent qu’un bête script, et ne se contente pas d’exécuter des instructions.
Ansible va garantir quel tel service soit bien actif et qu’il utilise bien le dernier fichier de conf. Ce qui en fait l’outil parfait pour tester vos systèmes automatiquement.
On peut aussi ajouter une section
handlers. Elle permet d'effectuer des actions quand il y a eu un changement. Exemple ici de redémarrage sur RHEL du service httpd :
Dans le cas d'un playbook prévu ainsi, avec all comme hôtes :
Si ce playbook est exécuté avec :
Tous les hôtes vont être concernés.
On peut alors spécifier uniquement certains hôtes en indiquant l'option -l (L minuscule). Exemple ici avec l'hôte ocs :
Ci-dessous, un playbook que j'ai réalisé, pour installer LAMP sur Gentoo :
Cette fois-ci, il n'y a pas que des installations ...
TODO Syntaxe ancienne a réviser
- Installation d'un paquet.
- Copie d'un fichier vers le serveur cible.
- Installation d'un paquet.
- Installation d'un paquet.
- Vérification d'un service sur la position "démarré"
- Exécution d'une commande sur la machine cible, en l'exécutant depuis le répertoire /usr
- Démarrage d'un service.
Le fichier
lamp-gentoo.yml.portage.use.php contient ceci :
Si on souhaite modifier un USE, on édite le fichier
lamp-gentoo.yml.portage.use.php et on relance le playbook. Ce fichier sera mis à jour automatiquement sur les serveurs cible, et php recompilé. Apache par exemple n'étant pas modifié, il ne sera pas recompilé.
Voici l'illustration de l'exécution du playbook :
Ci-dessous, un playbook que j'ai réalisé, pour installer LAMP sur RHEL et dérivées.
A noter l'apparition d'une nouvelle section nommée
handlers comme expliquée précédemment.
Et pour pimenter les choses, l'étape
3 installe plusieurs paquets d'un coup et à l'étape 8 je vous montre une autre syntaxe :
Après mise à jour du système :
- Installation d'un paquet.
- Installation d'un paquet.
- Illustration de l'installation de plusieurs paquets dans une même tâche.
- Installation d'un paquet.
- Vérification d'un service sur la position "démarré" et activé au boot
- Vérification d'un service sur la position "démarré" et activé au boot
- Copier Coller d'un fichier du "serveur Ansible" vers le serveur cible.
- Ouverture du pare-feu
Ce playbook est donc bien complet.
Voici une illustration d'exécution du playbook :
Cette fois-ci un playbook d'installation de SAMBA sur Debian.
A noter qu'il est déjà installé sur le serveur
connex, comme le montrera l'exécution du playbook.
Le playbook :
samba-debian.yml
TODO Syntaxe ancienne a réviser
Le fichier
samba-debian.yml.smb.conf.ansible
On exécute ensuite le playbook :
La console affiche :
- Installation d'un paquet.
- Démarrage d'un service.
- Exécution d'une commande.
- Modification de droits.
- Ajout d'une ligne dans un fichier.
- Copie de fichier + notification
Cette fois-ci un playbook "universel" pour mettre à jour ses serveurs !
Le playbook :
linux-update.yml
TODO Syntaxe ancienne a réviser
On exécute ensuite le playbook :
Tous les hôtes sont concernés.
Afin de rendre universel le playbook, j'ai utilisé
ansible.builtin.package au lieu de dnf ou apt. C'est moins complet que ces derniers, mais pour une mise à jour ça fait l'affaire.
J'ai aussi utilisé
when qui permet de définir une condition en fonction ici de la famille du système ! En effet, entre RedHat et Debian, certains services diffèrent. Le problème est donc réglé avec ces conditions !