Loading search data...

Débuter avec Ansible pour gérer votre infrastructure

Le premier billet de la formation ansible qui sera je l’espère une longue série.

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.

La gestion des configurations est un processus dont l’objectif à configurer les systèmes informatiques, les serveurs et les logiciels dans un état précis et à le préserver.

Présentation d’Ansible

La première version d’Ansible est sorti en 2012 et son créateur s’appelle Michael DeHaan. Initialement appelée AnsibleWorks Inc, la société finançant l’outil ansible a été acquise en 2015 par RedHat qui lui a été racheté par IBM en 2018.

Comment utiliser Ansible ?

Principe de fonctionnement

La grande force d’Ansible est qu’il facile à mettre en oeuvre car il est agent-less et ne nécessite qu’une connexion SSH et la présence de python pour lancer les taches à réaliser.

Lorsqu’il y a plusieurs machines à gérer, Ansible 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.

Ansible

Composants clés

  • Node Mannager: ou control node, est le poste depuis lequel tout est executé via des connexions, essentiellement en SSH, aux nodes de l’inventaire. à sa connexion SSH.
  • Playbook: Un playbook Ansible est une séquence de tâches ou de rôles décrits dans un fichier ou format yaml.
  • Inventory: La liste des systèmes cibles gérés par Ansible est 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 nodes de l’infrastructure (ex NoCMDB)
  • 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.
  • Notifier: indique que si une tâche change d’état (et uniquement si la tâche a engendré un changement), notify fait appel au handler associé exécuter une autre tâche.
  • Handler: Tâche qui n’est appelée que si un notifier est invoqué
  • Tag: Nom défini sur une ou plusieurs tâche qui peut être utilisé plus tard pour exécuter uniquement ce ou ces tâches Ansible.
  • Rôle: Afin d’éviter d’écrire encore et encore les mêmes playbooks, les roles Ansible apportent la possibilité de regrouper des fonctionnalités spécifiques dans ce qu’on appelle des rôles. Il seront ensuite intégrés aux playbooks Ansible.

Comment Installer Ansible

La manière la plus propre pour installer d’Ansible sur le node manager se fait via l’utilisation d’un environnement virtuel python. En effet, ce moyen permet de choisir précisément les versions d’Ansible, de python mais aussi de tout ces modules. Il faut donc dans un premier temps installé python3 et venv. On peut aussi utiliser pipenv

Sur Ubuntu 22.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
pip3 install ansible --user

Sur Centos 8 ou Fedora

sudo yum install epel-release
sudo yum install python3-pip
sudo pip3 install -U pip --upgrade
pip3 install ansible -user

Installation de l’autocompletion bash

Depuis la version 2.9 d’Ansible il est possible d’avoir de l'autocompletion bash des commandes ansible . Pour il suffit d’installer le package python argcomplete :

pip install argcomplete
sudo activate-global-python-argcomplete

Test après installation d’Ansible

Comment lancer ansible ? Il suffit de taper 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

Pour tester vos playbooks Ansible je vous conseille de créer des machines virtuelles en utilisant vagrant.

Notion de base d’Ansible

Les principales commandes Ansible

Ansible est livré avec un certain nombre de commandes permettant de soit lancer des actions ou soit obtenir de l’information sur l’environnement d’execution Ansible :

  • ansible : Permet d'exécuter un simple module ansible sur un inventaire. Vu ci-dessus dans le premier test.
  • ansible-console : Ouvre une console interactive permettant de lancer plusieurs actions sur un inventaire.
  • ansible-config : Affiche l’ensemble des paramètres Ansible. ansible-config [list|dump|view].
    • list : affiche la liste complète des options d’Ansible à disposition.
    • dump : affiche la configuration dans le contexte actuel.
    • view : affiche le contenu d’un fichier de configuration Ansible
  • ansible-playbook : Exécute un playbook Ansible sur un inventaire. La plus connue.
  • ansible-vault : Permet de crypter des données qui ne doivent être divulgué.
  • ansible-inventory : Affiche l’ensemble des données d’un inventaire Ansible.
  • ansible-galaxy : permet d’installer des roles et des collections Ansible
  • ansible-doc : Permet de lister l’ensemble des composants Ansible à disposition sur le noeud d’execution ansible-doc -l -t [type] type parmi: become, cache, callback, cliconf, connection,httpapi, inventory, lookup, netconf, shell, vars, module, strategy.

