2016-12-21 2 views
2

Ich hatte ein einfaches Playbook (something like this), das ich auf allen meinen Rechnern (RH & Debian) laufen lasse, um sie zu aktualisieren, und für jeden Rechner, der aktualisiert wurde Skript (Benachrichtigungshandler).Ansible wird einen Handler nicht sehen, wenn er group_by verwendet

Vor kurzem habe ich versucht, ein neues Modul zu testen group_by genannt, so dass anstelle den when Zustand mit yum update wenn ansible_distribution == "CentOS" zu laufen, werde ich zunächst anhand von dort ansible_pkg_mgr als Schlüssel, um die Fakten und die Gruppe der Host sammeln und dann laufe ich war auf der Suche nach yum update auf allen Hosts, die der Schlüssel PackageManager_yum ist, finden Sie im Spielbuch Beispiel:

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

Und das ist die Fehlermeldung erhalte ich,

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 

danke im voraus.

Antwort

2

Sie haben Handler nur in einem Ihrer Spiele definiert. Es ist ziemlich klar, wenn Sie sich die Einrückung ansehen.

Das Spiel, das Sie für PackageManager_apt ausführen nicht die handlers überhaupt (es keinen Zugriff auf den updateX Handler hat in einem separaten Spiel definiert ist), so ansible beschwert.

Wenn Sie den Code nicht duplizieren wollen, können Sie den Handler in eine separate Datei speichern (lass es handlers.yml nennen), und dies in beiden Stücken mit:

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

Hinweis: es gibt eine Bemerkung in Handlers: Running Operations On Change Abschnitt in Bezug auf einschließlich Handler:

Sie können einen Handler nicht benachrichtigen, der innerhalb eines Include definiert ist. Ab Ansible 2.1 funktioniert das, jedoch muss das Include statisch sein.


Schließlich sollten Sie lieber betrachten Sie Ihr Textbuch zu einer Rolle zu konvertieren.

Eine gängige Methode zu erreichen, was Sie wollen, um die Aufgaben schließen ist (in tasks/main.yml) in ihrem Namen mit der Architektur Dateinamen:

- 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 werden dann in handlers/main.yml definiert.

+0

Danke für den Tipp. – Rabin

Verwandte Themen