Назад | Перейти на главную страницу

Определение переменной Ansible для выбора import_playbook из файла инвентаризации

Я использую Ansible (V2.8) для создания двух разных серверных сред, которые поддерживают Drupal. Они очень похожи с точки зрения настроек для ОС, РСУБД, gluster, memcached и т. Д. Но сильно отличаются в отношении использования Drupal (разные версии, разное количество экземпляров drupal и т. Д.). Следовательно, хотя почти все playbooks, файлы var и т. Д. Являются общими, у меня есть playbooks для конкретной платформы для Drupal.

У меня есть отдельные файлы инвентаризации, но общий файл site.yml, который просто содержит кучу операторов import_playbook:.

То, с чем я борюсь, - это лучший способ выбрать правильную книгу действий для drupal.

На данный момент я использую в командной строке следующее: -i /vagrant/inventories/inventory-env1.ini --extra-vars environment_name=env1

Это позволяет следующему утверждению работать в site.yml - import_playbook: playbooks/drupal/drupal_{{environment_name}}.yml

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

В идеале я хотел бы просто указать имя_среды в файле инвентаризации. Но я не могу, потому что он недоступен для site.yml по причинам, описанным здесь: https://github.com/ansible/ansible/issues/33659.

Итак, я что-то упустил, или это просто так?

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

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

Надеюсь, это поможет.

Если я правильно понимаю, у вас в основном общий доступный запуск между двумя серверами, но для каждого из них нужно применять разные сценарии Drupal.

Лучший способ выбрать хозяев для конкретной игры - внутри учебник. Хотя логично думать, что import_playbook Действие верхнего уровня должно быть нацелено на определенные хосты, на самом деле это не так, как смотрит на него ansible. Ansible создает список игр, которые содержат задачи и роли (сами содержат takss), каждая из которых нацелена на один или несколько хостов или групп, а затем запускает все игры с хоста ansible контроллера, выполняя каждую конкретную задачу только на хостах, на которые она нацелена. . Таким образом, вы хотите здесь определить отдельные группы хостов drupal для каждого сайта, а затем добавить обе playbooks на основной сайт, каждая из которых нацелена на определенную группу.

Вот упрощенный пример:

site.yaml:

- import_playbook: shared.yaml
- import_playbook: drupal_1.yaml
- import_playbook: drupal_2.yaml

В shared.yaml есть настройки операционной системы и т. д., на которые вы ссылаетесь, и их не нужно менять.

drupal_1.yaml выглядит так:

 - hosts: drupal_site_1
 - tasks: 
    [ ... set up drupal site 1 ... ]

а drupal_2.yaml выглядит так:

 - hosts: drupal_site_2
 - tasks:
 [ ... set up drupal site 2 ... ]

Теперь нам просто нужно убедиться, что группы определены в вашем инвентаре, а хосты, которые должны получить первый сайт, находятся в drupal_site_1, а те, кто должен получить второй сайт, находятся в drupal_site_2. Вы даже можете сделать сервер в обеих группах для обслуживания обоих сайтов (но, конечно, playbooks должны быть тщательно обработаны, чтобы не мешать). Видеть https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html для получения информации о том, как вы можете сгруппировать свои хосты.

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