Construction d’un inventaire ansible statique

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

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 que vous pouvez instanciez avec vagrant :

  • un groupe apache constitué de la machine server1
  • un groupe mysql avec la machine server2

Ci-dessous un fichier d’inventaire correspondant à cette déclaration premier_inventaire.ini:

[apache]
server1
[mysql]
server2

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

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

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 premier_inventaire.ini -m ping all

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

Le premier paramètre est l’inventaire d’ansible à 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 YAML, prend cette forme:

---
- name: update web servers
  hosts: webservers
  become: true

  tasks:
  - name: ensure apache is at the latest version
    ansible.builtin.package:
      name: httpd
      state: latest
...

Donc dans l’exemple ci-dessus nous avons un playbook ansible dont:

  • dont la description (name) est update web servers
  • cible les hosts du groupe webservers
  • demande l’élévation de privilège (become)
  • lance une tache qui vérifie que la dernière version d’apache est bien installé

Voici les principales règles de syntaxe des fichiers YAML :

  • YAML accepte l”ensemble du jeu de caractères Unicode, à l”exception de certains caractères de contrôle, et peut être codé en UTF-8, UTF-16 et UTF-32 (fortement conseillé).
  • L’indentation est fait via l”utilisation des espaces et non les caractères de tabulation.
  • Les commentaires commencent par le signe dièse #, peuvent commencer n”importe où sur une ligne et continuer jusqu”à la fin de la ligne. Par contre Si le caractère # apparaît à l”intérieur d”une chaîne, alors ce sont des # littéraux.
  • Les membres de la liste sont indiqués par un tiret - avec un membre par ligne. Une liste peut également être spécifiée en plaçant le texte entre crochets […], chaque entrée étant séparée par une virgule .
  • Une entrée de tableau associatif est représentée en utilisant l”espace suivi de deux-points clé: valeur avec une entrée par ligne.
  • Plusieurs documents dans un même flux sont séparés par trois tirets —.

Les taches font appel aux modules ansible. Tous les principaux modules Ansible sont installés avec Ansible. Mais Il est possible d’en ajouter via des collections Ansible.

Pour exécuter ce playbook ansible 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

Vous pouvez listez les modules ansible avec la commande ansible-doc:

ansible-doc --list

Vous pouvez retrouver leur documentation sur le site officielle d’Ansible

Pour quitter votre environnement virtuel il suffit de taper la commande suivante:

deactivate

Pour aller plus loin avec Ansible

Ce billet avait pour simple objectif de présenter Ansible et de montrer en quoi il peut vous aider à gérer la configuration de vos serveurs. J’espère que cela vous aura donné envie d’aller plus loin dans la gestion de configurations avec Ansible.

Dans un monde où la technologie évolue continuellement à un rythme rapide et croît incroyablement vite en même temps, les administrateurs système et les ingénieurs devops doivent réfléchir à différentes approches pour automatiser les tâches de routine et orchestrer de grands pools de serveurs.

Bien qu’il existe de nombreux outils (Chef, Puppet) qui font la même chose avec quelques différences, Ansible a réussi à les dépasser tous avec sa simplicité, sa sécurité améliorée et, surtout, sa courbe d’apprentissage fluide.

Dans cette introduction sur les bases d’Ansible, j’ai décris Ansible, évoqué ses points forts et les avantages qu’Ansible peut apporter à l’automatisation et à l’orchestration de votre infrastructures. J’ai défini les termes essentiels utilisés et expliciter la structure des playbooks Ansible.

Je vous propose aussi de poursuivre en parcourant d’autres tutoriels qui abordent les sujets suivant :

Les principaux modules Ansible :

Vous avez aussi à votre disposition quelques exemples d’utilisation d’Ansible pour :

Si vous voulez trouver des exemples je vous conseille de parcourir Ansible-Galaxy. Ansible-Galaxy est un Hub ou la communauté Ansible partage des roles et des collections.

Mots clés :

devops ansible tutorials infra as code formation ansible

Si vous avez apprécié cet article de blog, vous pouvez m'encourager à produire plus de contenu en m'offrant un café sur Ko-Fi. Vous pouvez aussi passer votre prochaine commande sur amazon, sans que cela ne nous coûte plus cher, via ce lien. Je vous remercie de votre soutien