2

Я настраиваю конфигурацию динамических ресурсов Ansible для моего проекта. Когда происходит событие автомасштабирования AWS, запрос отправляется Jenkins (который управляет процессом сборки через Ansible), чтобы инициировать сборку на вновь добавленном сервере.Командная строка ansible-playbook передает IP-адрес для группы хостов

Поскольку динамический инвентарь использует подход, основанный на тегах, событие автосохранения добавляет новый сервер и запускается сборка. Однако новая сборка запускается на всех серверах, поскольку один и тот же тег присутствует как в старом, так и в новом сервере.

Подход, который я принимаю для решения, заключается в передаче общедоступного параметра ip Jenkins в параметризованный процесс сборки. Этот публичный IP, то можно сделать доступным, чтобы решить одну из двух команд анзибль:

if ["x$public_ip" == "x"] then 
    ansible-playbook -i inventories/demo api.yml 
else 
    ansible-playbook -i $public_ip, api.yml 

Первая команда будет по существу проинструктировать анзибль запустить процесс сборки на всех серверах, имеющих метку.

Из второй команды я хочу сказать, что она должна запускать сборку только на вновь добавленном сервере. Мой файл api.yml выглядит

--- 
- hosts: apiservers 
    sudo: yes 
    roles: 
    - common 

Теперь я должен быть в состоянии сказать, что хоста «» apiservers среднее, или, по существу, что все IP-адреса, которые содержатся в этой группе. Если вовлечено больше хостов, я должен иметь возможность передавать несколько групп и соответствующие им IP-адреса в той же самой команде, которая запускается через оболочку.

Любые идеи?

ответ

0

В идеале ваши плейбуны должны быть полностью идемпотентными, так что работа против всей группы хостов каждый раз, когда вы создаете новый экземпляр, не только не разрушительна, но и желательна, так как предотвращает дрейф конфигурации этих экземпляров (от людей, которые меняют вручную вещи на коробке).

Однако, если вы не можете легко сделать свои роли Ansible idempotent и просто хотите настроить таргетинг на новые экземпляры по мере их создания, то Ansible уже предоставляет эту возможность для ограничения экземпляров, на которые вы нацеливаете, используя --limit argument.

Таким образом, вы могли бы вместо того, чтобы быть лучше изменить свой сценарий к чему-то, как это вместо:

ansible-playbook -i inventories/demo --limit=${public_ip} api.yml 

Если ${public_ip} установлен, то он будет ограничивать его только что единый IP-адрес и, таким образом, этот экземпляр в одиночку. Если он не установлен, пробел --limit эквивалентен запуску всего инвентаря.