Introduction
Ansible est un outil python scripting de déploiement. L'idée est de définir un script d'installation. Le script est un fichier en YAML. Il me semble que sa spécificité principale est de ne pas nécessiter d'agent et d'être exécuter principalement via SSH, d'avoir un faible impact mémoire.
Il y a (IMHO) 3 concepts majeurs à prendre en compte : - Le playbook - Les modules - Les rôles
le playbook
C'est le script d'installation à proprement parler. Il contient une suite de propriétés qui seront utilisées pour exécuter l'installation de la machine distante.
les modules
Les modules sont les “commandes” qu'il est possible d'exécuter directement par ansible. Elles sont développées en python et encapsulent des actions de plus bas niveau (yum install, mkdir, service start etc…)
Les rôles
Les rôles sont des playbooks qui définissent un ensemble ou sous ensemble d'opérations d'installation. Au sein de votre SI (système d'information) vous avez des serveurs de base de données, des serveurs d'application, des reverse-proxy, etc…, ces rôles sont donc des templates (modèle) d'installation.
NB : _L'internet, Git, c'est le partage, la capitalisation, le croudsourcing c'est pour cela qu'il existe Galaxy Ansible qui permets d'avoir une vaste bibliothèque de rôles développer par des tiers.
En pratique
Un playbook
Un playbook ressemble à cela :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
ou bien
1 2 3 4 5 6 7 8 | |
Un role
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Installation/configuration
Je passe ce point, il y a plein d'information pour cela, je n’ai pas eu de soucis avec pep (je dois commencer à m'y faire) ;-)
En pratique
Sur cette base, j'ai essayé de créer des rôles pour XWiki à titre d'exercices. J'ai donc divisé ma stack (pile applicative) suivant ces différents rôles : - jdk - mysql - tomcat - war - ctrl
Vous trouverez les rôles sur git-hub et les exercices de variabilisation ici
En pratique, je peux donc installer sur un serveur “debian” le jdk 7 ou 8 (openjdk ou oracle), mysql que je veux (debian ou mysql.org), la version d'Xwiki que je souhaite. En modifiant les vars de mon script ou la target de mon playbook.
Conclusion
Complexité et modularité
Mon constat est que comme souvent le niveau de variablilisation, de ce qu'il faut rendre paramétrable, est toujours un curseur à revoir en fonction du contexte et de ce que l'on souhaite mettre en oeuvre.
Strategie d'upload
Ayant travaillé depuis ma machine locale, j'ai downloadé plusieurs fois au cours de l'exercice les paquets de plusieurs Mo. Il y a des stratégies, pour les copier depuis sa machine et/ou répliquer en parallèle. C'est un point qu'il est nécessaire de creuser en fonction de son environnement.
Immuabilité et test
Personnellement, j'ai utilisé Virtualbox pour faire des snapshot et valider mes playbook, j'ai regardé pour le fun docker+jenkins, un retour dessus peut être plus tard.
Strategie de template de VM
Avec ansible, je produis un script d'installation qui me permet notamment d'avoir un seul script, quels que soient mes environnements (en ayant variabilisé les OS), mais cela peu prendre un certain temps, il peut y avoir des gains à partir d'image de VM provisionner. J'ai entendu parler d'utiliser ansible sur docker pour les environnements de dev et d'appliquer ces derniers sur des VM pour la prod. À creuser…
Les deux trois trucs pour débugger
Pour connaître les facts
1
| |
Pour valider la bonne interprétation du playbooks
1
| |