Подтвердить что ты не робот

Невозможно уведомить обработчики в другой роли

Можно ли уведомить обработчик в другой роли? Что мне делать, чтобы заставить его найти его?

Вариант использования, например, Я хочу настроить некоторую службу и затем перезапустить ее, если она изменена. У разных ОС есть, возможно, разные файлы для редактирования, и даже формат файла может быть другим. Поэтому я хотел бы поместить их в разные роли (потому что формат файла может быть другим, это невозможно сделать, установив group_vars). Но способ перезапуска службы тот же, используя модуль service; поэтому я хотел бы поместить обработчик в роль common.

В любом случае, чтобы достичь этого? Спасибо.

4b9b3361

Ответ 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