Guia Completo para Configuração de Cache de Fatos do Ansible
Configure o cache de fatos do Ansible com jsonfile ou Redis, defina timeouts, limpe dados de cache obsoletos e evite a sobrecarga de coleta repetida de fatos.
Guia Completo para Configuração de Cache de Fatos do Ansible
O cache de fatos do Ansible ajuda quando seus playbooks gastam muito tempo coletando os mesmos fatos do host em cada execução. Se você gerencia centenas de hosts, chamadas repetidas do módulo setup podem adicionar uma sobrecarga SSH perceptível antes mesmo do trabalho real começar.
O cache de fatos armazena os fatos coletados após uma execução bem-sucedida e os reutiliza enquanto o cache ainda for válido. O resultado é uma inicialização mais rápida do playbook para fluxos de trabalho que podem tolerar fatos ligeiramente desatualizados.
Entendendo os Fatos do Ansible e o Impacto no Desempenho
O Ansible coleta fatos com o módulo setup, seja explicitamente ou através do comportamento padrão gather_facts: true. Os fatos incluem detalhes como família do SO, kernel, endereços IP, montagens, CPU, memória e informações do interpretador Python.
O ganho de desempenho vem de evitar a coleta remota repetida quando os dados em cache estão atualizados. Isso é útil para relatórios, templates e lógica condicional que depende de fatos que não mudam minuto a minuto.
Métodos de Configuração para Cache de Fatos
O Ansible configura o cache de fatos no ansible.cfg. Duas escolhas práticas são arquivos JSON locais e Redis. Os nomes exatos dos plugins são importantes.
1. Cache de Arquivo JSON (Armazenamento Local)
O cache de arquivo JSON armazena os fatos na máquina de controle. É simples e não precisa de serviço externo.
Configurando Cache JSON no ansible.cfg
Use o plugin de cache jsonfile:
[defaults]
fact_caching = jsonfile
fact_caching_connection = /caminho/para/cache_de_fatos_ansible
fact_caching_timeout = 600
fact_caching_connection é o diretório onde o Ansible escreve os arquivos de cache. Crie-o primeiro e certifique-se de que o usuário que executa o Ansible pode escrever nele:
mkdir -p /caminho/para/cache_de_fatos_ansible
fact_caching_timeout é medido em segundos. Após o timeout, o Ansible coleta fatos novamente quando um play precisar deles.
2. Cache Redis (Armazenamento Compartilhado de Alto Desempenho)
O Redis funciona melhor quando vários nós de controle, usuários ou jobs de CI precisam compartilhar o mesmo cache de fatos.
Pré-requisitos para Cache Redis
Você precisa de um servidor Redis acessível e do cliente Python Redis disponível no ambiente Python que o Ansible usa:
python -m pip install redis
Configurando Cache Redis no ansible.cfg
Use uma string de conexão Redis:
[defaults]
fact_caching = redis
fact_caching_connection = 127.0.0.1:6379/0
fact_caching_timeout = 3600
O /0 seleciona o banco de dados Redis 0. Use um banco de dados dedicado ou instância Redis se outros aplicativos também usarem Redis, e proteja o endpoint Redis como qualquer outro serviço de infraestrutura.
Integrando Cache em Playbooks
O cache é populado quando um play coleta fatos:
- name: Coletar e usar fatos
hosts: servidores_web
gather_facts: true
tasks:
- name: Mostrar família do SO
debug:
msg: "A família do SO é {{ ansible_os_family }}"
Com o cache de fatos habilitado, o Ansible pode reutilizar fatos em cache enquanto forem válidos. Se os fatos estiverem ausentes ou expirados e gather_facts: true, o Ansible os coleta novamente.
Se você definir gather_facts: false, o Ansible não executa a coleta de fatos para aquele play. Os fatos em cache ainda podem estar disponíveis através de variáveis de host se já estiverem em cache, mas não confie cegamente nisso para lógica crítica. Um cache ausente pode tornar variáveis indefinidas.
Um padrão seguro é coletar fatos em um play agendado ou inicial, depois usar fatos em cache em playbooks de relatórios ou orquestração posteriores, onde a desatualização é aceitável.
Gerenciando o Cache de Fatos
Limpe o cache quando os fatos do host mudarem e você não quiser esperar pelo timeout.
Limpando Cache JSON
Exclua os arquivos no diretório de cache configurado:
rm -rf /caminho/para/cache_de_fatos_ansible/*
Limpando Cache Redis
Se o banco de dados Redis for dedicado aos fatos do Ansible, você pode limpar esse banco:
redis-cli -n 0 FLUSHDB
FLUSHDB exclui todas as chaves no banco de dados Redis selecionado. Não execute em um banco de dados compartilhado a menos que saiba que todas as chaves lá são seguras para excluir.
Melhores Práticas
- Use
jsonfilepara uma única máquina de controle e fluxos de trabalho locais simples. - Use Redis quando vários executores precisarem do mesmo cache.
- Mantenha timeouts curtos para infraestrutura que muda rapidamente e mais longos para frotas estáveis.
- Não armazene em cache fatos personalizados confidenciais em um local que outros usuários possam ler.
- Verifique qual arquivo de configuração o Ansible está usando com
ansible --version. - Teste com um grupo de inventário antes de habilitar o cache em uma frota grande.
Conclusão Prática
Habilite o cache de fatos do Ansible quando a coleta repetida de fatos for um custo mensurável e seus playbooks puderem tolerar dados em cache. Comece com jsonfile, mude para Redis apenas quando compartilhar o cache resolver um problema real de fluxo de trabalho e defina um timeout que corresponda à frequência com que os fatos do seu host mudam.