2016-12-22 1 views
1

Übergibt ansible Rollen-Standardvariablen an die Handler innerhalb derselben Rolle?Ansible erkennt keine Rollen-Standardvariablen in seinem Handler

Hier ist ein minimaler Ausschnitt aus dem Textbuch, der das Problem hat:

Rollenhierarchie

- playbook.yml 
- roles/ 
    - gunicorn/ 
    - defaults/ 
     - main.yml 
    - handlers/ 
     - main.yml 
    - code-checkout/ 
    - tasks/ 
     - main.yml 

Hier ist der Inhalt der Datei

gunicorn/defaults/main.yml

--- 
gu_log: "/tmp/gunicorn.log" 

gunicorn/Handler/main.yml

--- 
- name: Clear Gunicorn Log 
    shell: rm {{ gu_log }} 

Finalisierung/Aufgaben/main.yml

--- 
- name: Test Handlers 
    shell: ls 
    notify: 
    - Restart Gunicorn 

playbook.yml

--- 
    - name: Deploy 
    hosts: webservers 
    tasks: 
     - include: roles/finalize/tasks/main.yml 
    handlers: 
     - include: roles/gunicorn/handlers/main.yml 

AFAIK gut sieht alles . Ich erhalte diesen Fehler jedoch während der Ausführung des Playbooks.

FEHLGESCHLAGEN! => {"failed": true, "msg": "Das Feld 'args' hat einen ungültigen Wert , der eine Variable enthält, die undefiniert ist. Der Fehler war: 'gu_log' ist nicht definiert \ n \ nDer Fehler scheint in "/roles/gunicorn/handlers/main.yml": Zeile 3, Spalte 3, aber möglicherweise \ nbe woanders in der Datei je nach dem genauen Syntaxproblem gewesen. \ n \ nDie störende Zeile scheint zu sein: \ n \ n \ n- Name: Restart Gunicorn \ n^hier \ n "}

Mit ansible 2.2 auf Ubuntu 12.04 LTS

hier ist eine modifizierte Version des techraf des Skripts, das schafft alle die Verzeichnisse und zeigt mein Problem

#!/bin/bash 

mkdir -p ./rtindru-test/roles/gunicorn 
mkdir -p ./rtindru-test/roles/gunicorn/defaults 
mkdir -p ./rtindru-test/roles/gunicorn/handlers 
mkdir -p ./rtindru-test/roles/finalize/tasks 

cat >./rtindru-test/roles/finalize/tasks/main.yml <<HANDLERS_END 
--- 
- name: Test Handlers 
    shell: rm {{ gu_log }} 
HANDLERS_END 

cat >./rtindru-test/roles/gunicorn/handlers/main.yml <<HANDLERS_END 
--- 
- name: Clear Gunicorn Log 
    shell: rm {{ gu_log }} 
HANDLERS_END 

cat >./rtindru-test/roles/gunicorn/defaults/main.yml <<DEFAULTS_END 
--- 
gu_log: "/tmp/gunicorn.log" 
DEFAULTS_END 

cat >./rtindru-test/playbook.yml <<PLAYBOOK_END 
--- 
    - name: Deploy 
    hosts: localhost 
    tasks: 
     - include: roles/finalize/tasks/main.yml 
    handlers: 
     - include: roles/gunicorn/handlers/main.yml 
PLAYBOOK_END 

touch /tmp/gunicorn.log 
ls -l /tmp/gunicorn.log 
ansible-playbook ./rtindru-test/playbook.yml 
ls -l /tmp/gunicorn.log 

Ausgabe

PLAY [Deploy]


TASK [Setup] ************ ************************************************** ***** ok: [localhost]

AUFGABE [Test Hand lers] ************************************************ ************ fatal: [localhost]: FEHLGESCHLAGEN! => {"failed": true, "msg": "Das Feld 'args' hat einen ungültigen Wert, der eine Variable enthält, die undefined ist. Der Fehler war: 'gu_log' ist nicht definiert \ n \ nDer Fehler erscheint in '/ rtindru-test/roles/finalize/tasks/main.yml ': Zeile 2, Spalte 3, aber möglicherweise \ nweder an anderer Stelle in der Datei, abhängig vom genauen Syntaxproblem. \ n \ nDie betreffende Zeile scheint zu sein: \ n \ n --- \ n- Name: Test Handlers \ n^hier \ n "} erneut zu versuchen, zu verwenden: --limit @/rtindru-Test/playbook.retry

PLAY REKAPITULATION **************** ************************************************** *** localhost: ok = 1 geändert = 0 nicht erreichbar = 0
failed = 1

+0

@techraf Ansible Rollen sollen ziemlich unabhängig sein - und das ist meine "Complete" Rolle. Auf welche weiteren Informationen würden Sie reagieren müssen? – rtindru

+0

Probieren Sie 'gu_log =" /tmp/gunicorn.log "' nur eine Vermutung – popalka

+0

Ihr Inventar und/oder Spielbuch fehlt – Jojo

