В Ansible многие используют facts только для базовых вещей:
ansible_os_family, ansible_hostname, ansible_default_ipv4. Но механизм фактов куда мощнее, если копнуть глубже, можно строить динамичную и умную автоматизацию.1️⃣ Отключаем сбор всего лишнего (и ускоряем playbook). По умолчанию Ansible собирает огромный набор фактов. Если они не нужны - это просто трата времени.
- hosts: all
gather_facts: false
А если нужны только сетевые:
- hosts: all
gather_facts: true
gather_subset:
- network
Это особенно заметно в больших инфраструктурах.
2️⃣ Используем facts как динамические условия. Например, разные действия для разных типов виртуализации:
- name: Install qemu tools
package:
name: qemu-guest-agent
state: present
when: ansible_virtualization_type == "kvm"```yaml
Или автоматический выбор пакетов по версии ОС:
```yaml
when: ansible_distribution_major_version | int >= 9
3️⃣ Кастомные факты (local facts). Самый недооцененный механизм.
Создаем на хосте файл:
/etc/ansible/facts.d/app.fact
Пример содержимого (JSON):
{
"role": "backend",
"env": "prod"
}
После этого факты будут доступны как:
ansible_local.app.role
ansible_local.app.env
Теперь сервер сам знает, кто он, а плейбук просто реагирует.
4️⃣ Динамические факты через set_fact. Можно вычислять значения на лету:
- set_fact:
is_prod: "{{ 'prod' in inventory_hostname }}"
И дальше использовать:
when: is_prod
Важно помнить: set_fact живет в рамках хоста и текущего play.
5️⃣ Делегированные факты. Иногда нужно собрать факт с одного хоста и использовать на другом:
- name: Get DB IP
command: hostname -I
register: db_ip
delegate_to: db01
run_once: true
Теперь можно передать IP в шаблон для backend-серверов.
6️⃣ Кэширование фактов. В больших инвентарях сбор фактов - это дорогая операция. Можно включить fact caching (например, в Redis или JSON):
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_facts_cache
fact_caching_timeout = 86400
7️⃣ Факты как источник архитектуры. Можно строить инфраструктурную логику без жестких групп:
если есть второй диск, то настраиваем RAID
если RAM > 16GB, то увеличиваем worker-пулы
если это VM, то отключаем tuned-профили для bare metal
Пример:
when: ansible_memtotal_mb > 16000
#ansible #devops
🧑💻 NetworkAdmin