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
,