Antwort

2

Sie sind alle Rollen weder definieren noch mit mit der folgenden Aufgabe:.

- include: roles/finalize/tasks/main.yml 

Sie fügen nur eine Aufgaben-Datei in Ihr Playbook ein. Es hat nichts mit Rollen zu tun.

Um eine Rolle weisen Sie eine Liste der Rollen für ein Spiel geben sollen (ein oder mehr):

role: 
    - my_role1 
    - my_role2 

einen Blick auf der Dokumentation auf roles hat Bitte und fühlen sich frei, das Textbuch und Struktur zu verwenden, wie erstellt durch das folgende Skript.

Führt ansible Rollen-Standardvariablen an die Handler innerhalb derselben Rolle?

Ja, tut es.

Führen Sie für einen Proof das folgende Bash-Skript aus, das ein minimales Beispiel erstellt und ausführt. Es nimmt den Inhalt von und gunicorn/handlers/main.yml aus der Frage intakt und fügt fehlende Komponenten hinzu: die Aufgaben und das Playbook. Es erstellt eine zu entfernende Datei und führt das Playbook aus.

#!/bin/bash 

mkdir -p ./so41285033/roles/gunicorn 
mkdir -p ./so41285033/roles/gunicorn/defaults 
mkdir -p ./so41285033/roles/gunicorn/handlers 
mkdir -p ./so41285033/roles/gunicorn/tasks 

cat >./so41285033/roles/gunicorn/tasks/main.yml <<TASKS_END 
--- 
- debug: 
    changed_when: true 
    notify: Clear Gunicorn Log 
TASKS_END 

cat >./so41285033/roles/gunicorn/handlers/main.yml <<HANDLERS_END 
--- 
- name: Clear Gunicorn Log 
    shell: rm {{ gu_log }} 
    when: "'apiservers' not in group_names" 
HANDLERS_END 

cat >./so41285033/roles/gunicorn/defaults/main.yml <<DEFAULTS_END 
--- 
gu_log: "/tmp/gunicorn.log" 
DEFAULTS_END 

cat >./so41285033/playbook.yml <<PLAYBOOK_END 
--- 
- hosts: localhost 
    gather_facts: no 
    connection: local 
    roles: 
    - gunicorn 
PLAYBOOK_END 

touch /tmp/gunicorn.log 
ls -l /tmp/gunicorn.log 
ansible-playbook ./so41285033/playbook.yml 
ls -l /tmp/gunicorn.log 

Das Ergebnis:

-rw-r--r-- 1 techraf wheel 0 Dec 23 07:57 /tmp/gunicorn.log 
[WARNING]: Host file not found: /etc/ansible/hosts 

[WARNING]: provided hosts list is empty, only localhost is available 


PLAY [localhost] *************************************************************** 

TASK [gunicorn : debug] ******************************************************** 
ok: [localhost] => { 
    "msg": "Hello world!" 
} 

RUNNING HANDLER [gunicorn : Clear Gunicorn Log] ******************************** 
changed: [localhost] 
[WARNING]: Consider using file module with state=absent rather than running rm 


PLAY RECAP ********************************************************************* 
localhost     : ok=2 changed=2 unreachable=0 failed=0 

ls: /tmp/gunicorn.log: No such file or directory 

Interpretation:

  • Vor dem Textbuch läuft die Datei /tmp/gunicorn.log erstellt wurde und seine Existenz überprüft:

    -rw-r--r-- 1 techraf wheel 0 Dec 23 07:57 /tmp/gunicorn.log 
    
  • das Textbuch der Datei /tmp/gunicorn.log Nach dem Ausführen existiert nicht:

    ls: /tmp/gunicorn.log: No such file or directory 
    
  • ansible bestand korrekt die Variable gu_log Wert auf die Clear Gunicorn Log Handler, der die Datei entfernt.

Schlussbemerkung:

Das fragliche Problem beschrieben ist unmöglich zu reproduzieren, weil die Frage nicht vollständigen noch nachprüfbare Beispiel im Sinne von MCVE enthält.

+0

Vielen Dank! Ich verstehe Ihre Aussage, dass die Frage unvollständig ist. Ich habe Details basierend auf Ihren Kommentaren hinzugefügt. Ein Punkt des Unterschieds, den ich sofort bemerke, ist, dass mein Spielbuch einzelne Aufgaben statt Rollen enthält. Ein weiterer Unterschied ist, dass Gunicorn (das keine "tasks/main.yml" hat) NUR im Handler-Bereich (nicht in Aufgaben oder Rollen) enthalten ist. – rtindru

+0

Zwei schnelle Folgefragen: 1. Ist es empfehlenswert, Rollen so einzuschließen, wie Sie es haben? Was ist, wenn eine meiner Rollen ein reiner Handler ist, wie es bei der Gunicorn-Rolle der Fall ist? 2. Ist es notwendig, eine Rolle/Aufgabe explizit für die Variablen einzufügen, die dem it's-Handler zur Verfügung stehen? – rtindru