Что такое факты (facts) в Ansible?

«Что такое факты (facts) в Ansible?» — вопрос из категории Ansible, который задают на 28% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Как это работает и зачем нужно: При запуске плейбука Ansible выполняет специальный модуль setup на каждом хосте, который собирает сотни фактов. Эти данные затем доступны как переменные в задачах, что позволяет писать адаптивные и универсальные плейбуки.

Примеры полезных фактов и их использование:

- name: Print host information
  debug:
    msg: >
      Host {{ ansible_hostname }} runs {{ ansible_distribution }} {{ ansible_distribution_version }}
      on {{ ansible_architecture }} architecture.
      It has {{ ansible_memtotal_mb }} MB of RAM and IP {{ ansible_default_ipv4.address }}.

- name: Install Nginx package based on OS family
  package:
    name: nginx
    state: present
  when: ansible_os_family == "Debian" # Используем факт для условного выполнения

- name: Create a directory in the user's home
  file:
    path: "{{ ansible_env.HOME }}/app_logs"
    state: directory
    owner: "{{ ansible_user_id }}"

Управление сборкой фактов:

  • Отключение: Для ускорения выполнения можно отключить сборку фактов для всего плейбука или отдельной пьесы.
    - hosts: webservers
      gather_facts: false # Факты собираться не будут
      tasks:
        - ...
  • Кэширование фактов: Для ещё большей скорости в средах с постоянной инфраструктурой можно включить кэширование фактов (в Redis, JSON-файл, Memcached).
  • Пользовательские факты (Custom Facts): Можно расширять информацию, добавляя свои факты.
    • Через файлы: Поместить исполняемый скрипт или JSON-файл в /etc/ansible/facts.d/ на целевом хосте. Ansible автоматически загрузит их как факты с префиксом ansible_local.
    • Динамически в плейбуке: Использовать модуль set_fact для создания переменных на лету.
    • name: Set a custom fact for deployment version set_fact: app_deployment_version: "v2.1.4"