Cours - Présentation d'Ansible
Présentation d'Ansible
Ansible
Ansible est un gestionnaire de configuration et un outil de déploiement et d'orchestration très populaire et central dans le monde de l'infrastructure as code (IaC).
Il fait donc également partie de façon centrale du mouvement DevOps car il s'apparente à un véritable couteau suisse de l'automatisation des infrastructures.
Histoire
Ansible a été créé en 2012 (plus récent que ses concurrents Puppet et Chef) autour d'une recherche de simplicité et du principe de configuration agentless.
Très orienté linux/opensource et versatile il obtient rapidement un franc succès et s'avère être un couteau suisse très adapté à l'automatisation DevOps et Cloud dans des environnements hétérogènes.
Red Hat rachète Ansible en 2015 et développe un certain nombre de produits autour (Ansible Tower, Ansible container avec Openshift).
Architecture : simplicité et portabilité avec ssh et python
Ansible est agentless c'est à dire qu'il ne nécessite aucun service/daemon spécifique sur les machines à configurer.
La simplicité d'Ansible provient également du fait qu'il s'appuie sur des technologies linux omniprésentes et devenues universelles.
- ssh : connexion et authentification classique avec les comptes présents sur les machines.
- python : multiplateforme, un classique sous linux, adapté à l'admin sys et à tous les usages.
De fait Ansible fonctionne efficacement sur toutes les distributions linux, debian, centos, ubuntu en particulier (et maintenant également sur Windows).
Ansible pour la configuration
Ansible est semi-déclaratif c'est à dire qu'il s'exécute séquentiellement mais idéalement de façon idempotente.
Il permet d'avoir un état descriptif de la configuration:
- qui soit auditable
- qui peut évoluer progressivement
- qui permet d'éviter que celle-ci ne dérive vers un état inconnu
Ansible pour le déploiement et l'orchestration
Peut être utilisé pour des opérations ponctuelles comme le déploiement:
- vérifier les dépendances et l'état requis d'un système
- récupérer la nouvelle version d'un code source
- effectuer une migration de base de données (si outil de migration)
- tests opérationnels (vérifier qu'un service répond)
Ansible à différentes échelles
Les cas d'usages d'Ansible vont de ...:
petit:
- ... un petit playbook (~script) fourni avec le code d'un logiciel pour déployer en mode test.
- ... la configuration d'une machine de travail personnelle.
- etc.
moyen:
- ... faire un lab avec quelques machines.
- ... déployer une application avec du code, une runtime (php/java, etc.) et une base de données à migrer.
- etc.
grand:
- ... gestion de plusieurs DC avec des produits multiples.
- ... gestion multi-équipes et logging de toutes les opérations grâce à Ansible Tower.
- etc.
Ansible face à Docker et Kubernetes
Ansible est très complémentaire à docker:
- Il permet de provisionner des machines avec docker ou kubernetes installé pour ensuite déployer des conteneurs.
- Il permet une orchestration simple des conteneurs avec le module
docker_container
.
On peut même construire des conteneurs avec du code ansible. Concrètement le langage Ansible remplace le langage Dockerfile pour la construction des images de conteneur : https://github.com/ansible-community/ansible-bender
Partie 1, Installation, configuration
Pour l'installation plusieurs options sont possibles:
Avec
pip
le gestionnaire de paquet du langage python:pip3 install ansible
- installe la dernière version stable
- commande d'upgrade spécifique
pip3 install ansible --upgrade
- possibilité d'installer facilement une version de développement pour tester de nouvelles fonctionnalité ou anticiper les migrations.
Avec le gestionnaire de paquet de la distribution ou homebrew sur OSX:
- version généralement plus ancienne
- facile à mettre à jour avec le reste du système
- Pour installer une version récente on il existe des dépots spécifique à ajouter: exemple sur ubuntu:
sudo apt-add-repository --yes --update ppa:ansible/ansible
Pour voir l'ensemble des fichiers installés par un paquet pip3
:
pip3 show -f ansible | less
Pour tester la connexion aux serveurs on utilise la commande ad hoc suivante. ansible all -m ping
Les inventaires statiques
Il s'agit d'une liste de machines sur lesquelles vont s'exécuter les modules Ansible. Les machines de cette liste sont:
- la syntaxe par défaut est celle des fichiers de configuration INI
- Classées par groupe et sous groupes pour être désignables collectivement (ex: exécuter telle opération sur les machines de tel groupe)
- La méthode de connexion est précisée soit globalement soit pour chaque machine.
- Des variables peuvent être définies pour chaque machine ou groupe pour contrôler dynamiquement par la suite la configuration ansible.
exemple:
[all:vars]
ansible_ssh_user=elie
ansible_python_interpreter=/usr/bin/python3
[worker_nodes]
workernode1 ansible_host=10.164.210.101 pays=France
[dbservers]
pgnode1 ansible_host=10.164.210.111 pays=France
pgnode2 ansible_host=10.164.210.112 pays=Allemagne
[appservers]
appnode1 ansible_host=10.164.210.121
appnode2 ansible_host=10.164.210.122 pays=Allemagne
Les inventaires peuvent également être au format YAML (plus lisible mais pas toujours intuitif) ou JSON (pour les machines).
Options de connexion
On a souvent besoin dans l'inventaire de préciser plusieurs options pour se connecter. Voici les principales :
ansible_host
: essentiel, pour dire à Ansible comment accéder à l'hostansible_user
: quel est l'user à utiliser par Ansible pour la connexion SSHansible_ssh_private_key_file
: où se trouve la clé privée pour la connexion SSHansible_connection
: demander à Ansible d'utiliser autre chose que du SSH pour la connexionansible_python_interpreter=/usr/bin/python3
: option parfois nécessaire pour spécifier à Ansible où trouver Python sur la machine installée
Configuration
Ansible se configure classiquement au niveau global dans le dossier /etc/ansible/
dans lequel on retrouve en autre l'inventaire par défaut et des paramètre de configuration.
Ansible est très fortement configurable pour s'adapter à des environnement contraints.
Liste des paramètre de configuration: https://docs.ansible.com/ansible/latest/reference_appendices/config.html
Alternativement on peut configurer ansible par projet avec un fichier ansible.cfg
présent à la racine. Toute commande ansible lancée à la racine du projet récupère automatiquement cette configuration.