Activation du cache Ansible par fichier JSON
Lorsque vous lancez Ansible, vous avez déjà dû remarquer que le démarrage peut prendre un certain temps : il s'agit de la phase de récupération des informations sur la machine. Ceci se manifeste au début du lancement d'un playbook sous la forme suivante :
Pendant cette phase, Ansible va collecter tout un tas d'indicateur qui vont caractériser votre machine. On va y retrouver pêle-mêle le type de processeur, les disques de la machine, les adresses IP etc. Seul petit problème cette phase prend quelques secondes (voir plus certaines fois) et peut devenir vite agaçante dans le cas où vous mettez au point vos procédures d'installation.
Heureusement, les petits gars d'Ansible ont introduit un petit mécanisme de cache de ces éléments (des facts dans le jargon Ansiblien). Vous pouvez effectivement stocker ça dans un serveur redis.
Comme je n'ai pas trop l'habitude d'utiliser redis et que je n'avais pas envie de passer du temps à faire l'installation de ce nouvel élément sur mon poste perso, je me suis posé la question s'il ne serait pas possible d'utiliser quelque chose de plus simple ... Et la réponse est oui, avec des fichiers au format JSON.
Si vous lancez maintenant Ansible, vous ne verrez pas trop de différence. Ce paramètre peut néanmoins être avantageux si vous lancez plusieurs rôles sur les mêmes machines. Dans ce cas, Ansible ne récupérera les caractéristiques de vos machines qu'une seule fois.
Allons un peu plus loin et modifions maintenant les valeurs de fact_caching :
Nous avons activé le stockage des fichiers d'inventaire dans le répertoire /tmp/ansible. Chaque serveur verra ses caractéristiques stockées au format JSON.
A noter l'existence d'un paramètre fact_caching_timeout qui vous permettra de contrôler la fraîcheur de vos inventaires.
On ne fait qu'afficher un message. Ansible procédera néanmoins à la phase d'inventaire ce qui nous permettra de mesurer ce temps.
Un coup d'oeil dans le répertoire /tmp/ansible :
Ansible a créé un fichier de cache. Un coup d'oeil nous permet de voir qu'il s'agit d'un fichier au format JSON.
Nous venons de passer de 2,3 secondes à 0,3 seconde soit un gain de 2 secondes.
GATHERING FACTS ******************************************* ok: [localhost]
Pendant cette phase, Ansible va collecter tout un tas d'indicateur qui vont caractériser votre machine. On va y retrouver pêle-mêle le type de processeur, les disques de la machine, les adresses IP etc. Seul petit problème cette phase prend quelques secondes (voir plus certaines fois) et peut devenir vite agaçante dans le cas où vous mettez au point vos procédures d'installation.
Heureusement, les petits gars d'Ansible ont introduit un petit mécanisme de cache de ces éléments (des facts dans le jargon Ansiblien). Vous pouvez effectivement stocker ça dans un serveur redis.
Comme je n'ai pas trop l'habitude d'utiliser redis et que je n'avais pas envie de passer du temps à faire l'installation de ce nouvel élément sur mon poste perso, je me suis posé la question s'il ne serait pas possible d'utiliser quelque chose de plus simple ... Et la réponse est oui, avec des fichiers au format JSON.
Activation du cache via fichier JSON
Ouvrons notre fichier /etc/ansible/ansible.cfg et allons modifier la valeur du paramètre gathering pour le passer à la valeur smart :# smart - gather by default, but don't regather if already gathered # implicit - gather by default, turn off with gather_facts: False # explicit - do not gather by default, must say gather_facts: True gathering = smart
Si vous lancez maintenant Ansible, vous ne verrez pas trop de différence. Ce paramètre peut néanmoins être avantageux si vous lancez plusieurs rôles sur les mêmes machines. Dans ce cas, Ansible ne récupérera les caractéristiques de vos machines qu'une seule fois.
Allons un peu plus loin et modifions maintenant les valeurs de fact_caching :
# if set to a persistant type (not 'memory', for example 'redis') fact values # from previous runs in Ansible will be stored. This may be useful when # wanting to use, for example, IP information from one group of servers # without having to talk to them in the same playbook run to get their # current IP information. # fact_caching = memory fact_caching = jsonfile fact_caching_connection = /tmp/ansible
Nous avons activé le stockage des fichiers d'inventaire dans le répertoire /tmp/ansible. Chaque serveur verra ses caractéristiques stockées au format JSON.
A noter l'existence d'un paramètre fact_caching_timeout qui vous permettra de contrôler la fraîcheur de vos inventaires.
Différence de vitesse d'exécution dû au cache
Voyons maintenant l'impact des performances avec le test tout simple suivant :--- # Playbook de test - name: "Test" hosts: "localhost" tasks: - debug: msg=Lancement réussi
On ne fait qu'afficher un message. Ansible procédera néanmoins à la phase d'inventaire ce qui nous permettra de mesurer ce temps.
Premier lancement
Lançons une première fois notre playbook à froid :$ time ansible-playbook test.yml PLAY [Test] ************************************************* GATHERING FACTS ********************************************* ok: [localhost] TASK: [debug msg=Lancement réussi] ************************** ok: [localhost] => { "msg": "Lancement" } PLAY RECAP ************************************************** localhost : ok=2 changed=0 unreachable=0 failed=0 real 0m2.300s user 0m1.531s sys 0m0.708s
Un coup d'oeil dans le répertoire /tmp/ansible :
$ ls /tmp/ansible/ localhost
Ansible a créé un fichier de cache. Un coup d'oeil nous permet de voir qu'il s'agit d'un fichier au format JSON.
Lancement avec cache
Maintenant que nous disposons d'un cache, mesurons à nouveau ce temps d'exécution :$ time ansible-playbook test.yml PLAY [Test] ************************************************* TASK: [debug msg=Lancement réussi] ************************** ok: [localhost] => { "msg": "Lancement" } PLAY RECAP ************************************************** localhost : ok=1 changed=0 unreachable=0 failed=0 real 0m0.303s user 0m0.242s sys 0m0.044s
Nous venons de passer de 2,3 secondes à 0,3 seconde soit un gain de 2 secondes.