Короткий ответ
Динамический inventory получает список хостов и их группировку не из статического файла, а опросом внешнего источника (облачного API, CMDB) в момент запуска плейбука, поэтому он всегда отражает текущий набор инстансов; для AWS это настраивается YAML-файлом инвентаря с plugin: amazon.aws.aws_ec2, фильтрами по тегам и правилами keyed_groups для автоматической группировки, вместо того чтобы вручную поддерживать список IP при каждом масштабировании ASG.
Как это работает подробнее
при запуске ansible-playbook -i inventory_aws_ec2.yml плагин инвентаря обращается к EC2 API, получает список инстансов по заданным фильтрам (регион, теги, состояние running), и на основе keyed_groups/hostnames строит группы и имена хостов динамически на каждый прогон, то есть источником правды становится сам облак, а не файл в репозитории.
Пример кода
# inventory_aws_ec2.yml
plugin: amazon.aws.aws_ec2
regions:
- eu-central-1
filters:
instance-state-name: running
tag:Environment: prod
keyed_groups:
- key: tags.Role
prefix: role
$ ansible-inventory -i inventory_aws_ec2.yml --graph
@all:
|--@role_web:
| |--ec2-10-0-1-11
| |--ec2-10-0-1-27Что использовать на практике
- Практика. такой инвентарь стоит ограничивать фильтрами по тегам и регионам, чтобы не захватывать чужие или неожиданные ресурсы, и кэшировать результат опроса API (
cache: yesс TTL) при частых прогонах, чтобы не упираться в лимиты API; для гибридных случаев (часть хостов статична — например, bare-metal, часть динамична — облако) используют несколько источников инвентаря одновременно, передавая директорию с несколькими inventory-файлами через-i.
Подводные камни
- Ошибка. частая ошибка — не указывать фильтр по состоянию инстанса, из-за чего в inventory попадают и остановленные/terminated инстансы, к которым playbook не может подключиться, что выглядит как случайные сбои подключения; другая ошибка — полагаться на динамический inventory без кэша в playbook, который запускается очень часто, и упираться в rate limit облачного API.