Qu’est-ce qu’Ansible ? Comment s’en servir ? Quels concurrents ? Petit tour pour cibler un nouveau produit qui fait une forte impression depuis quelques temps.
Ansible est apparu en 2012. En octobre 2015, Red Hat annonce le rachat d’Ansible qui devient alors un produit phare de sa stack. Celui-ci s’intègre parfaitement dans les solutions de Red Hat et vient renforcer les arguments concernant la facilité de gestion d’un parc de serveurs.
Ansible est une solution permettant de réaliser des déploiements, l’exécution de tâches et la gestion de configuration sur plusieurs machines en même temps. Il est sans agent et utilise SSH pour mettre en place les actions à réaliser, elles-mêmes écrites en YAML.
Dans Ansible, il existe de nombreux produits qui peuvent perturber lorsqu’on commence. Vous entendrez peut-être parler de Ansible Playbook, Ansible Vault et Ansible Galaxy.
Deux choses à savoir :
- Quand vous utilisez Ansible, vous utilisez des modules. Il existe une liste de modules déjà écrite, mais vous pouvez également écrire les vôtres. Vous devrez l’écrire en Python.
- Vous devez donner une ou un groupe de domaine/IP où l’action doit être utilisée.
Exemple :
On va vérifier que notre machine est bien haut avec le module ping.
1 2 3 4 5 |
$ ansible localhost -m ping localhost | SUCCESS => ; { » changed « : faux, » ping « : » pong « } |
Pour utiliser autre chose que localhost, comme par exemple un ensemble de domaines, vous devez compléter le fichier /etc/ansible/hosts.
1 2 3 |
[baptiste-donaux.fr] www.baptiste-donaux.fr me.baptiste-donaux.fr |
1 2 3 4 5 6 7 8 9 10 |
$ ansible -m ping baptiste-donaux.fr me.baptiste-donaux.fr | success >> ; { » changé « : faux, » ping « : » pong « } www.baptiste-donaux.fr | success >> ; { » a changé « : faux, » ping « : » pong « } |
Et voilà comment on vérifie qu’un piscine de serveurs en bien haut . Voici la liste des modules présents de base.
Une fois que l’on a compris comment fonctionne un module, on peut utiliser tous les autres modules de la même manière. Lorsqu’on utilise un module, on peut donner des arguments (argument -a).
Par exemple, comment exécuter une commande sur plusieurs.
1 2 3 4 5 6 |
$ ansible -m shell -a » docker -version « baptiste-donaux.fr me.baptiste-donaux.fr | success | rc=0 >> ; Docker version 1.12.1, build 23cf638 www.baptiste-donaux.fr | success | rc=0 >> ; Docker version 1.12.1, build 23cf638 |
Mais également s’assurer qu’un paquet est bien installé.
1 2 3 4 |
$ ansible -m apt -a » name=vim state=present « www.baptiste-donaux.fr www.baptiste-donaux.fr | success >> ; { » a changé « : faux } |
Ou tout simplement mettre à jour un ou des serveurs.
1 2 3 4 5 6 7 8 9 10 11 12 |
$ ansible -m apt -a » update_cache=yes « www.baptiste-donaux.fr www.baptiste-donaux.fr | success >> ; { » a changé « : faux } $ ansible -m apt -a » upgrade=dist « www.baptiste-donaux.fr www.baptiste-donaux.fr | success >> ; { » a changé « : faux, » msg « : » Lecture des listes de paquets…nConstruction de l’arbre de dépendances…nLecture des informations d’état…n0 mis à jour, 0 nouvellement installé, 0 à supprimer et 0 non mis à jour.n « , » stderr « : » « , » stdout « : » Lecture des listes de paquets…nConstruction de l’arbre de dépendances…nLecture des informations d’état…n0 mis à jour, 0 nouvellement installé, 0 à supprimer et 0 non mis à jour.n « } |
Gérer un parc de machines avec les commandes c’est déjà bien, et c’est surtout la base d’Ansible. Malgré cela, on imagine mal jouer un scénario en exécutant des commandes les unes à la suite des autres. Heureusement pour nous, ansible-playbook est là pour ça !
Les scénarios s’écrivent en YAML. En voici un petit exemple.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
– hôtes : baptiste-donaux.fr tâches : – nom : Ajouter une clé APT pour le dépôt Docker apt_key : keyserver : » hkp://p80.pool.sks-keyservers.net:80 « id : 58118E89F3A912897C070ADBF76221572C52609D – nom : Ajouter le dépôt APT Docker apt_repository : repo=‘deb https://apt.dockerproject.org/repo debian-jessie main’ state=présent – nom : Mise à jour du cache APT avec le nouveau dépôt apt : update_cache=oui – nom : Installer le paquet docker-engine s’il n’est pas installén’existe pas apt : name=docker-engine state=present – name : Activation et démarrage du service Docker systemd : enabled=yes state=started name=docker – name : Installer Python apt : name=python state=present – name : Installer PIP apt : name=python-pip state=present – name : docker-py dependency pip : name=docker-py – name : Pull Nginx image docker_image : name=nginx pull=yes – name : Créer un conteneur Nginx docker_container : name : proxy image : nginx published_ports : – » 80:80 « état : présent |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
$ ansible my_playbook.yml PLAY [baptiste-donaux.fr] ****************************************************** TÂCHE [setup] ******************************************************************* ok : [baptiste-donaux.fr] TASK [Add APT key for Docker repository] *************************************** ok : [baptiste-donaux.fr] TASK [Add APT Docker repository] *********************************************** ok : [baptiste-donaux.fr] TASK [Update APT cache with new repository] ************************************ ok : [baptiste-donaux.fr] TASK [Install docker-engine package if it doesn‘t exist] *********************** ok : [baptiste-donaux.fr] TASK [Install Python] ********************************************************** ok : [baptiste-donaux.fr] TASK [Install PIP] ************************************************************* ok : [baptiste-donaux.fr] TASK [docker-py dependency] **************************************************** ok : [baptiste-donaux.fr] TASK [Pull Nginx image] ******************************************************** ok : [baptiste-donaux.fr] TASK [Create a Nginx container] ************************************************ ok : [baptiste-donaux.fr] PLAY RECAP ********************************************************************* baptiste-donaux.fr : ok=10 changed=0 unreachable=0 failed=0 |
Et voilà rien de plus simple. En plus d’exécuter un scénario complet sur un ensemble de serveurs, si l’un d’entre eux se retrouve en erreur, un fichier .retry sera créé et en relançant la commande, le scénario reprendra là où vous en étiez.
Galaxy et où stocker vos modules
Ansible-Galaxy est un Hub pour partager vos modules. Il fonctionne un peu à la manière de Hub Docker pour les images Docker.
Dans certains cas, vous aurez besoin de stocker dans vos scénarios des informations sensibles (mot de passe…). Plutôt que de stocker en clair ces informations, vous pouvez encoder/décoder ses fichiers.
Un petit exemple ne fera pas de mal.
1 2 3 4 |
– hôtes : localhost tâches : – shell : sshpass -p » foo « scp -r /bar baz@localhost:/qux |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ ansible-vault encrypt my_playbook.yml Nouveau mot de passe du coffre-fort : Confirmer le mot de passe du nouveau coffre : Cryptage réussi $ cat my_playbook.yml $ANSIBLE_VAULT;1.1;AES256 34396264333338636331323838386331393664623065383463663661373436643764336536326662 6238626432373334356436613935306630376461633136650a316561316531323937633963643032 64643239616561653864346132356537656536313030656532373733316262663536396438383262 3463373265636232640a626364306666373665303633663630353132383764323530646438383737 31336163633631373162356339633739356461656130353533306137613436663333383137376366 62383533393262376362393565386133306432323266393034616331333932663266613739653538 36663666333938323961343231366266323430376234376363353662386366373061636434613763 35653139316465613562613834373434636238643661633434326661303438666233313732653338 3264 $ ansible-playbook my_playbook.yml -ask-vault-pass Mot de passe du coffre-fort : … |
Cet article a pour simple objectif de présenter Ansible et de montrer en quoi il peut simplifier vos tâches. N’hésitez pas à faire des retours, à améliorer et/ou corriger ce post.