← Назад к вопросам

Когда выполняются факты в ansible?

2.0 Middle🔥 221 комментариев
#Ansible и управление конфигурацией

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Время выполнения фактов (facts) в Ansible

В Anible факты (facts) — это системная информация, собранная с управляемых узлов (hosts). Время их выполнения строго определено и является критически важным аспектом архитектуры Ansible, влияющим на производительность, идемпотентность и логику плейбуков.

Основные этапы сбора фактов

Сбор фактов происходит в следующие ключевые моменты:

  1. Автоматически перед выполнением задач в плейбуке — это дефолтное и наиболее частое поведение. При запуске плейбука (за исключением случаев, описанных ниже) 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  # Факт уже доступен!
    
  2. Явным вызовом модуля 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 }}"
    
  3. При использовании динамического инвентаря, если он возвращает переменные 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)

Важно понимать последовательность:

  1. Парсинг инвентаря (статического или динамического).
  2. Если gather_facts: yes → Выполнение модуля setup на каждом узле. Собранные факты добавляются в host facts (переменные, уникальные для каждого узла).
  3. Выполнение задач плейбука. Во всех задачах на этом узле доступны собранные факты.
  4. Факты, собранные модулем setup, кэшируются по умолчанию для длительности выполнения плейбука (ansible-run). Это можно изменить с помощью факт-кэширования (Redis, Memcached, jsonfile), который сохраняет факты между запусками Ansible, что радикально ускоряет последующие выполнения.

Практические следствия и лучшие практики

  • Производительность: Сбор всех фактов (all) может занимать значительное время (0.5-2 секунды на узел). На больших кластерах это приводит к задержкам. Всегда отключайте (gather_facts: no) сбор, если факты не используются.
  • Условная логика: Факты, собранные автоматически, доступны для условий (when:) уже в первой задаче.
  • Идемпотентность: Поскольку факты собираются до основных задач, их значения отражают состояние системы на момент начала выполнения плейбука. Если задача меняет систему (например, устанавливает пакет), соответствующий факт (например, ansible_pkg_mgr или список установленных пакетов) не обновится до явного повторного сбора.
  • Факты как переменные: Все автоматически собранные факты — это переменные с высоким приоритетом, которые можно переопределять в инвентаре или через set_fact, но их исходное значение — это «снимок» системы.

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