diff --git a/lib/ansible/plugins/strategies/__init__.py b/lib/ansible/plugins/strategies/__init__.py index e9cdd7d35ce..83e045bfe39 100644 --- a/lib/ansible/plugins/strategies/__init__.py +++ b/lib/ansible/plugins/strategies/__init__.py @@ -104,6 +104,17 @@ class StrategyBase: def get_failed_hosts(self, play): return [host for host in self._inventory.get_hosts(play.hosts) if host.name in self._tqm._failed_hosts] + def add_tqm_variables(self, vars, play): + ''' + Base class method to add extra variables/information to the list of task + vars sent through the executor engine regarding the task queue manager state. + ''' + + new_vars = vars.copy() + new_vars['ansible_current_hosts'] = self.get_hosts_remaining(play) + new_vars['ansible_failed_hosts'] = self.get_failed_hosts(play) + return new_vars + def _queue_task(self, host, task, task_vars, connection_info): ''' handles queueing the task up to be sent to a worker ''' @@ -374,6 +385,7 @@ class StrategyBase: for host in self._notified_handlers[handler_name]: if not handler.has_triggered(host): task_vars = self._variable_manager.get_vars(loader=self._loader, play=iterator._play, host=host, task=handler) + task_vars = self.add_tqm_variables(task_vars, play=iterator._play) self._queue_task(host, handler, task_vars, connection_info) handler.flag_for_host(host) self._process_pending_results(iterator) diff --git a/lib/ansible/plugins/strategies/linear.py b/lib/ansible/plugins/strategies/linear.py index efa96a35a7f..1ce9677f8f9 100644 --- a/lib/ansible/plugins/strategies/linear.py +++ b/lib/ansible/plugins/strategies/linear.py @@ -188,6 +188,7 @@ class StrategyModule(StrategyBase): else: debug("getting variables") task_vars = self._variable_manager.get_vars(loader=self._loader, play=iterator._play, host=host, task=task) + task_vars = self.add_tqm_variables(task_vars, play=iterator._play) templar = Templar(loader=self._loader, variables=task_vars) debug("done getting variables") diff --git a/lib/ansible/vars/__init__.py b/lib/ansible/vars/__init__.py index 239d77ca658..2d116854390 100644 --- a/lib/ansible/vars/__init__.py +++ b/lib/ansible/vars/__init__.py @@ -227,6 +227,15 @@ class VariableManager: if self._inventory is not None: all_vars['inventory_dir'] = self._inventory.basedir() + if play: + # add the list of hosts in the play, as adjusted for limit/filters + # FIXME: play_hosts should be deprecated in favor of ansible_play_hosts, + # however this would take work in the templating engine, so for now + # we'll add both so we can give users something transitional to use + host_list = [x.name for x in self._inventory.get_hosts()] + all_vars['play_hosts'] = host_list + all_vars['ansible_play_hosts'] = host_list + # the 'omit' value alows params to be left out if the variable they are based on is undefined all_vars['omit'] = self._omit_token