Ansible est un logiciel libre qui permet le déploiement ou l’automatisation de tâches d’administration sur un ou plusieurs serveurs distants de façon simultanée. Nul besoin d’installer un agent comme avec Puppet ou Chef, Ansible se connecte par SSH, le seul prérequis est donc le déploiement de clés publiques sur les serveurs cibles ou d’utiliser un login et un mot de passe.
Automatisation
On peut comparer Ansible à un outil de gestion de configuration, mais il offre plus de possibilités : orchestration, workflow, provisioning d’hôtes, etc. Il permet de répondre à de nombreux besoins d’une infrastructure moderne : déployer du code, configurer des serveurs, déployer des serveurs. Ansible utilise du YAML, ce qui le rend simple, lisible, et abordable. Pas besoin donc d’apprendre Python ou Ruby à l’instar des autres outils disponibles sur le marché. En gros, Ansible est beaucoup plus simple. Qu’il s’agisse de déployer un serveur ou 10 ou 1000, de les provisionner de façon uniforme avec les mêmes configurations, vous en aurez pour votre compte en plus de la rapidité d’exécution, les tâches s’exécutant en temps réel et de façon parallèle sur tous les serveurs.
Installation Ansible
Pour installer Ansible, il faut bien sûr être dans un environnement Linux, j’utilise personnellement Ubuntu, Centos 7 et Archlinux, si vous utilisez une autre distribution, suivez ce lien .
# Sur Centos 7 yum -y install ansible # Ubuntu sudo apt-get install software-properties-common sudo apt-add-repository ppa:ansible/ansible sudo apt-get update sudo apt-get install ansible # Archlinux sudo pacman -S ansible
Les playbooks
Exemple d'un playbook
- name: Installation du serveur hosts: web remote_user: root vars: tasks: - name: Installation des dépendances apt: name={{ item }} update_cache=yes state=latest with_items: - vim - htop - git - name: Création d'un utilisateur when: user is defined user: name={{ user }} comment='Mon nouvel utilisateur' shell=/usr/bin/bash - name: Ajout de la clé SSH when: user is defined authorized_key: user={{ user }} key="{{ lookup('file', '~/ssh/id_rsa.pub') }}" - name: "{{ user }}" devient un sudoer when: user is defined template: src=templates/sudoers.j2 dest=/etc/suoders.d/{{ user }}-sudoer validate='visudo -cf %s'
Un playbook est un fichier au format YAML qui définit un ensemble de tâches à exécuter sur un ou plusieurs serveurs à l’aide de la commande ansible-playbook . Il existe plusieurs modules qui permettent de couvrir les tâches courantes sur un système Linux, au cas échéant il est toujours possible d’exécuter des scripts .
Les Roles Ansible
On peut définir un rôle comme un ensemble de tâches appelées à s’exécuter ensemble (séquentiellement) pour un but donné. Il est courant de trouver un rôle pour une technologie précise. Exemple: Un rôle apache. Dans ce exemple, le rôle se chargera d’installer apache, de le configurer, d’activer les modules nécessaires pour l’application qu’il fera tourner (PHP, Python…).
Une fois ce rôle conçu, il faudra écrire un playbook pour « utiliser » ce rôle. C’est dans un playbook que ce rôle devra être invoqué et paramétré. Supposons qu’il se nomme apache.yml
--- - hosts: all vars: nom_site: "marclabs.com" site_dir: "/var/www" roles: - role: apache apache_vhosts: "{{ nom_site }}":
Ce playbook appelle le rôle apache et redéfinir ses variables nom_site et site_dir . Tout le fonctionnement de ce rôle est abstrait, l’utilisateur ne voyant que ce bout de code. Pour exécuter le rôle suivant, on utilise la commande ansible-playbook disponible sur votre machine après l’installation de ansible.
ansible-playbook apache.yml
Cette commande installera apache avec un vhost du nom de marclabs.com dans le répertoire /var/www/marclabs.com . Comme dit plus haut, toute la logique et les possibilités de paramétrages sont définies dans le rôle, le playbook ne faisant que ce qui a déjà été prévu par le rôle.
Où est donc renseigner le ou les serveurs sur lequel/lesquels déployer ?
Evidemment il faut bien préciser sur quel serveur exécuter ce playbook, cela requiert des options supplémentaires pour la commande ansible-playbook, nous y reviendrons en détail dans un prochain article. Voici à quoi peut ressembler cette commande:
ansible-playbook apache.yml -i "192.168.1.10,192.168.1.11," -u user -b