Ansible est une plate-forme logicielle pour la configuration et la gestion d'ordinateur, permettant de mettre en oeuvre et d'automatiser différentes tâches usuelles. Par exemple, vous pourrez mettre à jour tous vos serveurs en une seule commande ! Autant dire qu'une fois adopté, il vous sera difficile de vous en passer, tant les possibilités sont grandes.

Le site officiel regorge d'informations et la documentation est exhaustive. Vous trouverez tout ce dont vous aurez besoin pour débuter puis parfaire vos connaissances.

Le tutoriel qui va suivre a été réalisé sous Archlinux, et il vous incombe donc d'adapter certaines parties à votre système d'exploitation. Quoi qu'il en soit, la documentation vous sera, comme toujours souvent, d'une grande aide.

Quant à nous, débutons ce tutoriel :

1°) Mise à jour du système :

sudo pacman -Syu

2°) Installation d'Ansible :

sudo pacman -S ansible

Le dossier de configuration se trouve dans /etc/ansible. Par mesure de sécurité, nous allons copier le fichier de configuration initial, pour y revenir en cas de pépins.

cd /etc/ansible
sudo cp ansible.cfg ansible.cfg.save

Ansible s'appuyant sur Python 2, et Archlinux sur Python 3, il va falloir préciser dans notre configuration ce paramètre. Pour cela, on édite le fichier ansible.cfg :

sudo nano ansible.cfg

et on ajoute ceci :

[defaults]
# some basic default values...
ansible_python_interpreter = /usr/bin/python2

On enregistre le tout et on quitte.

3°) Définition du fichier "hosts" d'Ansible :

Nous allons à présent définir un fichier host qui contiendra les machines que nous souhaitons administrer. On crée le fichier :

sudo nano /etc/ansible/hosts

et on y insère :

[host1]
192.168.0.5 ansible_port=2222 ansible_user=root ansible_ssh_private_key_file=/home/bob/.ssh/id_ed25519
    
[host2]
192.168.0.6 ansible_port=2222 ansible_user=root ansible_ssh_private_key_file=/home/bob/.ssh/id_ed25519

[hostn]
 ...

Quelques explications :

ansible_port : correspond au port ssh définit sur la machine distante,
ansible_user : correspond à l'utilisateur autorisé à se connecter sur la machine distante,
ansible_ssh_private_key_file : correspond à la clé autorisée à se connecter sur la machine distante.

On pourra également adopter la syntaxe suivante pour définir des groupes :

[mongroupe]
host1
host2
hostn

ou encore :

[mongroupe]
192.168.0.5
192.168.0.6

Reportez-vous à la section inventaire pour adapter ce fichier à votre configuration.

4°) Introduction aux fonctions "Ad-Hoc" d'Ansible :

Les fonctions ad-hoc représentent une commande attachée à un module, que l'on souhaite solliciter rapidement, sans forcément y revenir par la suite. Les évènements récurrents, eux, seront gérés par des playbooks, nous y reviendrons un peu plus loin.

La liste complète des modules est disponible ici.

Prenons un exemple, avec la commande ping :

ansible all -m ping

-m sert à invoquer le module. Consultez l'aide directement dans votre shell (ansible --help) pour des éclaircissements sur les arguments employés.

La commande donnera :

192.168.0.5 | SUCCESS => {
"changed": false, 
 "ping": "pong"
 }
192.168.0.5 | SUCCESS => {
"changed": false, 
 "ping": "pong"
 } 

C'est pas génial ?! On voit ici que toutes les machines mentionnées dans le fichier /etc/ansible/hosts ont été pinguées. Si on avait souhaité choisir un ordinateur en particulier, il aurait fallu exécuter :

ansible host1 -m ping

Vous aurez compris le principe.

Un autre exemple :

ansible host2 -m command -a "df -h -x tmpfs"

affichera en retour :

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        29G  2.6G   25G  10% /
udev             10M     0   10M   0% /dev

Ici, on visualise l'espace disque host2

Les applications concrètes sont innombrables puisque vous retrouverez l'environnement de votre machine distante. Vous pourrez donc rebooter, installer des paquets, copier des fichiers, etc.

5°) Introduction aux "Playbooks" d'Ansible :

Comme nous l'indiquions au préalable, les playbooks fonctionnent différemment du mode ad-hoc d'Ansible. Là où ce dernier repose sur une commande éphémère et contextuelle, les playbooks, eux, s'inscrivent plus précisément dans l'automatisation de tâches récurrentes, qu'elles soient triviales ou bien plus complexes. Ils sont rédigés en YAML et sont donc relativement simples à appréhender.
La documentation des playbooks est par .

On commence par créé le dossier qui contiendra nos playbooks :

cd /etc/ansible
sudo mkdir playbooks

puis on y édite notre premier fichier *.yml qui nous servira de test :

sudo touch maj.yml

Pour cet exemple, nous allons mettre à jour notre système distant host1 :


sudo nano maj.yml

et on y colle :

---
- hosts: host1
      tasks:
       - name: update
         apt: update_cache=yes
       - name: upgrade
         apt: upgrade=dist

On enregistre et on quitte.

Juste une petite précision : host1 tourne sous Debian 8 "Jessie" d'où l'utilisation d'apt dans mon playbook. Reportez-vous à la documentation sur les modules pour votre distribution.

Dans /etc/ansible/playbooks, on exécute notre playbook en mode verbeux pour s'assurer une lisibilité plus importante :

ansible-playbook maj.yml --verbose

qui devrait afficher ceci :

Using /etc/ansible/ansible.cfg as config file

PLAY [host1]          ********************************************************************

TASK [setup] *******************************************************************
ok: [192.168.0.5]

TASK [update] ******************************************************************
ok: [192.168.0.5] => {"cache_update_time": 1461249455, "cache_updated": true, "changed": false}

TASK [upgrade] *****************************************************************
ok: [192.168.0.5] => {"changed": false, "msg": "Reading package       lists...\nBuilding dependency tree...\nReading state information...\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n", "stderr": "", "stdout": "Reading package lists...\nBuilding dependency tree...\nReading state information...\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n", "stdout_lines": ["Reading package lists...", "Building dependency tree...", "Reading state information...", "0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded."]}

PLAY RECAP *********************************************************************
192.168.0.5         : ok=3    changed=0    unreachable=0    failed=0
   

Tout s'est bien déroulé, on constate que le système n'avait pas de mise à jour présente.

Le tutoriel s'achève ici. Nous avons abordés les fonctions primaires d'Ansible, la documentation et les recherches feront le reste.

Si vous avez des questions, des suggestions, n'hésitez pas à m'en faire part sur le sujet de discussion.

A bientôt ! o/

Répondre…