From 08ef0aee25a5d7280b1013b8f2cc04bd312a0a3d Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Fri, 13 Jan 2017 14:51:39 -0500 Subject: [PATCH] removed bad iteration from execute meta (#19958) * removed bad iteration from execute meta most of the tasks should not be iterated over, others needed to include unreachable hosts fixes #19673 * corrected host var --- lib/ansible/plugins/strategy/__init__.py | 82 ++++++++++++------------ lib/ansible/plugins/strategy/linear.py | 2 +- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/lib/ansible/plugins/strategy/__init__.py b/lib/ansible/plugins/strategy/__init__.py index 9c0d2a30e1..08ae4ca9a7 100644 --- a/lib/ansible/plugins/strategy/__init__.py +++ b/lib/ansible/plugins/strategy/__init__.py @@ -854,7 +854,7 @@ class StrategyBase: return ret - def _execute_meta(self, task, play_context, iterator, target_host=None): + def _execute_meta(self, task, play_context, iterator, target_host): # meta tasks store their args in the _raw_params field of args, # since they do not use k=v pairs, so get that @@ -865,52 +865,52 @@ class StrategyBase: # on a meta task that doesn't support them def _evaluate_conditional(h): - all_vars = self._variable_manager.get_vars(loader=self._loader, play=iterator._play, host=host, task=task) + all_vars = self._variable_manager.get_vars(loader=self._loader, play=iterator._play, host=h, task=task) templar = Templar(loader=self._loader, variables=all_vars) return task.evaluate_conditional(templar, all_vars) - if target_host: - host_list = [target_host] - else: - host_list = [host for host in self._inventory.get_hosts(iterator._play.hosts) if host.name not in self._tqm._unreachable_hosts] - - results = [] - for host in host_list: - result = None - if meta_action == 'noop': - # FIXME: issue a callback for the noop here? - result = TaskResult(host, task, dict(changed=False, msg="noop")) - elif meta_action == 'flush_handlers': - self.run_handlers(iterator, play_context) - elif meta_action == 'refresh_inventory': - self._inventory.refresh_inventory() - result = TaskResult(host, task, dict(changed=False, msg="inventory successfully refreshed")) - elif meta_action == 'clear_facts': - if _evaluate_conditional(host): - self._variable_manager.clear_facts(target_host) - result = TaskResult(host, task, dict(changed=True, msg="inventory successfully refreshed")) - else: - result = TaskResult(host, task, dict(changed=False, skipped=True)) - elif meta_action == 'clear_host_errors': - if _evaluate_conditional(host): + skipped = False + msg = '' + if meta_action == 'noop': + # FIXME: issue a callback for the noop here? + msg="noop" + elif meta_action == 'flush_handlers': + self.run_handlers(iterator, play_context) + msg = "ran handlers" + elif meta_action == 'refresh_inventory': + self._inventory.refresh_inventory() + msg = "inventory successfully refreshed" + elif meta_action == 'clear_facts': + if _evaluate_conditional(target_host): + for host in self._inventory.get_hosts(iterator._play.hosts): + self._variable_manager.clear_facts(host) + msg = "facts cleared" + else: + skipped = True + elif meta_action == 'clear_host_errors': + if _evaluate_conditional(target_host): + for host in self._inventory.get_hosts(iterator._play.hosts): self._tqm._failed_hosts.pop(host.name, False) self._tqm._unreachable_hosts.pop(host.name, False) iterator._host_states[host.name].fail_state = iterator.FAILED_NONE - result = TaskResult(host, task, dict(changed=True, msg="successfully cleared host errors")) - else: - result = TaskResult(host, task, dict(changed=False, skipped=True)) - elif meta_action == 'end_play': - if _evaluate_conditional(host): - iterator._host_states[host.name].run_state = iterator.ITERATING_COMPLETE - result = TaskResult(host, task, dict(changed=True, msg="ending play")) - else: - result = TaskResult(host, task, dict(changed=False, skipped=True)) - #elif meta_action == 'reset_connection': - # connection_info.connection.close() + msg="cleared host errors" else: - raise AnsibleError("invalid meta action requested: %s" % meta_action, obj=task._ds) + skipped = True + elif meta_action == 'end_play': + if _evaluate_conditional(target_host): + for host in self._inventory.get_hosts(iterator._play.hosts): + if not host.name in self._tqm._unreachable_hosts: + iterator._host_states[host.name].run_state = iterator.ITERATING_COMPLETE + msg="ending play" + #elif meta_action == 'reset_connection': + # connection_info.connection.close() + else: + raise AnsibleError("invalid meta action requested: %s" % meta_action, obj=task._ds) - if result is not None: - results.append(result) + result = { 'msg': msg } + if skipped: + result['skipped'] = True + else: + result['changed'] = False - return results + return [TaskResult(target_host, task, result)] diff --git a/lib/ansible/plugins/strategy/linear.py b/lib/ansible/plugins/strategy/linear.py index 6a4fe42543..801d7c8058 100644 --- a/lib/ansible/plugins/strategy/linear.py +++ b/lib/ansible/plugins/strategy/linear.py @@ -218,7 +218,7 @@ class StrategyModule(StrategyBase): if task.action == 'meta': # for the linear strategy, we run meta tasks just once and for # all hosts currently being iterated over rather than one host - results.extend(self._execute_meta(task, play_context, iterator)) + results.extend(self._execute_meta(task, play_context, iterator, host)) if task.args.get('_raw_params', None) != 'noop': run_once = True else: