Инвентарь и динамические источники: форматы, группы, фильтры и кэш
Инвентарь — это источник правды о вашей инфраструктуре. От структуры зависит скорость плейбуков, читаемость кода и масштабируемость. Форматы (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_dbenv_prod
И вы сможете писать: --limit 'role_web:&env_prod'.