Ansible facts
Тема дорожной карты · Ansible
Факты Ansible — это системные переменные, автоматически собираемые с управляемых хостов в начале каждого play модулем setup, предоставляющие подробную информацию об аппаратном обеспечении хоста, операционной системе, сетевых интерфейсах, IP-адресах, установленных пакетах и многом другом. Факты доступны в playbook как ansible_facts['distribution'] или через устаревшее плоское имя переменной ansible_distribution, и широко используются в условиях when, например when: ansible_facts['os_family'] == "Debian", для ветвления выполнения задач на основе реального состояния хоста. Фаза сбора фактов добавляет накладные расходы к каждому play; её можно отключить с помощью gather_facts: false, когда факты не нужны, или оптимизировать, задав gather_subset: ['!all', 'network'] для сбора только конкретных категорий фактов. Пользовательские факты можно развернуть на управляемых хостах, разместив исполняемые скрипты или статические JSON/INI-файлы в /etc/ansible/facts.d/, после чего Ansible публикует их в ansible_local для использования в последующих playbook.
Как это работает
Ansible facts покрывает приоритет переменных (CLI > playbook > role defaults > inventory) — в доке 22 уровня, но на практике нужно несколько. Шаблоны на Jinja2 ({{ var }}, {% if %}, фильтры default, to_json, regex_replace). Модуль template рендерит Jinja2-файл с переменными и копирует на таргет. lookup-плагины читают из внешних источников (file, env, password, csvfile, redis).
Когда применять
Держите переменные организованными: group_vars/all.yml — cross-environment дефолты, group_vars/<env>.yml — env-override, host_vars/<host>.yml — host-специфика. Jinja2-шаблоны — для конфиг-файлов (nginx.conf, application.yml); намного чище цепочек lineinfile. Фильтр default(value) — для безопасных fallback. Избегайте глубокого вложенного precedence — дебаг "какое значение выиграло" болезненный.
Типичные ошибки
Ловушки Ansible facts: переменные в нескольких местах без явного победителя ("я же поставил в inventory!"); ошибки Jinja2 в шаблонах, работающие в dev и валящиеся в prod из-за undefined var (strict undefined ловит); коммит рендеренных шаблонов в git (пишите Jinja-источник, не output); не знают про hostvars для cross-host ссылок.