Инвентарь#

Расширения инвентаря (inventory plugins) обрабатывают определенным образом источники данных, на основе которых формируется конечное описание инвентаря.

Активация и использование#

По умолчанию Ansible использует все расширения описания инвентаря, имеющиеся в коллекции ansible.builtin. Однако, если в ansible.cfg задано значение параметра enable_plugins, включены будут только указанные расширения.

Пример явного включения нужных расширений#
[inventory]
enable_plugins=auto,yaml,ini,script

Расширение ansible.builtin.auto позволяет Ansible автоматически определить, какое расширение использовать для каждого файла инвентаря. Для этого Ansible анализирует структуру файла и при обнаружении ключа plugin подключает указанное расширение.

Пример явного указания расширения в файле инвентаря#
plugin: ansible.builtin.yaml
all:
  hosts:
    host1:

Для использования расширения необходимо предоставить ему источники инвентаря. Это выполняется при запуске утилит ansible, ansible-inventory или ansible-playbook. Далее приведен список вариантов указания источников в порядке убывания приоритета:

  • аргумент -i (--inventory, --inventory-file);

  • переменная окружения ANSIBLE_INVENTORY;

  • переменная inventory в конфигурационном файле ansible.cfg.

В сложных инфраструктурах исходное описание инвентаря может быть размещено в каталоге с разветвленной структурой внутренних каталогов и файлов. Ansible рекурсивно обходит указанный каталог и обрабатывает найденные в нем файлы в алфавитном порядке. Следует учитывать это, если используется расширение ansible.builtin.constructed, которое конструирует описание из подобных предварительных описаний узлов. Задать порядок загрузки описаний можно с помощью нескольких аргументов -i, например:

ansible-inventory -i hosts.yml -i extra_vars.yml -i constructed.yml

Расширения описания инвентаря могут создавать динамические группы (ключ keyed_groups) путем анализа переменных узлов. Также можно использовать ключ groups и генерировать переменные с помощью compose.

Пример описания инвентаря с динамической генерацией групп и переменных

Исходный файл с описанием узлов:

hosts.yml#
all:
  children:
    webserver:
      hosts:
        web01:
          ip: 10.0.0.1
        web02:
          ip: 10.0.1.1
    database:
      hosts:
        db01:
          ip: 10.0.0.2
    dev:
      hosts:
        web01:
        db01:
    prod:
      hosts:
        web02:

Файл с конфигурацией constructed:

constructed.yml#
plugin: constructed
groups:
  dev: "'dev' in group_names"
  prod: "'prod' in group_names"
keyed_groups:
  - key: ansible_host
    prefix: host_
    separator: "_"
compose:
  ansible_host: ip
  role: "'web' if 'webserver' in group_names else 'db'"

Запуск команды с объединением инвентарей:

ansible-inventory -i hosts.yml -i constructed.yml --graph

Результат:

@all
├──@dev
│  ├──web01
│  └──db01
├──@prod
│  └──web02
├──@webserver
│  ├──web01
│  └──web02
├──@database
│  └──db01
├──@host_10_0_0_1
│  └──web01
├──@host_10_0_0_2
│  └──db01
├──@host_10_0_1_1
│  └──web02
├──@role_web
│  ├──web01
│  └──web02
├──@role_db
│  └──db01
└──@ungrouped

Подробности о каждом расширении см. в справочнике.

Кеширование#

Некоторые расширения описания инвентаря могут использовать кеш. Он позволяет сохранять факты Ansible об узлах между запусками сценариев, чтобы ускорить работу и избежать повторных запросов.

Общие параметры кеша настраиваются в секциях [defaults] и [inventory] конфигурационного файла ansible.cfg:

Пример настройки кеша через ansible.cfg#
[defaults]
fact_caching = ansible.builtin.jsonfile
fact_caching_connection = /tmp/ansible_facts
cache_timeout = 3600

[inventory]
cache = yes
cache_connection = /tmp/ansible_inventory

Для некоторых специфичных расширений описания инвентаря настройки задаются в конфигурационном файле конкретного расширения, например:

Пример настройки кеша через конфигурационный файл расширения demo.aws_ec2.yml#
plugin: amazon.aws.aws_ec2
cache: true
cache_plugin: ansible.builtin.jsonfile
cache_timeout: 7200
cache_connection: /tmp/aws_inventory
cache_prefix: aws_ec2

Подробнее о кешировании см. Кеширование.