Блог "Дети ОИТа"
/поиск

Инвентарь и динамические источники: форматы, группы, фильтры и кэш

Инвентарь — это источник правды о вашей инфраструктуре. От структуры зависит скорость плейбуков, читаемость кода и масштабируемость. Форматы (INI/YAML), иерархия групп, host_vars vs group_vars, кэширование динамических источников и production-ready чек-лист.

Инвентарь и динамические источники: от INI до облака

Инвентарь — это источник правды о вашей инфраструктуре. От того, как он структурирован, зависит скорость плейбуков, читаемость кода и масштабируемость всей системы.

1. Форматы: выбираем правильный инструмент

INI — классика для малого парка

Прост и понятен, но плохо масштабируется.

[webservers]
app01-prod ansible_host=10.0.1.11
app02-prod ansible_host=10.0.1.12

[databases]
db01-prod ansible_host=10.0.2.11

YAML — читаемость и вложенность

Рекомендуемый формат для сложных структур.

all:
  children:
    prod:
      children:
        app:
          hosts:
            app01-prod:
              ansible_host: 10.0.1.11
              ansible_user=deploy
            app02-prod:
              ansible_host: 10.0.1.12
        db:
          hosts:
            db01-prod:
              ansible_host: 10.0.2.11
    stage:
      children:
        app:
          hosts:
            app01-stage:
              ansible_host: 10.1.1.11

Динамический инвентарь

Когда хостов сотни или они живут в облаке. Плагины для AWS, GCP, Azure, Kubernetes.

# Пример для AWS EC2
ansible-inventory -i aws_ec2.yml --list --yaml

2. Архитектура групп: иерархия — ваш друг

Избегайте плоских списков. Используйте children для логической вложенности.

Схема иерархии групп (текстовая):

all
├── prod
│ ├── app
│ ├── db
│ └── cache
└── stage
├── app
└── db

Правила:

  • Группируйте по окружению (prod, stage, dev).
  • Группируйте по роли (web, db, cache).
  • Используйте составные группы: [production:children].

3. Фильтрация: как не обновлять всё подряд

Запускайте плейбуки точечно:

  • ansible-playbook site.yml --limit 'app:&prod' (хосты, которые и app, и prod).
  • ansible-playbook site.yml --limit 'db:!staging' (все db, кроме staging).
  • ansible-playbook site.yml --limit 'webservers,db01-prod' (конкретный список).

4. Переменные: host_vars vs group_vars

  • group_vars/ — политики и настройки роли (например, версия nginx для всех веб-серверов).
  • host_vars/ — уникальные параметры конкретного сервера (IP, сертификаты).

Никогда не храните переменные внутри файла инвентаря, если их больше 5 строк.

5. Динамический инвентарь: кэширование

Каждый запуск aws_ec2.py бьёт по API. Включите кэш.

ansible.cfg:

[inventory]
cache = yes
cache_plugin = jsonfile
cache_connection = /tmp/ansible_inventory_cache
cache_timeout = 7200  # 2 часа

Принудительное обновление:

ansible-playbook site.yml --flush-cache

6. Production-ready чек-лист

  • Инвентарь в YAML, а не INI.
  • Иерархия групп через children.
  • Переменные вынесены в group_vars/ и host_vars/.
  • Включено кэширование для динамических источников.
  • Настроена валидация: ansible-inventory --list --yaml > /dev/null.
  • Документация соглашений по именованию (например: app01-prod-ru).
  • Для облака используется тегирование вместо ручного перечисления хостов.

7. Мини-пример: AWS EC2 с фильтрацией

inventory/aws_ec2.yml:

plugin: aws_ec2
regions:
  - eu-central-1
keyed_groups:
  - key: tags.Role
    prefix: role_
  - key: tags.Env
    prefix: env_
hostnames:
  - tag:Name
filters:
  tag:Env: prod
  instance-state-name: running

Теперь у вас автоматически появятся группы:

  • role_web, role_db
  • env_prod

И вы сможете писать: --limit 'role_web:&env_prod'.

См. также