2016-12-21 2 views
2

У меня был простой playbook (something like this), который я запускал на всех своих машинах (RH & Debian на основе), чтобы обновить их, и для каждой обновленной машины запустите script (уведомлять обработчик).Ansible не увидит обработчика при использовании group_by

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

--- 
- 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 

благодарит заранее.

ответ

2

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

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

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

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

Примечание: есть примечание в разделе Handlers: Running Operations On Change раздела, касающегося включения обработчиков:

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


Наконец, следует скорее рассмотреть вопрос о преобразовании вашего Playbook в роли.

Обычным способом добиться того, что вы хотите, чтобы включить задачи (в 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.

+0

Спасибо за подсказку. – Rabin

Смежные вопросы