У меня есть роль, которая обновляет исходный код моего проекта из git, назовите ее source_tree
. Репозиторий Git содержит источник, используемый несколькими службами, поэтому я хочу перезапустите все службы, использующие этот источник, на каждом хосте, если обнаружено изменение в git.
То есть:
- git: repo=ssh://git@github.com/mylogin/hello.git dest=/home/mylogin/hello
notify: restart everything dependent on source code
Например, у меня есть роли webapp
, notification_service
, celery
. У хоста может быть любой набор таких ролей, например, запускается первый сервер. webapp
, второй запускает оба notification_service
и celery
. Все эти службы используют исходный код из одного каталога.
Проблема в следующем:
Я не могу перечислить всех обработчиков в notify
Такие как:
- git: repo=ssh://git@github.com/mylogin/hello.git dest=/home/mylogin/hello
notify:
- restart webapp
- restart notification service
- restart celery
Поскольку playbook завершится ошибкой, если я запустил playbook без всех ролей (или даже если хост не включает все роли):
ERROR: change handler (restart celery) is not defined
(То есть у меня webapp.yml
playbook, который включает source_tree
и webapp
роли, но не notification_service
и celery
.)
И игнорировать эту ошибку невозможно.
Я не могу создать несколько обработчиков с одинаковым именем, будет действовать только один (определенный последним).
Как преодолеть эти ограничения?
Я не тестировал это для разных ролей, но вы можете попробовать зарегистрировать результаты задачи git
- git: repo=ssh://git@github.com/mylogin/hello.git dest=/home/mylogin/hello
register: gitrc
Затем прочтите его по каждой из ролей. Например,
в webapp/tasks/main.yml
:
- supervisorctl: name=uwsgi state=restarted
when: gitrc|changed
в celery/tasks/main.yml
:
- supervisorctl: name=celery state=restarted
when: gitrc|changed
Конечно, они становятся задачами, а не обработчиками.