27 mars 2018

Ansible, Premiers pas vers un IT moderne

Par Jean-Marc Amon

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

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