2016-08-08 8 views
2

Ich habe ein Playbook, das Tomcat installiert und dann einige Webanwendungen implementiert. Die Aufgabe (n) der Webanwendungsbereitstellung benachrichtigt einen Handler, um Tomcat neu zu starten. Aber der HF feuert nie. Ich verwende einen Handler, um den Tomcat-Dienst zu verwalten, weil ich aus den Dokumenten verstehe, dass Handler nur einmal feuern sollten, auch wenn sie mehrmals aufgerufen werden. Fehle ich etwas Offensichtliches?Warum schießen meine Ansible-Handler nicht?

Dies ist das Textbuch:

--- 
- hosts: all 
    become: true 
    become_user: root 
    roles: 
    - role: common 
    - role: nginx 
    - role: tomcat 
    - role: launchpad 
    - role: manager 
    - role: reporting 
    handlers: 
    - include: /tomcat/handlers/etitomcat_service_ctrl.yml 

Dies ist eine der Rollen, die die Web-App entsendet:

--- 
- name: Remove the current installation of LaunchPad 
    file: path={{etitomcat_path}}/webapps/{{launchpad_module}} state=absent 

- name: Remove the current war file for {{launchpad_module}} 
    file: path={{etitomcat_path}}/webapps/{{launchpad_module}}.war state=absent  

- name: Download the latest snapshot of LaunchPad and deploy it to {{etitomcat_path}} 
    get_url: url={{launchpad_source_url}} dest={{etitomcat_path}}/webapps/{{launchpad_module}}.war mode=0744 owner={{etitomcat_user}} group={{etitomcat_group}} force=yes 
    notify: "restart_eti_tomcat" 

Dies ist der handler:

- name: "Restart ETI Tomcat" 
    service: name=etitomcat state=restarted 
    become: true 
    become_user: root 
    listen: "restart_eti_tomcat" 

    - name: "Start ETI Tomcat" 
    service: name=etitomcat state=started 
    become: true 
    become_user: root 
    listen: "start_eti_tomcat" 

    - name: "Stop ETI Tomcat" 
    service: name=etitomcat state=stopped 
    become: true 
    become_user: root 
    listen: "stop_eti_tomcat" 
+0

Ich habe einen Workaround dafür. Ich definiere den Handler einfach im Playbook. Es gibt einige Posts über Handler, die in Dateien definiert sind, die nicht richtig funktionieren. – RhythmicDevil

Antwort

5

Das Hinzufügen von static: yes sollte dieses Problem beheben, wenn Sie Ansible >= 2.1 verwenden.

handlers: 
- include: /tomcat/handlers/etitomcat_service_ctrl.yml 
    static: yes 

Werfen Sie einen Blick auf diese Github issue, könnte das verknüpfte google groups thread sowie wertvolle Informationen enthalten.

bearbeiten

Wie von @rhythmicdevil die documentation Hinweise:

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

+1

Ich habe gerade in der Dokumentation gefunden: "Sie können einen Handler, der in einem Include definiert ist, nicht benachrichtigen. Ab Ansible 2.1 funktioniert das, aber das Include muss statisch sein." – RhythmicDevil

+0

ok danke. Gut zu wissen. Meine Antwort wurde aktualisiert. –

0

Sie die Aufgaben und post_tasks Abschnitt statt handlers hinzufügen können, hoffe, es wird für Sie arbeiten:

--- 
- hosts: all 
    become: true 
    become_user: root 
    tasks: 
    - role: common 
    - role: nginx 
    - role: tomcat 
    - role: launchpad 
    - role: manager 
    - role: reporting 
    post_tasks: 
    - include: /tomcat/handlers/etitomcat_service_ctrl.yml 
+1

Wie ist das? 'post_tasks' und' handlers' sind völlig unterschiedliche Dinge. –

1

dies unabhängig Dies kann neben dem Punkt sein, aber ich will hinzufügen, wie die Schlagzeile Frage eher breit und das ist die Frage, die ich beim googlen fand und unten ist die Lösung für das spezielle Problem, das ich hatte.

Berücksichtigen Sie, dass die Handler nur auslöst, wenn eine Änderung in der entsprechenden Task registriert ist. Auch wenn Sie das Spiel mit der höchsten Ausführlichkeit laufen wird es NO

RUNNING HANDLER [base : somehandler ] *********************** 
Unchanged: Skipping 

Und wenn sie nach einer Änderung ausgelöst werden, wird es nach allen Aufgaben wird durchgeführt wurde.

Das war wirklich mein Kopf, da die Aufgaben Sie unabhängig davon benachrichtigt, ob sie wirklich etwas getan haben oder nicht.

Zum Beispiel, wenn Sie eine Aufgabe A haben, die Sie ein paar Mal ausgeführt haben, bis es funktioniert wie Sie erwarten.

danach Dann einen Handler B verbinden Sie den Dienst neu zu starten, geschieht nichts, wenn Sie die Operation die Aufgabe A tun oder ändern wischen.

Solange Task A registriert keine Änderung wird es nicht auslösen Handler B.

Dies ist das Verhalten für ansible 2.2.1 sowieso.