#ansible #ansible-inventory
#ansible #ansible-инвентаризация
Вопрос:
У меня есть репозиторий ansible с несколькими запасами (все очень стандартно). Что-то вроде:
- inventories/
- inv1
- inv2
...
- invN
- roles/
- playbooks/
У меня есть несколько серверов развертывания, с которых я могу запускать ansible. Существует ограничение: на сервере развертывания должны быть только те запасы (я думаю, у меня всегда будет отношение 1 к 1), которые он будет использовать. Это означает, что если сервер srv1
использует inv1, остальные запасы не должны присутствовать.
Я думал о двух подходах:
- каждый инвентарь отправляется в отдельный репозиторий git, и я буду проверять только выбранные репозитории;
- почти то же самое, что и в предыдущем, но вместо нескольких ветвей в одном репозитории git.
Оба эти решения кажутся своего рода грязным взломом, и я считаю, что есть более простое и элегантное решение (однако я ничего не нашел в рекомендациях ansible). Есть предложения?
Спасибо
ДОБАВЛЕНО УТОЧНЕНИЕ: насколько я вижу, я не сформулировал свой вопрос четко. Вопрос скорее в том, что на сервере развертывания у меня должно быть не более N (скорее всего, 1) запасов физически. Показанная выше структура показывает мое текущее репозиторий git, но на сервере развертывания у меня должно быть что-то вроде:
deployment_server1:
- inventories/
- inv1/
- roles/
- ....
deployment_server2:
- inventories/
-inv87/
- roles/
- playbooks/
... and so on.
Ответ №1:
Либо вы можете использовать ansible.cfg
файл для указания на запасы.
[defaults]
inventory = hosts
host_key_checking = False
Или вы можете изменить текущую инвентаризацию следующим образом
ansible-playbook example.yml -i inventory
Ответ №2:
В зависимости от того, как вы используете ansible на этих хостах, возможно, стоит помнить, что вы можете переопределить любой параметр в ansible с помощью переменной среды. ANSIBLE_INVENTORY — это все, что вам здесь нужно.
Например, ANSIBLE_INVENTORY=$(hostname) ansible [args] будет использовать файл инвентаризации с тем же именем, что и у текущего хоста.
Вы также можете переопределить его с помощью флага -i .
Комментарии:
1. спасибо за ответ. Я добавил некоторые пояснения к своему вопросу
2. Хм, тогда я не знаю. Здесь есть своего рода красные флажки. Я имею в виду, что если вы пытаетесь не размещать файлы инвентаризации на серверах, потому что они содержат конфиденциальную информацию о безопасности, вам, вероятно, нужно другое решение? Вы развертываете, просто выполняя git pull на каждом сервере?
3. rsync может быть простым решением. rsync —exclude=inventories/* —include/inventories/the-file-you-want приведет вас туда, где вы хотите быть, но в плохом смысле кажется хакерским.
4. Кроме того (я как бы ненавижу, что комментарии — это всего одна строка), возможно, вы захотите задать это как нечто иное, чем вопрос ansible, на самом деле это не кажется специфичным для ansible.