LightcodeSysadmin Open Source

Présentation du logiciel Ansible

Ansible est un logiciel permettant de configurer des machines à l’instar de Chef ou de Puppet. Son principal atout sur ces concurrents est sa mise en place rapide. Nous verrons dans cet article ce qui fait la force d’Ansible.

Introduction

Un logiciel de gestion de configuration est un programme qui va configurer nos serveurs à notre place. En réalité, nous allons donner au programme des recettes, c’est-à-dire une liste de tâches que l’on devra effectuer sur le serveur pour l’installer. Les tâches peuvent être assez variées, mais voici un exemple simple en langage humain :

  • S’assurer que le paquet “ntp” est installé
  • S’assurer que le service NTP écoute uniquement sur localhost
  • S’assurer que le service NTP est bien démarré

Cet exemple est basique, mais la plupart des actions à réaliser sur un serveur peuvent s’expliquer aussi simplement. L’intérêt d’utiliser ce type de logiciel plutôt que de tout faire à la main est que vous allez pouvoir installer et réinstaller le serveur beaucoup plus rapidement. Certes, la première fois vous devrez écrire les règles, mais ensuite pour les installations suivantes, vous aurez juste à réutiliser les recettes que vous aviez déjà créées. Dans les clusters, on utilise plusieurs machines avec une configuration identique (par exemple, des serveurs web). Avec un logiciel de gestion de configuration, vous allez pouvoir facilement déployer une même série de tâches sur plusieurs serveurs.

Pour terminer avec les logiciels de configuration, sachez qu’il est possible, et même conseillé, de l’utiliser avec un logiciel de gestion de version comme Git. Vous pourrez ainsi garder une trace des modifications réalisées sur vos recettes. C’est également un bon moyen de sauvegarde pour éviter de les perdre.

Ansible est simple parce qu’il fonctionne “sans agent” (agentless). Cela veut dire qu’on n’a pas besoin d’installer d’agent du côté des machines à administrer. Un agent est un programme qui est démarré sur la machine à administrer et qui attend les ordres du logiciel de configuration. Ansible a uniquement besoin d’avoir une connexion SSH vers le serveur.

L’autre point qui rend Ansible simple à utiliser est le langage choisi pour écrire les recettes : le YAML. Comme le XML ou le JSON, le YAML permet de décrire des structures de données. Mais contrairement aux deux autres, il est beaucoup plus facile à lire par un humain car il est moins verbeux. Voici un exemple avec les tâches décrites plus haut :

- name: S'assurer que le paquet "ntp" est installé
  yum: pkg=ntp state=present

- name: S'assurer que le service NTP écoute uniquement sur localhost
  lineinfile: >
    dest=/etc/ntp.conf
    line='interface ignore wildcard'
    insertbefore='^restrict 127\.0\.0\.1'    

- name: S'assurer que le service NTP est bien démarré
  service: name=ntpd state=started enabled=yes

Comme vous pouvez le voir, les tâches s’écrivent assez simplement. Chaque bloc est un élèment d’une liste, les mots suivits du caractère : sont des mots-clés. La mot-clé name est utilisée pour décrire la tâche. Les mots-clés que l’ont trouvent juste en dessous sont des noms de modules (yum, lineinfile et service). Ansible dispose d’une grande variété de module dans le coeur de l’application pour vous permettre de réaliser toute sorte de tâches.

Enfin, sachez que vous pouvez également créer vos propres modules si vous ne trouvez pas votre bonheur. Les modules peuvent être programmés en Python, le langage conseillé, ou dans d’autres langages, à condition qu’ils puissent s’exécuter sur la machine cible.

Principe et mise en place

Il y a plusieurs moyens pour installer Ansible, j’ai choisi d’utiliser le gestionnaire de paquet de CentOS 7 :

# yum install ansible

Une fois passé la phase d’installation, vous pouvez configurer Ansible avec le fichier /etc/ansible/ansible.cfg. Je vous laisse vous en occuper à l’aide de la documentation d’Ansible, nous allons maintenant voir comment ajouter des hôtes.

Nous allons faire la suite des opérations avec l’utilisateur “ansible” pour plus de sécurité. Le fichier /etc/ansible/hosts peut être utilisé pour sauvegarder les hôtes, mais je préfère faire un fichier séparé que je mettrai dans la même arborescence que le reste de mes recettes. Cela permet de sauvegarder plus facilement l’ensemble de l’installation. Ce fichier va permettre d’enregistrer les hôtes et de les ranger dans des groupes. Voici un exemple de fichier :

