Una guía completa para la configuración del caché de hechos de Ansible
La capacidad de Ansible para recopilar hechos sobre los nodos gestionados es crucial para el inventario dinámico, la ejecución condicional y la generación de informes detallados. Sin embargo, ejecutar gather_facts: true en cada ejecución de playbook puede aumentar significativamente el tiempo total de ejecución del playbook, especialmente en entornos con cientos o miles de hosts. Este cuello de botella de rendimiento se aborda eficazmente mediante el almacenamiento en caché de hechos de Ansible (Ansible Fact Caching).
El almacenamiento en caché de hechos permite a Ansible guardar los hechos recopilados de una ejecución anterior y reutilizarlos instantáneamente en ejecuciones posteriores, evitando las conexiones SSH que consumen mucho tiempo y el proceso de recopilación de datos. Esta guía detalla cómo configurar y aprovechar el almacenamiento en caché de hechos utilizando dos métodos principales: archivos JSON y Redis, lo que permite mejoras sustanciales en el rendimiento de sus flujos de trabajo de automatización.
Comprendiendo los hechos de Ansible y el impacto en el rendimiento
Ansible recopila hechos utilizando el módulo setup (o implícitamente a través de gather_facts: true). Estos hechos incluyen detalles del sistema operativo, interfaces de red, paquetes instalados y más. Aunque son invaluables, recopilar estos hechos a través de SSH puede ser lento, particularmente en conexiones de alta latencia o al gestionar una gran flota de máquinas.
Beneficio clave de rendimiento: Al habilitar el almacenamiento en caché, las ejecuciones posteriores del playbook leen los hechos de un caché local (archivo JSON) o de un almacén rápido en memoria (Redis) en lugar de ejecutar el módulo setup en hosts remotos.
Métodos de configuración para el almacenamiento en caché de hechos
Ansible soporta varios mecanismos de almacenamiento en caché configurados a través del archivo ansible.cfg. Los dos métodos más comunes y fiables son el almacenamiento en caché de archivos JSON y el almacenamiento en caché de Redis.
1. Almacenamiento en caché de archivos JSON (Almacenamiento local)
El almacenamiento en caché JSON es el método más simple, almacenando los datos de los hechos como archivos serializados en la máquina de control. No requiere servicios externos.
Configuración del almacenamiento en caché JSON en ansible.cfg
Para habilitar el almacenamiento en caché JSON, debe definir el plugin de caché y especificar la ubicación donde se almacenarán los archivos.
[defaults]
# Especifica el plugin de caché a usar
fact_caching = json
# Especifica el directorio donde se almacenarán los archivos de hechos
fact_caching_connection = /path/to/ansible_facts_cache
# Establece el tiempo de caducidad del caché (en segundos). 0 significa que nunca caduca.
fact_caching_timeout = 600
Explicación de los parámetros:
fact_caching = json: Activa el plugin de almacenamiento en caché JSON incorporado.fact_caching_connection: Este directorio debe existir y ser escribible por el usuario que ejecuta Ansible.fact_caching_timeout: En este ejemplo, los hechos se consideran obsoletos y se volverán a recopilar después de 600 segundos (10 minutos).
Mejor práctica: Asegúrese de que el directorio de caché esté ubicado en un almacenamiento local rápido (como una unidad NVMe) para un rendimiento óptimo de lectura/escritura.
2. Almacenamiento en caché de Redis (Almacenamiento compartido y de alto rendimiento)
Redis es un almacén de estructuras de datos en memoria que a menudo se utiliza como caché de alto rendimiento o broker de mensajes. Usar Redis para el almacenamiento en caché de hechos es ideal para entornos de equipo donde múltiples usuarios o pipelines de CI/CD necesitan acceder a la misma caché de forma rápida y consistente.
Requisitos previos para el almacenamiento en caché de Redis
- Un servidor Redis en ejecución accesible desde la máquina de control de Ansible.
- La biblioteca de Python
redisdebe estar instalada en la máquina de control:pip install redis.
Configuración del almacenamiento en caché de Redis en ansible.cfg
Al usar Redis, fact_caching_connection se utiliza para definir los parámetros de conexión de Redis (host y puerto).
[defaults]
# Especifica el plugin de caché a usar
fact_caching = redis
# Formato de la cadena de conexión: <host>[:<port>][/<db_number>]
# Si se ejecuta en la misma máquina en el puerto predeterminado:
fact_caching_connection = 127.0.0.1:6379/0
# Establece el tiempo de caducidad del caché (en segundos). Muy recomendado para Redis.
fact_caching_timeout = 3600
Nota sobre la base de datos de Redis: El número final (por ejemplo, /0) especifica el índice de la base de datos de Redis a utilizar. Asegúrese de que este índice esté dedicado a los hechos de Ansible para evitar conflictos si Redis se utiliza para otros fines.
Integración del almacenamiento en caché en Playbooks
La configuración de ansible.cfg establece el comportamiento predeterminado. Para utilizar el almacenamiento en caché de manera efectiva, debe asegurarse de dos cosas en sus playbooks:
- El caché se rellena ejecutando una play que recopila hechos.
- Las plays subsiguientes se basan en el caché en lugar de volver a recopilar.
Aplicación de la recopilación de hechos para la población inicial
Cuando ejecuta un playbook por primera vez, o después del tiempo de espera, Ansible ejecutará el proceso de recopilación de hechos.
- name: Play 1 - Recopilar Hechos y Ejecutar Tareas
hosts: webservers
gather_facts: true # Esto rellena el caché inicialmente
tasks:
- name: Usar hechos recopilados
debug:
msg: "La familia del SO es {{ ansible_os_family }}"
Utilización del caché en ejecuciones posteriores
Si fact_caching está configurado, las ejecuciones posteriores utilizarán automáticamente los datos almacenados en caché si gather_facts está establecido en true y los hechos están dentro del período de tiempo de espera.
Sin embargo, si desea garantizar que Ansible omita por completo la recopilación de hechos y dependa únicamente del caché (o falle si el caché no existe), puede usar gather_facts: false después de la población inicial, siempre que los hechos sigan siendo válidos.
Si establece explícitamente gather_facts: false y el almacenamiento en caché está habilitado, Ansible comprobará el caché primero. Si existen datos válidos, los utiliza. Si no, procede sin hechos, lo que podría romper tareas que dependen de ellos.
Comportamiento crucial: Si se utiliza gather_facts: true, Ansible solo realizará la recopilación remota de hechos si los hechos almacenados en caché han caducado o faltan.
Gestionando el caché de hechos
A veces es necesario borrar manualmente el caché, forzando a Ansible a recopilar datos nuevos de todos los hosts.
Borrar el caché JSON
Si utiliza el almacenamiento en caché JSON, simplemente elimine el contenido del directorio especificado en fact_caching_connection.
# Ejemplo usando la ruta definida anteriormente
rm -rf /path/to/ansible_facts_cache/*
Borrar el caché de Redis
Si utiliza Redis, puede borrar selectivamente las claves relacionadas con Ansible o borrar toda la base de datos utilizada por Ansible.
Para borrar todas las claves asociadas con el prefijo predeterminado de Ansible (típicamente relacionadas con la fuente del inventario):
# Conectarse a redis-cli y vaciar toda la base de datos (DB 0 en este ejemplo)
redis-cli -n 0 FLUSHDB
Advertencia:
FLUSHDBoFLUSHALLen Redis deben usarse con extrema precaución, ya que eliminan todos los datos en la base de datos especificada o en toda la instancia de Redis, respectivamente.
Resumen de las mejores prácticas
- Elija sabiamente: Use el almacenamiento en caché JSON para configuraciones simples de un solo usuario o cuando las dependencias externas están restringidas. Use Redis para entornos colaborativos o integración CI/CD a gran escala.
- Establezca tiempos de espera realistas: Configure
fact_caching_timeoutpara equilibrar las ganancias de rendimiento con la actualidad de los datos. Un tiempo de espera de 1 a 24 horas es común para entornos donde las configuraciones cambian con poca frecuencia. - Verifique la configuración: Ejecute siempre
ansible --versiono revise la salida de su primera ejecución en caché para confirmar que el plugin de caché está activo y funcionando. - Dependencia del inventario: El almacenamiento en caché de hechos funciona mejor con inventarios estáticos o generados dinámicamente. Si utiliza scripts de inventario dinámicos que cambian con frecuencia, el beneficio del almacenamiento en caché puede verse anulado por la obsolescencia o los errores.
Al implementar correctamente el almacenamiento en caché de hechos, convierte Ansible de una herramienta de configuración totalmente iterativa a un sistema altamente optimizado capaz de gestionar infraestructuras a gran escala con una latencia mínima por ejecución.