Как правило, структура плейбуков 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",
...
]
}