Guide complet de la configuration du cache de faits Ansible
Configurez le cache de faits Ansible avec jsonfile ou Redis, définissez des délais d'expiration, effacez les données de cache obsolètes et évitez les surcharges répétées de collecte de faits.
Guide complet de la configuration du cache de faits Ansible
Le cache de faits Ansible est utile lorsque vos playbooks passent trop de temps à collecter les mêmes faits d'hôtes à chaque exécution. Si vous gérez des centaines d'hôtes, les appels répétés au module setup peuvent ajouter une surcharge SSH notable avant même que le travail réel ne commence.
Le cache de faits stocke les faits collectés après une exécution réussie, puis les réutilise tant que le cache est valide. Le résultat est un démarrage plus rapide des playbooks pour les workflows qui peuvent tolérer des faits légèrement obsolètes.
Comprendre les faits Ansible et l'impact sur les performances
Ansible collecte les faits avec le module setup, soit explicitement, soit via le comportement par défaut gather_facts: true. Les faits incluent des détails tels que la famille du système d'exploitation, le noyau, les adresses IP, les points de montage, le CPU, la mémoire et les informations sur l'interpréteur Python.
Le gain de performances provient de l'évitement de la collecte répétée à distance lorsque les données en cache sont fraîches. Cela est utile pour les rapports, les templates et la logique conditionnelle qui dépendent de faits qui ne changent pas minute par minute.
Méthodes de configuration pour le cache de faits
Ansible configure le cache de faits dans ansible.cfg. Deux choix pratiques sont les fichiers JSON locaux et Redis. Les noms exacts des plugins sont importants.
1. Cache par fichier JSON (stockage local)
Le cache par fichier JSON stocke les faits sur la machine de contrôle. Il est simple et ne nécessite aucun service externe.
Configuration du cache JSON dans ansible.cfg
Utilisez le plugin de cache jsonfile :
[defaults]
fact_caching = jsonfile
fact_caching_connection = /chemin/vers/cache_faits_ansible
fact_caching_timeout = 600
fact_caching_connection est le répertoire où Ansible écrit les fichiers de cache. Créez-le d'abord et assurez-vous que l'utilisateur exécutant Ansible peut y écrire :
mkdir -p /chemin/vers/cache_faits_ansible
fact_caching_timeout est mesuré en secondes. Après le délai d'expiration, Ansible collecte à nouveau des faits frais lorsqu'un play en a besoin.
2. Cache Redis (stockage partagé haute performance)
Redis fonctionne mieux lorsque plusieurs nœuds de contrôle, utilisateurs ou tâches CI doivent partager le même cache de faits.
Prérequis pour le cache Redis
Vous avez besoin d'un serveur Redis accessible et du client Python Redis disponible dans l'environnement Python utilisé par Ansible :
python -m pip install redis
Configuration du cache Redis dans ansible.cfg
Utilisez une chaîne de connexion Redis :
[defaults]
fact_caching = redis
fact_caching_connection = 127.0.0.1:6379/0
fact_caching_timeout = 3600
Le /0 sélectionne la base de données Redis 0. Utilisez une base de données dédiée ou une instance Redis si d'autres applications utilisent également Redis, et protégez le point de terminaison Redis comme tout autre service d'infrastructure.
Intégration du cache dans les playbooks
Le cache est rempli lorsqu'un play collecte des faits :
- name: Collecter et utiliser les faits
hosts: serveurs_web
gather_facts: true
tasks:
- name: Afficher la famille du système d'exploitation
debug:
msg: "La famille du système d'exploitation est {{ ansible_os_family }}"
Avec le cache de faits activé, Ansible peut réutiliser les faits en cache tant qu'ils sont valides. Si les faits sont manquants ou expirés et que gather_facts: true, Ansible les collecte à nouveau.
Si vous définissez gather_facts: false, Ansible n'exécute pas la collecte de faits pour ce play. Les faits en cache peuvent encore être disponibles via les variables d'hôte s'ils ont déjà été mis en cache, mais ne vous y fiez pas aveuglément pour une logique critique. Un cache manquant peut rendre les variables indéfinies.
Un modèle sûr est de collecter les faits dans un play planifié ou précoce, puis d'utiliser les faits en cache dans des playbooks de rapports ou d'orchestration ultérieurs où l'obsolescence est acceptable.
Gestion du cache de faits
Effacez le cache lorsque les faits d'hôte ont changé et que vous ne voulez pas attendre le délai d'expiration.
Effacement du cache JSON
Supprimez les fichiers dans le répertoire de cache configuré :
rm -rf /chemin/vers/cache_faits_ansible/*
Effacement du cache Redis
Si la base de données Redis est dédiée aux faits Ansible, vous pouvez vider cette base de données :
redis-cli -n 0 FLUSHDB
FLUSHDB supprime toutes les clés de la base de données Redis sélectionnée. Ne l'exécutez pas sur une base de données partagée à moins de savoir que toutes les clés peuvent être supprimées en toute sécurité.
Meilleures pratiques
- Utilisez
jsonfilepour une seule machine de contrôle et des workflows locaux simples. - Utilisez Redis lorsque plusieurs exécuteurs ont besoin du même cache.
- Gardez des délais d'expiration courts pour une infrastructure changeant rapidement et plus longs pour des parcs stables.
- Ne mettez pas en cache des faits personnalisés sensibles dans un emplacement que d'autres utilisateurs peuvent lire.
- Vérifiez quel fichier de configuration Ansible utilise avec
ansible --version. - Testez avec un groupe d'inventaire avant d'activer le cache sur un grand parc.
En résumé
Activez le cache de faits Ansible lorsque la collecte répétée de faits est un coût mesurable et que vos playbooks peuvent tolérer des données en cache. Commencez avec jsonfile, passez à Redis uniquement lorsque le partage du cache résout un problème de workflow réel, et définissez un délai d'expiration qui correspond à la fréquence à laquelle les faits de vos hôtes changent.