Ansible: Problem with handlers when reusing role in playbook

Created on 22 Mar 2016  ·  2Comments  ·  Source: ansible/ansible

Issue Type:
  • Bug Report
    Ansible Version:
ansible 2.0.0.2
  config file = /home/mickael/git/emq-devops/ansible/ansible.cfg
  configured module search path = Default w/o overrides
Ansible Configuration:

n/a

Environment:

Running Ansible from Ubuntu 14.04
Managing OS: CentOS 7

Summary:

When reusing a role in playbook, a handler is not using expected role's variable value within the handler task.

(I'm not sure if it is the expected behavior or not. I'm suspecting that variables used in handlers are substituted when the handler is defined)

Steps To Reproduce:

Clone https://github.com/mickael-ange/ansible-reports and run:

ansible-playbook playbooks/test-handlers-01.yml
Expected Results:

The second handler call would have item=test2.

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [test-handlers-01 : always changes to trigger handler] ********************
changed: [localhost]

TASK [test-handlers-01 : include] **********************************************
included: /home/mickael/git/ansible-reports/roles/test-handlers-01/tasks/flush_handlers.yml for localhost

RUNNING HANDLER [test-handlers-01 : test handler] ******************************
changed: [localhost] => (item=test1)

TASK [test-handlers-01 : always changes to trigger handler] ********************
changed: [localhost]

TASK [test-handlers-01 : include] **********************************************
included: /home/mickael/git/ansible-reports/roles/test-handlers-01/tasks/flush_handlers.yml for localhost

RUNNING HANDLER [test-handlers-01 : test handler] ******************************
changed: [localhost] => (item=test2)

PLAY RECAP *********************************************************************
localhost                  : ok=7    changed=4    unreachable=0    failed=0   
Actual Results:

The actual result is that both handler calls use the same variable value (item=test1) even if the variable test_name has been redefined in the playbook.

$ ansible-playbook -vvvv playbooks/test-handlers-01.yml
Using /home/mickael/git/ansible-reports/ansible.cfg as config file
Loaded callback default of type stdout, v2.0
1 plays in playbooks/test-handlers-01.yml

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ESTABLISH LOCAL CONNECTION FOR USER: mickael
localhost EXEC ( umask 22 && mkdir -p "$( echo $HOME/.ansible/tmp/ansible-tmp-1458621398.48-100196802537724 )" && echo "$( echo $HOME/.ansible/tmp/ansible-tmp-1458621398.48-100196802537724 )" )
localhost PUT /tmp/tmp67Fgab TO /home/mickael/.ansible/tmp/ansible-tmp-1458621398.48-100196802537724/setup
localhost EXEC LANG=C LC_ALL=C LC_MESSAGES=C /usr/bin/python /home/mickael/.ansible/tmp/ansible-tmp-1458621398.48-100196802537724/setup; rm -rf "/home/mickael/.ansible/tmp/ansible-tmp-1458621398.48-100196802537724/" > /dev/null 2>&1
ok: [localhost]

