Problem with role handlers namespacing causing two handlers with same name to both be called

Hey everyone,

I’m having an issue where two handlers with the same name from two different roles are both being called during a playbook run.

Gist here: https://gist.github.com/jfchevrette/b8f5edcd94b32284d53f

I have two roles: first and second

First role has a handler called ‘restart xyz’
Second role has a handler also called ‘restart xyz’

Second role has a handler called ‘reconfigure xyz’ which then notifies ‘restart xyz’

(Real-life scenario: suppose I have two roles for two applications and both require a restart of my webserver while one of them requires a reconfiguration before the restart)

Since roles are read alphabetically (AFAIK), I’m expecting the ‘restart xyz’ to be called from the first role once handler ‘reconfigure xyz’ notifies it from the second role.

If I only call the ‘second’ role using it’s tag (defined in my playbook), the “restart xyz” handler will be called twice (once from the ‘second’ role handlers, then from the ‘first’ role handlers). I would expect it to be called only once (from the ‘first’ role) as I’ve been told it’s a global namespace for handlers.

(Real-life scenario: I only want to ensure my second application is configured properly, which then reconfigures my webserver and restart it. Both restart handlers are called and my webserver is restarted twice)

I hope my example is not too confusing.

I poked around in the source code but couldn’t find anything obvious.

Should I open a bug report?

Was this your ticket?

https://github.com/ansible/ansible/issues/8553

If so, see the comment I closed it with for some more info.

If not, let me know.

Yes it is and as suggested I posted it to the groups.

I had failed to describe that the issue is that both handlers with the same name are called even though there is only one caller. (one handler notifying ‘restart xyz’ and BOTH ‘restart xyz’ handlers are called)

Thanks Michael

Thanks I’ll take a look at this today and see what I can find out.

I just tested this on devel and 1.7 and in both I do not see handlers with the same names resulting in duplicate handler evaluation.

I’d like to see a minimal playbook (probably shouldn’t install an app, just demonstrate the issue with things like “shell: echo” and dummy handlers) that can reproduce this if possible.

Here you go: https://www.dropbox.com/s/qhooyvbzogdcjln/ansible-notify-bug.tar.gz

This uses a local connection and ensures content of two files in /tmp/

ansible-playbook demo.yml -i inventory -l localhost -t first

  • Works fine

ansible-playbook demo.yml -i inventory -l localhost -t second

  • You will see handler “restart xyz” run twice, once from role ‘second’ and once from role ‘first’

I’m having some trouble with CLI downloads from dropbox, might it be possible to host a github repo or gist?

There you go Michael: https://github.com/jfchevrette/ansible-notify-bug

I’m actually wondering if this is bad historical memory on my part.

One possible use case is if every role has a handler called “restart service” and doesn’t name it well.

So what we do here in Ansible (pardon the code is):

if task.role_name:

name = ‘%s | %s’ % (task.role_name, task.name)

else:

name = task.name

We prefix internally, each task name with the name of the role.

This is somewhat of a “damned if you, damned if you don’t”, scenario, as both cases are pretty valid.

Thoughts?

I kind of feel the namespacing protection in the system is a good thing, though I seem to have forgotten us acquiring that property. Ideas welcome.