Невозможно уведомить обработчики в другой роли
Можно ли уведомить обработчик в другой роли? Что мне делать, чтобы заставить его найти его?
Вариант использования, например, Я хочу настроить некоторую службу и затем перезапустить ее, если она изменена. У разных ОС есть, возможно, разные файлы для редактирования, и даже формат файла может быть другим. Поэтому я хотел бы поместить их в разные роли (потому что формат файла может быть другим, это невозможно сделать, установив group_vars). Но способ перезапуска службы тот же, используя модуль service
; поэтому я хотел бы поместить обработчик в роль common
.
В любом случае, чтобы достичь этого? Спасибо.
Ответы
Ответ 1
Вы также можете вызвать обработчики роли зависимости. Может быть чище, чем включать файлы или явно перечислять роли в учебнике только для роли ролей. Например:.
-
роли/My-погрузчики/погрузчики/main.yml
---
- name: nginx restart
service: >
name=nginx
state=restarted
-
роли/мой-другой/мета/main.yml
---
dependencies:
- role: my-handlers
-
роли/My-другой/задачи/main.yml
---
- copy: >
src=nginx.conf
dest=/etc/nginx/
notify: nginx restart
Ответ 2
Вы должны это сделать, если включить файл обработчика.
Пример:
handlers:
- include: someOtherRole/handlers/main.yml
Но я не думаю, что это изящно.
Более элегантный способ состоит в том, чтобы иметь игру, которая управляет обе ролями, примерно так:
- hosts: all
roles:
- role1
- role2
Это приведет к тому, что обе роли могут вызвать другие обработчики.
Но снова я бы предложил сделать все в одной роли и разделить файлы и использовать условный include http://docs.ansible.com/playbooks_conditionals.html#conditional-imports
Надеюсь, что поможет
Ответ 3
У меня была аналогичная проблема, но мне нужно было сделать много действий в других зависимых ролях.
Поэтому вместо того, чтобы ссылаться на handeler - мы устанавливаем такой факт:
- name: install mylib to virtualenv
pip: requirements=/opt/mylib/requirements.txt virtualenv={{ mylib_virtualenv_path }}
sudo_user: mylib
register: mylib_wheel_upgraded
- name: set variable if source code was upgraded
set_fact:
mylib_source_upgraded: true
when: mylib_wheel_upgraded.changed
Затем в другом месте в другой роли:
- name: restart services if source code was upgraded
command: /bin/true
notify: restart mylib server
when: mylib_source_upgraded