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

109 views
Skip to first unread message

Jean-Francois Chevrette

unread,
Aug 11, 2014, 5:25:04 PM8/11/14
to ansible...@googlegroups.com
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. 


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?

Michael DeHaan

unread,
Aug 11, 2014, 6:01:54 PM8/11/14
to ansible...@googlegroups.com
Was this your ticket?


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

If not, let me know.





--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/e7f81bd1-70d9-42d3-832c-753872112a33%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Jean-Francois Chevrette

unread,
Aug 11, 2014, 6:22:16 PM8/11/14
to ansible...@googlegroups.com
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

Michael DeHaan

unread,
Aug 12, 2014, 7:25:05 AM8/12/14
to ansible...@googlegroups.com
Thanks I'll take a look at this today and see what I can find out.




Michael DeHaan

unread,
Aug 12, 2014, 10:57:06 AM8/12/14
to ansible...@googlegroups.com
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.


Jean-Francois Chevrette

unread,
Aug 12, 2014, 1:02:09 PM8/12/14
to ansible...@googlegroups.com
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'

Michael DeHaan

unread,
Aug 12, 2014, 3:07:27 PM8/12/14
to ansible...@googlegroups.com
I'm having some trouble with CLI downloads from dropbox, might it be possible to host a github repo or gist?




Jean-Francois Chevrette

unread,
Aug 13, 2014, 8:38:10 AM8/13/14
to ansible...@googlegroups.com


--
You received this message because you are subscribed to a topic in the Google Groups "Ansible Project" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ansible-project/Kg-8w2z6-aA/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ansible-proje...@googlegroups.com.

To post to this group, send email to ansible...@googlegroups.com.

Michael DeHaan

unread,
Aug 13, 2014, 9:16:27 AM8/13/14
to ansible...@googlegroups.com
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.




Reply all
Reply to author
Forward
0 new messages