Um Guia Abrangente sobre a Configuração de Fact Caching do Ansible
A capacidade do Ansible de coletar fatos (facts) sobre nós gerenciados é crucial para inventário dinâmico, execução condicional e relatórios detalhados. No entanto, executar gather_facts: true a cada execução de playbook pode aumentar significativamente o tempo de execução total do playbook, especialmente em ambientes com centenas ou milhares de hosts. Esse gargalo de desempenho é efetivamente resolvido através do Ansible Fact Caching (Cache de Fatos do Ansible).
O cache de fatos permite que o Ansible armazene os fatos coletados de uma execução anterior e os reutilize instantaneamente em execuções subsequentes, ignorando as demoradas conexões SSH e o processo de coleta de dados. Este guia detalha como configurar e utilizar o cache de fatos usando dois métodos primários: arquivos JSON e Redis, possibilitando melhorias substanciais de desempenho em seus fluxos de trabalho de automação.
Compreendendo os Fatos do Ansible e o Impacto no Desempenho
O Ansible coleta fatos usando o módulo setup (ou implicitamente via gather_facts: true). Esses fatos incluem detalhes do sistema operacional, interfaces de rede, pacotes instalados e muito mais. Embora inestimável, coletar esses fatos via SSH pode ser lento, principalmente em conexões de alta latência ou ao gerenciar um grande conjunto de máquinas.
Principal Benefício de Desempenho: Ao habilitar o cache, as execuções subsequentes de playbooks leem os fatos de um cache local (arquivo JSON) ou de um armazenamento rápido em memória (Redis), em vez de executar o módulo setup nos hosts remotos.
Métodos de Configuração para Fact Caching
O Ansible suporta vários mecanismos de cache configurados através do arquivo ansible.cfg. Os dois métodos mais comuns e confiáveis são o cache de arquivo JSON e o cache Redis.
1. Cache de Arquivo JSON (Armazenamento Local)
O cache JSON é o método mais simples, armazenando dados de fatos como arquivos serializados na máquina de controle. Não requer serviços externos.
Configurando o Cache JSON em ansible.cfg
Para habilitar o cache JSON, você deve definir o plugin de cache e especificar o local onde os arquivos serão armazenados.
[defaults]
# Specify the caching plugin to use
fact_caching = json
# Specify the directory where fact files will be stored
fact_caching_connection = /path/to/ansible_facts_cache
# Set the cache expiration time (in seconds). 0 means never expire.
fact_caching_timeout = 600
Explicação dos Parâmetros:
fact_caching = json: Ativa o plugin de cache JSON embutido.fact_caching_connection: Este diretório deve existir e ser gravável pelo usuário que executa o Ansible.fact_caching_timeout: Neste exemplo, os fatos são considerados obsoletos e serão coletados novamente após 600 segundos (10 minutos).
Melhor Prática: Certifique-se de que o diretório de cache esteja localizado em um armazenamento local rápido (como um disco NVMe) para um desempenho ideal de leitura/gravação.
2. Cache Redis (Armazenamento Compartilhado e de Alto Desempenho)
Redis é um armazenamento de estrutura de dados em memória, frequentemente usado como um cache de alto desempenho ou message broker. Usar o Redis para cache de fatos é ideal para ambientes de equipe onde vários usuários ou pipelines de CI/CD precisam acessar o mesmo cache de forma rápida e consistente.
Pré-requisitos para o Cache Redis
- Um servidor Redis em execução acessível a partir da máquina de controle do Ansible.
- A biblioteca Python
redisdeve ser instalada na máquina de controle:pip install redis.
Configurando o Cache Redis em ansible.cfg
Ao usar o Redis, fact_caching_connection é usado para definir os parâmetros de conexão do Redis (host e porta).
[defaults]
# Specify the caching plugin to use
fact_caching = redis
# Connection string format: <host>[:<port>][/<db_number>]
# If running on the same machine on default port:
fact_caching_connection = 127.0.0.1:6379/0
# Set the cache expiration time (in seconds). Highly recommended for Redis.
fact_caching_timeout = 3600
Nota sobre o Banco de Dados Redis: O número final (por exemplo, /0) especifica o índice do banco de dados Redis a ser usado. Certifique-se de que este índice seja dedicado aos fatos do Ansible para evitar conflitos caso o Redis seja usado para outros fins.
Integrando o Cache em Playbooks
Configurar ansible.cfg define o comportamento padrão. Para utilizar o cache de forma eficaz, você deve garantir duas coisas em seus playbooks:
- O cache é preenchido executando um play que coleta fatos.
- Os plays subsequentes dependem do cache em vez de fazer uma nova coleta.
Forçando a Coleta de Fatos para População Inicial
Quando você executa um playbook pela primeira vez, ou após o timeout, o Ansible executará o processo de coleta de fatos.
- name: Play 1 - Gather Facts and Execute Tasks
hosts: webservers
gather_facts: true # Isso preenche o cache inicialmente
tasks:
- name: Use gathered facts
debug:
msg: "OS Family is {{ ansible_os_family }}"
Utilizando o Cache em Execuções Subsequentes
Se fact_caching estiver configurado, as execuções subsequentes usarão automaticamente os dados em cache se gather_facts estiver definido como true e os fatos estiverem dentro do período de timeout.
No entanto, se você quiser garantir que o Ansible ignore totalmente a coleta de fatos e dependa apenas do cache (ou falhe se o cache estiver ausente), você pode usar gather_facts: false após a população inicial, desde que os fatos ainda sejam válidos.
Se você definir explicitamente gather_facts: false e o cache estiver habilitado, o Ansible verificará o cache primeiro. Se dados válidos existirem, ele os usará. Caso contrário, prosseguirá sem fatos, o que pode quebrar tarefas que dependem deles.
Comportamento Crucial: Se gather_facts: true for usado, o Ansible só realizará a coleta remota de fatos se os fatos armazenados em cache tiverem expirado ou estiverem ausentes.
Gerenciando o Cache de Fatos
Às vezes, é necessário limpar manualmente o cache, forçando o Ansible a coletar dados novos de todos os hosts.
Limpando o Cache JSON
Se estiver usando o cache JSON, simplesmente exclua o conteúdo do diretório especificado em fact_caching_connection.
# Example using the path defined earlier
rm -rf /path/to/ansible_facts_cache/*
Limpando o Cache Redis
Se estiver usando o Redis, você pode limpar seletivamente as chaves relacionadas ao Ansible ou limpar todo o banco de dados usado pelo Ansible.
Para limpar todas as chaves associadas ao prefixo padrão do Ansible (geralmente relacionado à fonte de inventário):
# Connect to redis-cli and flush the entire database (DB 0 in this example)
redis-cli -n 0 FLUSHDB
Aviso:
FLUSHDBouFLUSHALLno Redis devem ser usados com extrema cautela, pois excluem todos os dados no banco de dados especificado ou em toda a instância Redis, respectivamente.
Resumo das Melhores Práticas
- Escolha com Sabedoria: Use o cache JSON para configurações simples, de usuário único, ou quando dependências externas são restritas. Use o Redis para ambientes colaborativos ou integração CI/CD em larga escala.
- Defina Timeouts Realistas: Configure
fact_caching_timeoutpara equilibrar os ganhos de desempenho com a atualização dos dados. Um timeout de 1 a 24 horas é comum para ambientes onde as configurações mudam com pouca frequência. - Verifique a Configuração: Sempre execute
ansible --versionou verifique a saída da sua primeira execução em cache para confirmar se o plugin de cache está ativo e funcionando. - Dependência de Inventário: O cache de fatos funciona melhor com inventários estáticos ou gerados dinamicamente. Se estiver usando scripts de inventário dinâmico que mudam frequentemente, o benefício do cache pode ser anulado por obsolescência ou erros.
Ao implementar corretamente o cache de fatos, você transforma o Ansible de uma ferramenta de configuração totalmente iterativa para um sistema altamente otimizado, capaz de gerenciar infraestrutura em escala massiva com latência mínima por execução.