Ansible не увидит обработчик при использовании group_by

Раньше у меня был простой playbook ( что-то вроде этого), который я запускаю на всех своих машинах (на основе RH и Debian), чтобы обновить их, и для каждой машины, которая была обновлена, запустить скрипт (обработчик уведомлений).

Недавно я попытался протестировать новый модуль под названием group_byпоэтому вместо when условие для запуска yum update когда ansible_distribution == "CentOS", Я сначала соберу факты и сгруппирую хозяина на основе там ansible_pkg_mgr в качестве ключа, а затем я хотел запустить yum update на всех хостах, ключом которых является PackageManager_yum, см. пример play book:

---
- hosts: all
  gather_facts: false
  remote_user: root
  tasks:

    - name: Gathering facts
      setup:

    - name: Create a group of all hosts by operating system
      group_by: key=PackageManager_{{ansible_pkg_mgr}}

- hosts: PackageManager_apt
  gather_facts: false
  tasks:
    - name: Update DEB Family
      apt: 
        upgrade=dist
        autoremove=yes
        install_recommends=no
        update_cache=yes
      when: ansible_os_family == "Debian"
      register: update_status
      notify: updateX
      tags: 
        - deb
        - apt_update
        - update

- hosts: PackageManager_yum
  gather_facts: false
  tasks:
    - name: Update RPM Family
      yum: name=* state=latest
      when: ansible_os_family == "RedHat"
      register: update_status
      notify: updateX
      tags: 
        - rpm
        - yum
        - yum_update

  handlers:
    - name: updateX
      command: /usr/local/bin/update

И это сообщение об ошибке, которое я получаю,

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

TASK [Gathering facts] *********************************************************
Wednesday 21 December 2016  11:26:17 +0200 (0:00:00.031)       0:00:00.031 **** 
....

TASK [Create a group of all hosts by operating system] *************************
Wednesday 21 December 2016  11:26:26 +0200 (0:00:01.443)       0:00:09.242 **** 

TASK [Update DEB Family] *******************************************************
Wednesday 21 December 2016  11:26:26 +0200 (0:00:00.211)       0:00:09.454 **** 
ERROR! The requested handler 'updateX' was not found in either the main handlers list nor in the listening handlers list

заранее спасибо.

1 ответ

Решение

Вы определили обработчиков только в одной из своих пьес. Это совершенно ясно, если вы посмотрите на отступ.

Игра, для которой вы исполняете PackageManager_apt не имеет handlers вообще (он не имеет доступа к updateX обработчик определен в отдельной пьесе), поэтому Ансибл жалуется.

Если вы не хотите дублировать код, вы можете сохранить обработчик в отдельный файл (назовем его handlers.yml) и включите в обе пьесы:

  handlers:
    - name: Include common handlers
      include: handlers.yml

Примечание. В разделе " Обработчики: выполнение операций при изменении " есть примечание, касающееся включения обработчиков:

Вы не можете уведомить обработчик, который определен внутри включения. Начиная с Ansible 2.1, это работает, но включение должно быть статическим.


Наконец, вы должны рассмотреть вопрос о преобразовании вашей пьесы в роль.

Распространенный метод для достижения того, что вы хотите, это включить задачи (в tasks/main.yml) используя имена файлов с архитектурой в их именах:

- include: "{{ architecture_specific_tasks_file }}"
  with_first_found:
    - "tasks-for-{{ ansible_distribution }}.yml"
    - "tasks-for-{{ ansible_os_family }}.yml"
  loop_control:
    loop_var: architecture_specific_tasks_file

Обработчики затем определяются в handlers/main.yml,

Другие вопросы по тегам