Нельзя выполнять обработчики из ролей зависимостей для всех хостов - PullRequest
0 голосов
/ 11 апреля 2019

Настройка

У меня есть несколько ролей, которые объявляют зависимости ролей и иногда используют обработчики из ролей, от которых они зависят. Упрощенная версия моей настройки выглядит следующим образом (это вывод head inventory **/*.yml, и он показывает все пути и полное содержимое файлов):

==> inventory <==
[app]
server1 ansible_host=192.168.2.113
[db]
server2 ansible_host=192.168.2.153

==> playbook.yml <==
- hosts: all
  roles:
    - { role: app, when: "inventory_hostname in groups['app']" }
    - { role: db,  when: "inventory_hostname in groups['db']"  }

==> roles/app/handlers/main.yml <==
- name: app handler
  command: echo app handler

==> roles/app/meta/main.yml <==
dependencies: [base]

==> roles/app/tasks/main.yml <==
- command: /bin/true
  notify: [app handler, base handler]

==> roles/base/handlers/main.yml <==
- name: base handler
  command: echo base handler

==> roles/base/tasks/main.yml <==
- command: /bin/true

==> roles/db/handlers/main.yml <==
- name: db handler
  command: echo db handler

==> roles/db/meta/main.yml <==
dependencies: [base]

==> roles/db/tasks/main.yml <==
- command: /bin/true
  notify: [db handler, base handler]

Теперь я запускаю ansible-playbook -i inventory playbook.yml, что приводит к

PLAY [all] **********************************************************************

TASK [Gathering Facts] **********************************************************
ok: [server1]
ok: [server2]

TASK [base : command] ***********************************************************
skipping: [server2]
changed: [server1]

TASK [app : command] ************************************************************
skipping: [server2]
changed: [server1]

TASK [base : command] ***********************************************************
changed: [server2]

TASK [db : command] *************************************************************
skipping: [server1]
changed: [server2]

RUNNING HANDLER [base : base handler] *******************************************
skipping: [server2]
changed: [server1]

RUNNING HANDLER [app : app handler] *********************************************
changed: [server1]

RUNNING HANDLER [db : db handler] ***********************************************
changed: [server2]

PLAY RECAP **********************************************************************
server1                    : ok=5    changed=4    unreachable=0    failed=0   
server2                    : ok=4    changed=3    unreachable=0    failed=0   

Задача

Моя проблема в том, что я ожидал, что оба сервера выполнят базовый обработчик. Но, по-видимому, он пропущен на сервере2. Если я добавлю -v к команде ansible, я получу бесполезный комментарий, что skipping: [server2] => {"changed": false, "skip_reason": "Conditional result was False"}.

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

Вопрос

  • Можно ли как-нибудь убедиться, что обработчики работают корректно?

EDIT

  • Ошибка в том, что обработчик не запущен или это поведение где-то задокументировано?

/ EDIT

второстепенные вопросы

  • Есть ли способ объявить зависимости таким образом, чтобы он не приводил к множеству включений, которые выбираются только одним сервером и игнорируются всеми остальными, хотя другие будут включать ту же роль через свои собственные зависимости в какой-то другой точке? Это приводит к большому количеству пропущенных задач, когда у меня есть еще несколько серверов и ролей. (после прочтения документов по включению ролей Я подозреваю, что нет)
  • Есть ли другой способ обработки зависимостей ролей и обработчиков с ansible? Я придумал эту настройку после прочтения https://medium.com/@ibrahimgunduz34/parallel-playbook-execution-in-ansible-30799ccda4e0

Sidenote

Я бы хотел избежать техники group_by, описанной в документах , или, в более общем смысле, выполнять каждую роль в своей собственной книге воспроизведения только для правильного подмножества серверов, поскольку у меня много серверов и я хочу ускорить запуск playbook с помощью strategy: free.

...