Introduction à Ansible

Ansible est un outil de gestion de configuration qui permet d’automatiser l’installation, les déploiements, l’exécution de tâches et la gestion de configuration sur plusieurs machines en même temps. .

Présentation d’Ansible

La grande force d’Ansible est qu’il est agent-less et utilise SSH pour lancer les actions à réaliser. Donc pas d’agent à installer, seul prérequis la présence de python sur le serveur.

Lorsqu’il y a plusieurs machines à gérer, Ansible se connecte en SSH puis exécute les opérations en parallèle. Cela permet de gagner un temps considérable. Cependant, les tâches sont effectuées dans un ordre définit par l’utilisateur lors du choix de la stratégie: Par défaut Ansible attendra d’avoir fini une tâche (sur tous les hôtes) pour passer à la suivante.

Ansible et plus particulièrement ses modules sont idempotents. Cela signifie qu’une opération donnera le même résultat qu’on l’exécute une ou plusieurs fois. Par exemple, on va vérifier si un utilisateur existe : si c’est le cas, on ne fera rien mais si l’utilisateur n’existe pas alors on viendra le créer.

Principe de fonctionnement

Composants clés

  • Inventory: La liste des systèmes cibles gérés par Ansible sont appelé un inventaire. On distingue deux type d’inventaire : l’inventaire statique constitué d’un fichier décrivant la hiérarchie des serveurs et l’inventaire dynamique fourni par un système centralisé recensant tous les serveurs de l’infrastructure (ex NoCMDB)
  • Playbook: Un playbook est une une séquence de tâches ou de rôles décrits dans un fichier ou format yaml.
  • Rôle: Afin d’éviter d’écrire encore et encore les mêmes playbooks, Ansible supporte le regroupement de fonctionnalités spécifiques dans ce qu’on appelle des rôles.
  • Module:Les tâches et les rôles font appel à des modules mis à disposition avec Ansible. Je vous invite à consulter la liste sur le site d’Ansible.
  • Template: Comme son nom l’indique, un template est un modèle permettant de générer un fichier cible. Ansible utilise Jinja2, un gestionnaire de modèles écrit pour Python. Les « Templates » Jinja2 permettent de gérer des boucles, des tests logiques, des listes ou des variable.

Installation d’Ansible

L’installation la plus propre se fait via l’utilisation d’un environnement virtuel python. Il faut dons dans un premier temps installé python3 et venv.

Sur Ubuntu 18.04

Dans votre répertoire de projets :

sudo apt update
sudo apt -y upgrade
sudo apt install -y build-essential libssl-dev libffi-dev python3-dev python3-pip
virtualenv venv
source venv/bin/activate
pip install ansible

Sur Centos 7 ou Fedora

yum install epel-release
yum install python34 python-pip
pip install -U pip --upgrade
pip install -U virtualenv
virtualenv -p python3 my_venv
source my_env/bin/activate
pip install ansible

Test après installation d’Ansible

Lançons la commande suivante qui va simplement lancer en local (-c local) un shell qui exécutera la commande echo salut B0B

ansible all -i "localhost," -c local -m shell -a ’echo Salut B0B’

Ce qui donne à l’écran :

localhost | success | rc=0 >>
salut B0B

Notion de base

Construction d’un inventaire statique

Ici ne sera abordé que la notion d’inventaire statique.

L’inventaire statique sous Ansible est un fichier au format INI. La déclaration d’un groupe se fait en utilisant le nom du groupe entre crochets. Les machines rattachées à ce groupe sont simplement ajoutées à la suite de la déclaration du groupe (une machine par ligne). Prenez un exemple avec les éléments suivants :

  • un groupe apache constitué de la machine kubi1
  • un groupe mysql avec la machine tower Ci-dessous un fichier d’inventaire correspondant à cette déclaration à placer dans le répertoires inventories sous le nom premier_inventaire.ini:
[apache]
kubi1
[mysql]
tower

Il faut dans un premier temps créer une clé SSH et diffuser la clé publique sur les machines clientes :

ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub kubi1
ssh-copy-id -i ~/.ssh/id_rsa.pub kubi1

Démarrons l’agent SSH qui évitera de rentrer la paraphrase à chaque commande :

ssh-agent bash
ssh-add ~/.ssh/id_rsa

A partir de maintenant il est possible de lancer des commandes unitaires sur l’inventaire au moyen de la commande ansible (nous en verrons d’autres). ansible -i inventories/premier_inventaire.ini -m ping all

kubi1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
tower | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

Le premier paramètre est l’inventaire à utiliser, le second le module à lancer et le dernier la cible. Ici on a all qui exécute le module ping sur toutes les machines se trouvant dans l’inventaire. Il est possible de se limiter à un groupe ou à une salle machine. ansible -i inventories/premier_inventaire.ini -m ping apache On peut associer des arguments aux modules avec l’argument (-a) ansible localhost -m shell -a "python --version"

localhost | CHANGED | rc=0 >>
Python 3.7.4

La commande a fonctionné avec succès. Cet exemple est assez simple mais pour des tâches plus évoluées nous allons faire appel au playbook (livre de recette) d’Ansible. Ces playbooks utilisent la syntaxe très simple YAML

sudo vi playbook.yml
- hosts: localhost
  tasks:
  - shell: echo ’Salut B0B’

Pour exécuter ce playbook il faut utiliser la commande ansible-playbook

ansible-playbook -i "localhost," -c local playbook.yml

L’affichage est un peu différent :

PLAY [localhost] **************************************************************

GATHERING FACTS ***************************************************************
ok: [localhost]

TASK: [shell echo ’Salut B0B’] ************************************************
changed: [localhost]

PLAY RECAP ********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0

Exécution de playbooks sur plusieurs serveurs

Et pour finir lançons le module ( -m ) ping sur les postes fixes :

ansible fixes -m ping

Et bonne nouvelle elle est atteignable :

bob-fixe | success >> {
    "changed": false,
    "ping": "pong"
}

Lors d’un prochain billet nous aborderons l’écriture d’un playbook plus évolué permettant de configurer et d’installer une application. Pour quitter votre environnement virtuel il suffit de taper la commande suivante :

deactivate

Alimenter un blog comme celui-ci est aussi passionnant que chronophage. En passant votre prochaine commande (n'importe quel autre article) au travers des liens produits ci-contre, je touche une petite commission sans que cela ne vous coûte plus cher. Cela ne me permet pas de gagner ma vie, mais de couvrir les frais inhérents au fonctionnement du site. Merci donc à vous!

comments powered by Disqus