Документация
Инструкции
Множественный инвентарь в Ansible (multiple inventory)


Как правило, структура плейбуков ansible подразумевает один источник данных для инвентаря: статический, он же текстовый файл, либо динамический - скрипт, генерирующий данные для инвентаря.
В этой статье расскажем, как конфигурировать множественные источники инвентаря (multiple inventory) ansible и комбинировать получение данных о хостах окружения из Openstack API и текстовых файлов. В нашем примере списки хостов будут подтягиваться динамически из Openstack API, а в статическом ini файле будет собственное описание групп.


Весь секрет кроется в том, что параметру --inventory в ansible можно передавать не только тектовый ini файл, но и директорию, которая будет содержать любое количество инвентарей, как статических, так и динамических.

Порядок действий, описанный в статье, выполняется автоматически при установке виртуального сервера из шаблона 'Openstack & Ansible shellbox'.

1. В первую очедерь вместо файла hosts создаем директорию
    mv hosts hosts.old
    mkdir -p hosts
  
2. Подвязываем ansible к Openstack (подробнее о подключении ansible к Openstack в статье)
    $ cat ansible.cfg
    [defaults]
    inventory=hosts
    ...
    [inventory]
    enable_plugins = ini, openstack
    ...
  
    $ cat hosts/openstack.yml
    plugin: openstack
    ...
  
3. Добавляем статический ini файл hosts/all с описанием дополнительных групп
    $ cat hosts/all
    [mysql]
    mysql01
    mysql01

    [nginx]
    nginx02
    nginx01

    [redis]
    redis01
    redis01

    [ubuntu]
    shellbox01
    ...
  

Получилась такая структура файлов
    $ tree -L 2
    ├── ansible.cfg
    ├── group_vars
    ├── host_vars
    ├── hosts
    │   ├── all
    │   └── openstack.yml
  
Готово, теперь мы можем обращаться к собственным группам хостов
    $ ansible localhost -m debug -a 'var=groups.keys()'
    localhost | SUCCESS => {
    "groups.keys()": [
        ...
        "all",
        "nova",
        "ungrouped",
        "ubuntu",
        "mysql",
        "nginx",
        "redis",
        "flavor-vibox1",
        ...

    ]
}