Полное руководство по настройке кэширования фактов Ansible

Настройте кэширование фактов Ansible с помощью jsonfile или Redis, установите таймауты, очищайте устаревшие данные кэша и избегайте избыточного сбора фактов.

Полное руководство по настройке кэширования фактов Ansible

Кэширование фактов Ansible помогает, когда ваши плейбуки тратят слишком много времени на сбор одних и тех же фактов хоста при каждом запуске. Если вы управляете сотнями хостов, повторные вызовы модуля setup могут добавить заметные накладные расходы SSH до того, как начнется реальная работа.

Кэширование фактов сохраняет собранные факты после успешного запуска, а затем повторно использует их, пока кэш действителен. Результат — более быстрый запуск плейбуков для рабочих процессов, которые могут допускать слегка устаревшие факты.

Понимание фактов Ansible и их влияния на производительность

Ansible собирает факты с помощью модуля setup, либо явно, либо через поведение по умолчанию gather_facts: true. Факты включают такие детали, как семейство ОС, ядро, IP-адреса, точки монтирования, ЦП, память и информацию об интерпретаторе Python.

Выигрыш в производительности достигается за счет отказа от повторного удаленного сбора, когда кэшированные данные свежи. Это полезно для отчетности, шаблонов и условной логики, которая зависит от фактов, не меняющихся ежеминутно.

Методы настройки кэширования фактов

Ansible настраивает кэширование фактов в ansible.cfg. Два практических варианта — локальные JSON-файлы и Redis. Точные имена плагинов имеют значение.

1. Кэширование в JSON-файлах (локальное хранилище)

Кэш JSON-файлов хранит факты на управляющей машине. Это просто и не требует внешнего сервиса.

Настройка JSON-кэширования в ansible.cfg

Используйте плагин кэша jsonfile:

[defaults]
fact_caching = jsonfile
fact_caching_connection = /path/to/ansible_facts_cache
fact_caching_timeout = 600

fact_caching_connection — это каталог, в который Ansible записывает файлы кэша. Создайте его заранее и убедитесь, что пользователь, запускающий Ansible, может в него записывать:

mkdir -p /path/to/ansible_facts_cache

fact_caching_timeout измеряется в секундах. После истечения таймаута Ansible снова собирает свежие факты, когда они нужны плейбуку.

2. Кэширование в Redis (общее высокопроизводительное хранилище)

Redis лучше подходит, когда несколько управляющих узлов, пользователей или заданий CI должны использовать один и тот же кэш фактов.

Предварительные требования для кэширования в Redis

Вам нужен доступный сервер Redis и клиент Python Redis в среде Python, которую использует Ansible:

python -m pip install redis

Настройка кэширования в Redis в ansible.cfg

Используйте строку подключения Redis:

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

/0 выбирает базу данных Redis 0. Используйте выделенную базу данных или экземпляр Redis, если другие приложения также используют Redis, и защищайте конечную точку Redis как любой другой инфраструктурный сервис.

Интеграция кэширования в плейбуки

Кэш заполняется, когда плейбук собирает факты:

- name: Сбор и использование фактов
  hosts: webservers
  gather_facts: true
  tasks:
    - name: Показать семейство ОС
      debug:
        msg: "Семейство ОС: {{ ansible_os_family }}"

С включенным кэшированием фактов Ansible может повторно использовать кэшированные факты, пока они действительны. Если факты отсутствуют или устарели и gather_facts: true, Ansible собирает их заново.

Если вы установите gather_facts: false, Ansible не будет запускать сбор фактов для этого плейбука. Кэшированные факты могут быть доступны через переменные хоста, если они уже были кэшированы, но не полагайтесь на это вслепую для критической логики. Отсутствие кэша может сделать переменные неопределенными.

Безопасный шаблон — собирать факты в запланированном или раннем плейбуке, а затем использовать кэшированные факты в последующих плейбуках отчетности или оркестрации, где допустима устаревшая информация.

Управление кэшем фактов

Очищайте кэш, когда факты хоста изменились и вы не хотите ждать истечения таймаута.

Очистка JSON-кэша

Удалите файлы в настроенном каталоге кэша:

rm -rf /path/to/ansible_facts_cache/*

Очистка кэша Redis

Если база данных Redis выделена для фактов Ansible, вы можете очистить эту базу данных:

redis-cli -n 0 FLUSHDB

FLUSHDB удаляет все ключи в выбранной базе данных Redis. Не запускайте ее на общей базе данных, если вы не уверены, что все ключи там можно безопасно удалить.

Лучшие практики

  • Используйте jsonfile для одной управляющей машины и простых локальных рабочих процессов.
  • Используйте Redis, когда нескольким исполнителям нужен один и тот же кэш.
  • Устанавливайте короткие таймауты для быстро меняющейся инфраструктуры и более длинные для стабильных парков.
  • Не кэшируйте чувствительные пользовательские факты в месте, доступном для чтения другим пользователям.
  • Проверьте, какой файл конфигурации использует Ansible, с помощью ansible --version.
  • Тестируйте с одной группой инвентаря перед включением кэширования на большом парке.

Практический вывод

Включайте кэширование фактов Ansible, когда повторный сбор фактов является измеримой затратой и ваши плейбуки могут терпеть кэшированные данные. Начните с jsonfile, переходите на Redis только тогда, когда совместное использование кэша решает реальную проблему рабочего процесса, и установите таймаут, соответствующий частоте изменения фактов ваших хостов.