← Назад к вопросам

Что такое dynamic inventory?

1.3 Junior🔥 161 комментариев
#Другое

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Dynamic Inventory в Ansible

Dynamic Inventory (Динамический инвентори) — это механизм в Ansible, который позволяет автоматически собирать и актуализировать информацию о целевых хостах (managed hosts) из внешних источников данных, таких как облачные провайдеры, системы мониторинга, CMDB или собственные скрипты, вместо использования статичных файлов в формате JSON или YAML.

В отличие от статичного инвентори, где список хостов и их переменные жестко заданы в файлах, динамический инвентори генерирует этот список в момент выполнения команды ansible-playbook или ansible, запрашивая данные из внешней системы. Это критически важно для современных инфраструктур, особенно в облачных средах (AWS, Azure, GCP), где количество и состояние серверов могут меняться динамически.

Ключевые особенности и преимущества

  • Автоматическая актуализация: Не требуется ручное редактирование файлов при добавлении/удалении серверов. Инвентори всегда отражает текущее состояние инфраструктуры.
  • Интеграция с внешними системами: Ansible может получать данные из облачных API (через официальные модули, такие как aws_ec2), систем виртуализации (VMware, OpenStack), или даже из простого скрипта, возвращающего JSON.
  • Группировка хостов по динамическим признакам: Например, автоматическое распределение серверов по группам tag_Environment_Production, tag_Application_Web, instance_type_t2_micro в AWS.
  • Масштабирование: Идеально для управления сотнями и тысячами изменяющихся инстансов.

Как работает Dynamic Inventory?

Основная идея — наличие исполняемого скрипта (или модуля), который при запуске возвращает JSON-структуру, полностью соответствующую формату статичного инвентори Ansible. Этот скрипт может быть:

  1. Официальным плагином (например, amazon.aws.aws_ec2).
  2. Кастомным скриптом (Python, Bash и т.д.), интегрирующимся с вашей внутренней системой.

Ansible вызывает этот скрипт/плагин и использует его вывод как источник данных о хостах.

Пример: Dynamic Inventory для AWS EC2 с использованием плагина aws_ec2

Это наиболее распространенный пример. Вместо файла inventory.ini мы создаем файл inventory.yml и описываем в нем источник данных.

# inventory.yml
plugin: amazon.aws.aws_ec2
regions:
  - us-east-1
  - eu-west-1
keyed_groups:
  - key: tags['Environment']
    prefix: 'env'
  - key: instance_type
    prefix: 'type'
filters:
  instance-state-name: running

Для его использования необходим установленный и настроенный (через aws configure или переменные окружения) AWS CLI, а также коллекция amazon.aws (ansible-galaxy collection install amazon.aws).

Теперь можно использовать инвентори, как обычный:

ansible-playbook -i inventory.yml deploy.yml

При этом Ansible выполнит запрос к API AWS EC2, получит список всех running инстансов в указанных регионах, автоматически создаст группы env_Production, env_Development, type_t2_micro и т.д., основываясь на тегах и типах инстансов.

Пример: Простой кастомный Dynamic Inventory скрипт (Python)

Иногда нужно интегрироваться с внутренней базой данных. Скрипт должен принимать два аргумента: --list (вывод всех хостов и групп) и --host <hostname> (вывод переменных для конкретного хоста).

#!/usr/bin/env python3
# custom_inventory.py
import json
import argparse

def get_data_from_external_source():
    # Здесь мог бы быть запрос к вашей CRM, базе данных, API...
    # Для примера — статичные данные.
    return {
        "web": {
            "hosts": ["web1.example.com", "web2.example.com"],
            "vars": {"ansible_user": "ubuntu"}
        },
        "db": {
            "hosts": ["db1.example.com"],
            "vars": {"ansible_user": "centos"}
        },
        "_meta": {
            "hostvars": {
                "web1.example.com": {"nginx_version": "1.18"},
                "web2.example.com": {"nginx_version": "1.20"},
                "db1.example.com": {"mysql_port": 3306}
            }
        }
    }

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--list', action='store_true')
    parser.add_argument('--host', type=str)
    args = parser.parse_args()

    data = get_data_from_external_source()

    if args.list:
        # Возвращаем всю структуру, но без '_meta' для простоты (старый формат)
        output = {k: v for k, v in data.items() if k != '_meta'}
        print(json.dumps(output))
    elif args.host:
        # Возвращаем переменные для конкретного хоста из '_meta'
        hostvars = data.get('_meta', {}).get('hostvars', {})
        print(json.dumps(hostvars.get(args.host, {})))

if __name__ == '__main__':
    main()

Использование:

ansible -i custom_inventory.py web --list-hosts
ansible -i custom_inventory.py web1.example.com -m ping

Заключение

Dynamic Inventory является одним из фундаментальных компонентов Ansible в DevOps-практиках, позволяя эффективно управлять эластичными и автоскейлинговыми инфраструктурами. Он устраняет необходимость ручного сопроставления инфраструктуры и конфигураций, обеспечивая истинную автоматизацию и снижение операционных ошибок. Для успешной реализации необходимо глубоко понимать форматы данных Ansible и API ваших систем управления инфраструктурой.