Инвентарь: список твоих серверов

Урок 4 - заводим инвентарь: единый список всех серверов под управлением.

«Ansible не угадывает, какими серверами управлять. Ты говоришь ему это явно - в инвентаре».

Инвентарь (inventory) - это файл, в котором перечислены хосты, которыми управляет Ansible. Без инвентаря Ansible не знает, к каким машинам подключаться. Инвентарь можно писать в двух форматах: классическом INI и более структурированном YAML.

Формат INI - простой и наглядный

web1.example.com
web2.example.com ansible_host=203.0.113.20
db1.example.com  ansible_user=postgres

Каждая строка - хост. После имени можно указать переменные подключения: ansible_host - реальный IP или адрес, ansible_user - под каким пользователем заходить, ansible_port - порт SSH. Это удобно, когда DNS-имя одно, а подключаться надо по другому адресу.

Формат YAML - структурированный

all:
  hosts:
    web1.example.com:
    web2.example.com:
      ansible_host: 203.0.113.20
    db1.example.com:
      ansible_user: postgres

YAML многословнее, но лучше масштабируется на большие инвентари с группами и переменными - о них в следующих уроках. Многие команды предпочитают YAML именно из-за читаемости при росте.

Как работает под капотом

При запуске Ansible парсит инвентарь и строит внутреннюю структуру: словарь хостов, у каждого - свой набор переменных. Когда ты пишешь ansible all, слово all - это специальная группа, в которую автоматически входят все хосты. Ansible проходит по списку и для каждого хоста запускает задачи.

Смоделируем парсер простого INI-инвентаря на Python - так станет ясно, во что Ansible превращает текстовый файл.

# Мини-парсер INI-инвентаря: строка -> хост + его переменные
inventory_text = '''
web1.example.com
web2.example.com ansible_host=203.0.113.20
db1.example.com ansible_user=postgres ansible_port=2222
'''

hosts = {}
for line in inventory_text.strip().splitlines():
    parts = line.split()
    name = parts[0]
    vars_ = {}
    for kv in parts[1:]:
        key, value = kv.split("=", 1)
        vars_[key] = value
    hosts[name] = vars_

for name, v in hosts.items():
    print(name, "->", v)

Попробуй сам ▶ На выходе - словарь хостов с их переменными подключения, ровно та структура, которую Ansible держит в памяти. Дальше он по ней решает, куда и как заходить.

Частые ошибки

  • Путать имя хоста и адрес подключения. Имя в инвентаре может быть любым ярлыком; реальный адрес задаётся через ansible_host.
  • Хардкодить инвентарь в командах. Для разовой проверки инлайн-инвентарь ок, но рабочие хосты должны жить в файле под git.
  • Смешивать форматы в одном файле. Файл либо INI, либо YAML - не оба сразу.

Best practices

  • Держи инвентарь в репозитории рядом с playbook'ами.
  • Используй осмысленные имена хостов (web1, db-prod-1), а не голые IP.
  • Для растущей инфраструктуры выбирай YAML - он чище ляжет на группы и переменные.

В реальной работе

На больших проектах инвентарь почти никогда не статичен. Вместо ручного перечисления хостов используют динамический инвентарь - плагин, который сам опрашивает облако (AWS, GCP, Yandex Cloud) и строит список серверов на лету по тегам. Тогда новый сервер, поднятый в облаке с правильным тегом, автоматически попадает под управление Ansible без правки файлов. Но принцип тот же, что мы разобрали: на выходе всё равно получается словарь хостов с переменными подключения. Поэтому понимание статического инвентаря - фундамент: динамический лишь автоматизирует его наполнение, а структура данных и логика адресации остаются неизменными.

Итоги

Инвентарь - это явный список управляемых серверов в формате INI или YAML, где у каждого хоста есть переменные подключения. Ansible превращает его во внутренний словарь хостов. Дальше научимся группировать серверы.

Проверьте себя
1. Для чего нужен инвентарь в Ansible?
AЧтобы хранить пароли в открытом виде
BЧтобы явно перечислить хосты, которыми управляет Ansible, и их параметры подключения
CЧтобы ускорить выполнение задач
DЭто лог выполненных команд
2. Что означает группа all в команде ansible all -m ping?
AТолько хосты с тегом all
BВсе хосты инвентаря - это встроенная группа, куда входят все
CЗапуск во всех дата-центрах
DВсе доступные модули