TASK [test-handlers-01 : always changes to trigger handler] ********************
task path: /home/mickael/git/ansible-reports/roles/test-handlers-01/tasks/main.yml:2
ESTABLISH LOCAL CONNECTION FOR USER: mickael
localhost EXEC ( umask 22 && mkdir -p "$( echo $HOME/.ansible/tmp/ansible-tmp-1458621398.81-97442582835398 )" && echo "$( echo $HOME/.ansible/tmp/ansible-tmp-1458621398.81-97442582835398 )" )
localhost PUT /tmp/tmpGhth2G TO /home/mickael/.ansible/tmp/ansible-tmp-1458621398.81-97442582835398/command
localhost EXEC LANG=C LC_ALL=C LC_MESSAGES=C /usr/bin/python /home/mickael/.ansible/tmp/ansible-tmp-1458621398.81-97442582835398/command; rm -rf "/home/mickael/.ansible/tmp/ansible-tmp-1458621398.81-97442582835398/" > /dev/null 2>&1
NOTIFIED HANDLER test handler
changed: [localhost] => {"changed": true, "cmd": "echo hello", "delta": "0:00:00.000985", "end": "2016-03-22 12:36:38.842304", "invocation": {"module_args": {"_raw_params": "echo hello", "_uses_shell": true, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "rc": 0, "start": "2016-03-22 12:36:38.841319", "stderr": "", "stdout": "hello", "stdout_lines": ["hello"], "warnings": []}

TASK [test-handlers-01 : include] **********************************************
task path: /home/mickael/git/ansible-reports/roles/test-handlers-01/tasks/main.yml:7
included: /home/mickael/git/ansible-reports/roles/test-handlers-01/tasks/flush_handlers.yml for localhost

RUNNING HANDLER [test-handlers-01 : test handler] ******************************
ESTABLISH LOCAL CONNECTION FOR USER: mickael
localhost EXEC ( umask 22 && mkdir -p "$( echo $HOME/.ansible/tmp/ansible-tmp-1458621398.89-30437666642483 )" && echo "$( echo $HOME/.ansible/tmp/ansible-tmp-1458621398.89-30437666642483 )" )
localhost PUT /tmp/tmp0ZvLkG TO /home/mickael/.ansible/tmp/ansible-tmp-1458621398.89-30437666642483/command
localhost EXEC /bin/sh -c 'sudo -H -S -n -u root /bin/sh -c '"'"'echo BECOME-SUCCESS-galeggchoargiitnuhweljdxhuzvxyfk; LANG=C LC_ALL=C LC_MESSAGES=C /usr/bin/python /home/mickael/.ansible/tmp/ansible-tmp-1458621398.89-30437666642483/command; rm -rf "/home/mickael/.ansible/tmp/ansible-tmp-1458621398.89-30437666642483/" > /dev/null 2>&1'"'"''
changed: [localhost] => (item=test1) => {"changed": true, "cmd": "echo test1", "delta": "0:00:00.001024", "end": "2016-03-22 12:36:38.923978", "invocation": {"module_args": {"_raw_params": "echo test1", "_uses_shell": true, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "item": "test1", "rc": 0, "start": "2016-03-22 12:36:38.922954", "stderr": "", "stdout": "test1", "stdout_lines": ["test1"], "warnings": []}

TASK [test-handlers-01 : always changes to trigger handler] ********************
task path: /home/mickael/git/ansible-reports/roles/test-handlers-01/tasks/main.yml:2
ESTABLISH LOCAL CONNECTION FOR USER: mickael
localhost EXEC ( umask 22 && mkdir -p "$( echo $HOME/.ansible/tmp/ansible-tmp-1458621398.94-276260811692367 )" && echo "$( echo $HOME/.ansible/tmp/ansible-tmp-1458621398.94-276260811692367 )" )
localhost PUT /tmp/tmp86IG7E TO /home/mickael/.ansible/tmp/ansible-tmp-1458621398.94-276260811692367/command
localhost EXEC LANG=C LC_ALL=C LC_MESSAGES=C /usr/bin/python /home/mickael/.ansible/tmp/ansible-tmp-1458621398.94-276260811692367/command; rm -rf "/home/mickael/.ansible/tmp/ansible-tmp-1458621398.94-276260811692367/" > /dev/null 2>&1
NOTIFIED HANDLER test handler
changed: [localhost] => {"changed": true, "cmd": "echo hello", "delta": "0:00:00.001004", "end": "2016-03-22 12:36:38.968493", "invocation": {"module_args": {"_raw_params": "echo hello", "_uses_shell": true, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "rc": 0, "start": "2016-03-22 12:36:38.967489", "stderr": "", "stdout": "hello", "stdout_lines": ["hello"], "warnings": []}

TASK [test-handlers-01 : include] **********************************************
task path: /home/mickael/git/ansible-reports/roles/test-handlers-01/tasks/main.yml:7
included: /home/mickael/git/ansible-reports/roles/test-handlers-01/tasks/flush_handlers.yml for localhost

RUNNING HANDLER [test-handlers-01 : test handler] ******************************
ESTABLISH LOCAL CONNECTION FOR USER: mickael
localhost EXEC ( umask 22 && mkdir -p "$( echo $HOME/.ansible/tmp/ansible-tmp-1458621399.02-117648891898111 )" && echo "$( echo $HOME/.ansible/tmp/ansible-tmp-1458621399.02-117648891898111 )" )
localhost PUT /tmp/tmpBLQAIM TO /home/mickael/.ansible/tmp/ansible-tmp-1458621399.02-117648891898111/command
localhost EXEC /bin/sh -c 'sudo -H -S -n -u root /bin/sh -c '"'"'echo BECOME-SUCCESS-djwqhqqtijmpdsiqoxgfazrcxttepenq; LANG=C LC_ALL=C LC_MESSAGES=C /usr/bin/python /home/mickael/.ansible/tmp/ansible-tmp-1458621399.02-117648891898111/command; rm -rf "/home/mickael/.ansible/tmp/ansible-tmp-1458621399.02-117648891898111/" > /dev/null 2>&1'"'"''
changed: [localhost] => (item=test1) => {"changed": true, "cmd": "echo test1", "delta": "0:00:00.001034", "end": "2016-03-22 12:36:39.051023", "invocation": {"module_args": {"_raw_params": "echo test1", "_uses_shell": true, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "item": "test1", "rc": 0, "start": "2016-03-22 12:36:39.049989", "stderr": "", "stdout": "test1", "stdout_lines": ["test1"], "warnings": []}

PLAY RECAP *********************************************************************
localhost                  : ok=7    changed=4    unreachable=0    failed=0  
bug

All 2 comments

I may have fixed this recently, but I'll look into it as soon as I can.

This is still same with Ansible 2.1
I cannot really use same role more than one time if handler looks like

- name: delete varnish container
  docker:
    image: "{{ docker_varnish_image_tag }}"
    name: "{{ docker_varnish_container_name }}"
    state: absent
    docker_api_version: "{{ docker_api_version }}"

docker_varnish_container_name variable is different each time I call this role like this in playbook

- { role: docker_varnish, docker_varnish_container_name: varnish-apps }
- { role: docker_varnish, docker_varnish_container_name: varnish-cache }

But it stops container with name that has been defined as very first in playbook.

I tried to use variable in handler's name but they are not triggered at all in that case.

Update:
This only works if I have this in role

- name: Set container name variable
  set_fact: docker_varnish_container_name={{container_name}}
  when: container_name is defined

and this in playbook

- { role: docker_varnish, container_name: varnish-apps }
- { role: docker_varnish, container_name: varnish-cache }

Was this page helpful?
0 / 5 - 0 ratings