Инвентарь: список твоих серверов
Урок 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 превращает его во внутренний словарь хостов. Дальше научимся группировать серверы.