summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Cammarata <jimi@sngx.net>2014-05-27 10:55:09 -0500
committerJames Cammarata <jimi@sngx.net>2014-06-09 14:10:35 -0500
commitb50a64b0a17b9153baced2b6db0b036bc3ccea99 (patch)
treee659dbd8fe8c9e8918a1a4c317bdb3e3d759770f
parentadfbcb8760707dfb9eb2d81d1f7bc7d4764886a7 (diff)
downloadansible-b50a64b0a17b9153baced2b6db0b036bc3ccea99.tar.gz
Correct issue of handlers running on all hosts incorrectly
Also adds an integration test to catch this bug in the future. Fixes #7559
-rw-r--r--lib/ansible/playbook/__init__.py2
-rw-r--r--test/integration/roles/test_handlers/meta/main.yml3
-rw-r--r--test/integration/roles/test_handlers/tasks/main.yml17
-rw-r--r--test/integration/test_handlers.yml11
4 files changed, 24 insertions, 9 deletions
diff --git a/lib/ansible/playbook/__init__.py b/lib/ansible/playbook/__init__.py
index 5eba7745c8..bbec4d5fdc 100644
--- a/lib/ansible/playbook/__init__.py
+++ b/lib/ansible/playbook/__init__.py
@@ -355,7 +355,7 @@ class PlayBook(object):
def _run_task_internal(self, task):
''' run a particular module step in a playbook '''
- hosts = self._trim_unavailable_hosts(task.play._play_hosts)
+ hosts = self._trim_unavailable_hosts(self.inventory.list_hosts(task.play._play_hosts))
self.inventory.restrict_to(hosts)
runner = ansible.runner.Runner(
diff --git a/test/integration/roles/test_handlers/meta/main.yml b/test/integration/roles/test_handlers/meta/main.yml
index 1050c23ce3..74d2c33354 100644
--- a/test/integration/roles/test_handlers/meta/main.yml
+++ b/test/integration/roles/test_handlers/meta/main.yml
@@ -1,3 +1,2 @@
-dependencies:
- - prepare_tests
+dependencies: []
diff --git a/test/integration/roles/test_handlers/tasks/main.yml b/test/integration/roles/test_handlers/tasks/main.yml
index e788f51ea2..6f11768188 100644
--- a/test/integration/roles/test_handlers/tasks/main.yml
+++ b/test/integration/roles/test_handlers/tasks/main.yml
@@ -16,8 +16,23 @@
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
-- name: notify the handler
+
+- name: reset handler_called variable to false for all hosts
+ set_fact:
+ handler_called: False
+
+- name: notify the handler for host A only
shell: echo
notify:
- set handler fact
+ when: inventory_hostname == 'A'
+
+- name: force handler execution now
+ meta: "flush_handlers"
+
+- debug: var=handler_called
+- name: validate the handler only ran on one host
+ assert:
+ that:
+ - "inventory_hostname == 'A' and handler_called == True or handler_called == False"
diff --git a/test/integration/test_handlers.yml b/test/integration/test_handlers.yml
index dd766a9dea..6a5366408c 100644
--- a/test/integration/test_handlers.yml
+++ b/test/integration/test_handlers.yml
@@ -17,8 +17,9 @@
- "not hostvars[inventory_hostname]['handler1_called']"
- "'handler2_called' in hostvars[inventory_hostname]"
-#- hosts: testgroup
-# gather_facts: False
-# connection: local
-# roles:
-# - { role: test_handlers_meta }
+- name: test handlers
+ hosts: testgroup
+ gather_facts: False
+ connection: local
+ roles:
+ - { role: test_handlers }