Guida Completa alla Configurazione del Caching dei Fatti di Ansible

Configura il caching dei fatti di Ansible con jsonfile o Redis, imposta i timeout, cancella i dati della cache obsoleti ed evita il sovraccarico della raccolta ripetuta dei fatti.

Guida Completa alla Configurazione del Caching dei Fatti di Ansible

Il caching dei fatti di Ansible è utile quando i tuoi playbook impiegano troppo tempo a raccogliere gli stessi fatti degli host ad ogni esecuzione. Se gestisci centinaia di host, le chiamate ripetute al modulo setup possono aggiungere un notevole sovraccarico SSH prima ancora che inizi il lavoro reale.

Il caching dei fatti memorizza i fatti raccolti dopo un'esecuzione riuscita, per poi riutilizzarli finché la cache è ancora valida. Il risultato è un avvio più rapido del playbook per i flussi di lavoro che possono tollerare fatti leggermente obsoleti.

Comprendere i Fatti di Ansible e l'Impatto sulle Prestazioni

Ansible raccoglie i fatti con il modulo setup, sia esplicitamente che attraverso il comportamento predefinito gather_facts: true. I fatti includono dettagli come la famiglia del sistema operativo, il kernel, gli indirizzi IP, i mount, la CPU, la memoria e le informazioni sull'interprete Python.

Il guadagno in termini di prestazioni deriva dall'evitare la raccolta remota ripetuta quando i dati memorizzati nella cache sono freschi. Ciò è utile per la reportistica, i template e la logica condizionale che dipende da fatti che non cambiano di minuto in minuto.

Metodi di Configurazione per il Caching dei Fatti

Ansible configura il caching dei fatti in ansible.cfg. Due scelte pratiche sono i file JSON locali e Redis. I nomi esatti dei plugin sono importanti.

1. Caching su File JSON (Archiviazione Locale)

La cache su file JSON memorizza i fatti sulla macchina di controllo. È semplice e non necessita di servizi esterni.

Configurare il Caching JSON in ansible.cfg

Usa il plugin cache jsonfile:

[defaults]
fact_caching = jsonfile
fact_caching_connection = /percorso/della/cache_dei_fatti_ansible
fact_caching_timeout = 600

fact_caching_connection è la directory in cui Ansible scrive i file della cache. Creala prima e assicurati che l'utente che esegue Ansible possa scrivervi:

mkdir -p /percorso/della/cache_dei_fatti_ansible

fact_caching_timeout è misurato in secondi. Dopo il timeout, Ansible raccoglie nuovamente i fatti freschi quando un play ne ha bisogno.

2. Caching su Redis (Archiviazione Condivisa e ad Alte Prestazioni)

Redis funziona meglio quando più nodi di controllo, utenti o job CI devono condividere la stessa cache dei fatti.

Prerequisiti per il Caching su Redis

Hai bisogno di un server Redis raggiungibile e del client Python Redis disponibile nell'ambiente Python utilizzato da Ansible:

python -m pip install redis

Configurare il Caching su Redis in ansible.cfg

Usa una stringa di connessione Redis:

[defaults]
fact_caching = redis
fact_caching_connection = 127.0.0.1:6379/0
fact_caching_timeout = 3600

/0 seleziona il database Redis 0. Usa un database o un'istanza Redis dedicata se anche altre applicazioni usano Redis, e proteggi l'endpoint Redis come qualsiasi altro servizio infrastrutturale.

Integrare il Caching nei Playbook

La cache viene popolata quando un play raccoglie i fatti:

- name: Raccogli e usa i fatti
  hosts: webservers
  gather_facts: true
  tasks:
    - name: Mostra la famiglia del sistema operativo
      debug:
        msg: "La famiglia del sistema operativo è {{ ansible_os_family }}"

Con il caching dei fatti abilitato, Ansible può riutilizzare i fatti memorizzati nella cache finché sono validi. Se i fatti sono mancanti o scaduti e gather_facts: true, Ansible li raccoglie di nuovo.

Se imposti gather_facts: false, Ansible non esegue la raccolta dei fatti per quel play. I fatti memorizzati nella cache potrebbero essere ancora disponibili tramite le variabili host se già memorizzati, ma non fare affidamento ciecamente su di essi per logiche critiche. Una cache mancante può rendere le variabili non definite.

Un pattern sicuro è raccogliere i fatti in un play programmato o iniziale, poi usare i fatti memorizzati nella cache in playbook di reportistica o orchestrazione successivi dove l'obsolescenza è accettabile.

Gestire la Cache dei Fatti

Cancella la cache quando i fatti dell'host sono cambiati e non vuoi aspettare il timeout.

Cancellare la Cache JSON

Elimina i file nella directory della cache configurata:

rm -rf /percorso/della/cache_dei_fatti_ansible/*

Cancellare la Cache Redis

Se il database Redis è dedicato ai fatti di Ansible, puoi svuotare quel database:

redis-cli -n 0 FLUSHDB

FLUSHDB elimina ogni chiave nel database Redis selezionato. Non eseguirlo su un database condiviso a meno che tu non sappia che ogni chiave presente è sicura da eliminare.

Best Practices

  • Usa jsonfile per una singola macchina di controllo e flussi di lavoro locali semplici.
  • Usa Redis quando più esecutori necessitano della stessa cache.
  • Mantieni i timeout brevi per infrastrutture in rapido cambiamento e più lunghi per flotte stabili.
  • Non memorizzare nella cache fatti personalizzati sensibili in una posizione che altri utenti possono leggere.
  • Verifica quale file di configurazione sta usando Ansible con ansible --version.
  • Testa con un gruppo di inventario prima di abilitare il caching su una vasta flotta.

Conclusione Pratica

Abilita il caching dei fatti di Ansible quando la raccolta ripetuta dei fatti è un costo misurabile e i tuoi playbook possono tollerare dati memorizzati nella cache. Inizia con jsonfile, passa a Redis solo quando condividere la cache risolve un problema reale del flusso di lavoro, e imposta un timeout che corrisponda alla frequenza con cui cambiano i fatti dei tuoi host.