[www]
www1.example
www2.example

[admin_servers]
ansible.example    ansible_connection=local allow_root_password=true

Dans cet exemple, nous avons créé un groupe “www” et un groupe “admin_servers”, les lignes suivant les noms de groupes sont le FQDN des serveurs. A côté du FQDN du serveur, il est possible de définir des variables, dans notre cas, nous précisons que “ansible.examble” est une machine locale.

La connexion SSH doit être réalisée à l’aide d’une clé SSH. Si ce n’est pas déjà fait, il faut générer une paire de clé sur l’hôte où est installé Ansible :

ansible@ansible$ ssh-keygen -t rsa -b 2048

Ensuite, sur ce même hôte, on va pouvoir ajouter la clé publique sur nos autres serveurs avec cette commande :

ansible@ansible$ ssh-copy-id -i /home/ansible/.ssh/id_rsa root@www1.example

Note : le compte root est utilisé ici car Ansible sera amené à exécuter des commandes ayant besoin de privilèges élevés, par exemple pour installer des paquets. Il est toutefois possible de modifier la configuration pour qu’il se connecte avec un autre compte utilisateur et utilise sudo pour exécuter ses commandes.

Les playbooks

Le dernier élément que je voulais aborder est la création de playbooks. Ils permettent d’associer les tâches avec les hôtes. Le but de cet article n’étant pas de faire un tutoriel exhaustif, je vous invite à vous rendre sur la documentation pour avoir de plus amples informations. Voici un petit exemple de playbook :

---
- hosts: www
  remote_user: root
  tasks:
  - name: S'assurer que le paquet "ntp" est installé
    yum: pkg=ntp state=present

  - name: S'assurer que le service NTP écoute uniquement sur localhost
    lineinfile: >
      dest=/etc/ntp.conf
      line='interface ignore wildcard'
      insertbefore='^restrict 127\.0\.0\.1'      

  - name: S'assurer que le service NTP est bien démarré
    service: name=ntpd state=started enabled=yes

Ce fichier est une liste contenant à chaque fois un mot-clé hosts qui permet de sélectionner un hôte ou un groupe d’hôtes. Le mot-clé remote_user est là pour définir sur quel compte distant nous nous connecterons en SSH. Ce doit être obligatoirement un compte qui a notre clé publique. Nous retrouvons ensuite les tâches énoncées plus haut, regroupées sous le mot-clé tasks

Pour exécuter notre playbook, il suffit de taper cette commande :

ansible@ansible$ ansible-playbook -i hosts playbook.yml

Le paramètre -i permet de spécifier un fichier d’hôtes, playbook.yml est le fichier contenant notre playbook. Vous pouvez maintenant voir vos tâches qui s’exécutent les unes après les autres. On peut voir leur statut : réussie (success), échouée (failed) ou changée (changed). Le statut “changée” désigne une tâche qui a modifié la configuration du serveur alors que “réussie” veut dire qu’il n’y a pas eu de modification.

Conclusion

Dans cet article, nous venons juste effleurer l’écriture de playbooks. Il est possible de créer des rôles, ce sont des dossiers contenant des tâches et des fichiers qui sont regroupés dans une même catégorie. Par exemple, on peut créer un rôle “serveur web” dans lequel on aura des tâches pour installer nginx, le configurer… Une autre fonctionnalité pratique d’Ansible est le fait de tagguer certaines tâches, cela permet ensuite de n’exécuter que les tâches portant un tag donné avec la commande ansible-playbook. Enfin, il est également possible de créer des fichiers contenant des variables afin de personnaliser les hôtes ou un groupe d’hôtes. Cela permet de rendre nos rôles réutilisables dans d’autre cas, simplement en modifiant des variables.

Ansible permet d’administrer plus proprement les serveurs en gardant des fichiers de configuration maintenables, regroupés au sein d’un espace clairement définit. Cela permet d’arrêter enfin d’administrer son serveur en s’y connectant directement et en modifiant des fichiers éparpillés aux quatre coins du système. De plus, l’utilisateur de logiciel de gestion de version apporte un vrai plus dans le suivit des modifications effectués sur le serveur. Je vous conseille fortement d’utiliser Ansible pour installer vos nouvelles machines, et ce, que vous ayez un ou quelques milliers de serveurs.