Guía Completa para la Configuración del Caché de Hechos en Ansible
Configura el caché de hechos de Ansible con jsonfile o Redis, establece tiempos de espera, limpia datos de caché obsoletos y evita la sobrecarga de recopilación repetida de hechos.
Guía Completa para la Configuración del Caché de Hechos en Ansible
El caché de hechos de Ansible ayuda cuando tus playbooks dedican demasiado tiempo a recopilar los mismos hechos de los hosts en cada ejecución. Si gestionas cientos de hosts, las llamadas repetidas al módulo setup pueden añadir una sobrecarga SSH notable antes de que comience el trabajo real.
El caché de hechos almacena los hechos recopilados después de una ejecución exitosa y los reutiliza mientras el caché siga siendo válido. El resultado es un inicio más rápido del playbook para flujos de trabajo que pueden tolerar hechos ligeramente desactualizados.
Comprendiendo los Hechos de Ansible y su Impacto en el Rendimiento
Ansible recopila hechos con el módulo setup, ya sea explícitamente o mediante el comportamiento predeterminado gather_facts: true. Los hechos incluyen detalles como la familia del sistema operativo, kernel, direcciones IP, montajes, CPU, memoria e información del intérprete de Python.
La ganancia de rendimiento proviene de evitar la recopilación remota repetida cuando los datos en caché están frescos. Esto es útil para informes, plantillas y lógica condicional que depende de hechos que no cambian minuto a minuto.
Métodos de Configuración para el Caché de Hechos
Ansible configura el caché de hechos en ansible.cfg. Dos opciones prácticas son archivos JSON locales y Redis. Los nombres exactos de los plugins son importantes.
1. Caché de Archivos JSON (Almacenamiento Local)
El caché de archivos JSON almacena los hechos en la máquina de control. Es simple y no necesita un servicio externo.
Configurando el Caché JSON en ansible.cfg
Usa el plugin de caché jsonfile:
[defaults]
fact_caching = jsonfile
fact_caching_connection = /ruta/al/cache_de_hechos_ansible
fact_caching_timeout = 600
fact_caching_connection es el directorio donde Ansible escribe los archivos de caché. Créalo primero y asegúrate de que el usuario que ejecuta Ansible pueda escribir en él:
mkdir -p /ruta/al/cache_de_hechos_ansible
fact_caching_timeout se mide en segundos. Después del tiempo de espera, Ansible recopila hechos frescos nuevamente cuando un play los necesita.
2. Caché Redis (Almacenamiento Compartido de Alto Rendimiento)
Redis funciona mejor cuando múltiples nodos de control, usuarios o trabajos de CI deben compartir el mismo caché de hechos.
Requisitos Previos para el Caché Redis
Necesitas un servidor Redis accesible y el cliente Python Redis disponible en el entorno Python que usa Ansible:
python -m pip install redis
Configurando el Caché Redis en ansible.cfg
Usa una cadena de conexión Redis:
[defaults]
fact_caching = redis
fact_caching_connection = 127.0.0.1:6379/0
fact_caching_timeout = 3600
El /0 selecciona la base de datos Redis 0. Usa una base de datos dedicada o una instancia Redis si otras aplicaciones también usan Redis, y protege el endpoint Redis como cualquier otro servicio de infraestructura.
Integrando el Caché en los Playbooks
El caché se llena cuando un play recopila hechos:
- name: Recopilar y usar hechos
hosts: servidores_web
gather_facts: true
tasks:
- name: Mostrar familia del SO
debug:
msg: "La familia del SO es {{ ansible_os_family }}"
Con el caché de hechos habilitado, Ansible puede reutilizar los hechos en caché mientras sean válidos. Si los hechos faltan o han expirado y gather_facts: true, Ansible los recopila nuevamente.
Si estableces gather_facts: false, Ansible no ejecuta la recopilación de hechos para ese play. Los hechos en caché pueden seguir estando disponibles a través de variables de host si ya estaban en caché, pero no confíes ciegamente en eso para lógica crítica. Un caché faltante puede hacer que las variables no estén definidas.
Un patrón seguro es recopilar hechos en un play programado o temprano, y luego usar los hechos en caché en playbooks posteriores de informes u orquestación donde la desactualización sea aceptable.
Gestionando el Caché de Hechos
Limpia el caché cuando los hechos del host hayan cambiado y no quieras esperar el tiempo de espera.
Limpiando el Caché JSON
Elimina los archivos en el directorio de caché configurado:
rm -rf /ruta/al/cache_de_hechos_ansible/*
Limpiando el Caché Redis
Si la base de datos Redis está dedicada a los hechos de Ansible, puedes vaciar esa base de datos:
redis-cli -n 0 FLUSHDB
FLUSHDB elimina todas las claves en la base de datos Redis seleccionada. No lo ejecutes en una base de datos compartida a menos que sepas que todas las claves allí se pueden eliminar de forma segura.
Mejores Prácticas
- Usa
jsonfilepara una sola máquina de control y flujos de trabajo locales simples. - Usa Redis cuando múltiples ejecutores necesiten el mismo caché.
- Mantén los tiempos de espera cortos para infraestructura que cambia rápidamente y más largos para flotas estables.
- No almacenes en caché hechos personalizados sensibles en una ubicación que otros usuarios puedan leer.
- Verifica qué archivo de configuración está usando Ansible con
ansible --version. - Prueba con un grupo de inventario antes de habilitar el caché en una flota grande.
Conclusión Práctica
Habilita el caché de hechos de Ansible cuando la recopilación repetida de hechos sea un costo medible y tus playbooks puedan tolerar datos en caché. Comienza con jsonfile, pasa a Redis solo cuando compartir el caché resuelva un problema real de flujo de trabajo, y establece un tiempo de espera que coincida con la frecuencia con la que cambian los hechos de tus hosts.