Когда выполняются факты в ansible?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Время выполнения фактов (facts) в Ansible
В Anible факты (facts) — это системная информация, собранная с управляемых узлов (hosts). Время их выполнения строго определено и является критически важным аспектом архитектуры Ansible, влияющим на производительность, идемпотентность и логику плейбуков.
Основные этапы сбора фактов
Сбор фактов происходит в следующие ключевые моменты:
-
Автоматически перед выполнением задач в плейбуке — это дефолтное и наиболее частое поведение. При запуске плейбука (за исключением случаев, описанных ниже) Ansible первым делом на каждом целевом узле выполняет специальный модуль
setup. Это происходит даже до выполнения первой задачи, описанной вtasks:.# Пример: Факты будут собраны ДО выполнения задачи 'Install nginx' - hosts: webservers tasks: - name: Install nginx ansible.builtin.apt: name: nginx state: present - name: Debug a fact ansible.builtin.debug: var: ansible_distribution # Факт уже доступен! -
Явным вызовом модуля
setupвнутри задач плейбука. Вы можете повторно собрать факты в середине выполнения, если система была изменена предыдущими задачами и вам нужна актуальная информация.- name: Update package cache and re-gather facts ansible.builtin.apt: update_cache: yes - name: Re-run setup to get latest package info ansible.builtin.setup: - name: Check if kernel was updated ansible.builtin.debug: msg: "Current kernel is {{ ansible_kernel }}" -
При использовании динамического инвентаря, если он возвращает переменные
ansible_*_host. Эти переменные (например,ansible_host,ansible_port,ansible_user) часто собираются или вычисляются на этапе инвентаризации, до подключения к узлу и выполнения модуляsetup.
Управление сбором фактов: gather_facts
Ключевой директивой для контроля этого процесса является параметр gather_facts на уровне плейбука (play).
-
gather_facts: yes(значение по умолчанию): Факты собираются автоматически перед задачами. -
gather_facts: no: Сбор фактов пропускается. Это критически важно для ускорения выполнения в сценариях, где факты не нужны (например, массовая перезагрузка серверов).- hosts: all gather_facts: no # УСКОРЕНИЕ: факты не собираются tasks: - name: Reboot server ansible.builtin.reboot: -
gather_subsetиgather_timeout: Параметры модуляsetup, позволяющие тонко настраивать процесс. Можно собирать только определенные категории фактов (например, только сетевые), что также ускоряет выполнение.- hosts: all gather_facts: yes tasks: - name: Gather only network facts ansible.builtin.setup: gather_subset: - network - name: Show IP address ansible.builtin.debug: var: ansible_default_ipv4.address
Поток выполнения и область видимости (scope)
Важно понимать последовательность:
- Парсинг инвентаря (статического или динамического).
- Если
gather_facts: yes→ Выполнение модуляsetupна каждом узле. Собранные факты добавляются в host facts (переменные, уникальные для каждого узла). - Выполнение задач плейбука. Во всех задачах на этом узле доступны собранные факты.
- Факты, собранные модулем
setup, кэшируются по умолчанию для длительности выполнения плейбука (ansible-run). Это можно изменить с помощью факт-кэширования (Redis, Memcached, jsonfile), который сохраняет факты между запусками Ansible, что радикально ускоряет последующие выполнения.
Практические следствия и лучшие практики
- Производительность: Сбор всех фактов (
all) может занимать значительное время (0.5-2 секунды на узел). На больших кластерах это приводит к задержкам. Всегда отключайте (gather_facts: no) сбор, если факты не используются. - Условная логика: Факты, собранные автоматически, доступны для условий (
when:) уже в первой задаче. - Идемпотентность: Поскольку факты собираются до основных задач, их значения отражают состояние системы на момент начала выполнения плейбука. Если задача меняет систему (например, устанавливает пакет), соответствующий факт (например,
ansible_pkg_mgrили список установленных пакетов) не обновится до явного повторного сбора. - Факты как переменные: Все автоматически собранные факты — это переменные с высоким приоритетом, которые можно переопределять в инвентаре или через
set_fact, но их исходное значение — это «снимок» системы.
Таким образом, понимание того, когда и как выполняются факты, позволяет писать более эффективные, быстрые и предсказуемые плейбуки, грамотно управляя сбором системной информации в зависимости от задач.