diff --git a/lib/ansible/template/__init__.py b/lib/ansible/template/__init__.py index ea2c59c168..0c6ff1c9fe 100644 --- a/lib/ansible/template/__init__.py +++ b/lib/ansible/template/__init__.py @@ -503,8 +503,8 @@ class Templar: ''' lets us know if data has a template''' if isinstance(data, string_types): try: - new = self.do_template(data) - except UndefinedError: + new = self.do_template(data, fail_on_undefined=True) + except (AnsibleUndefinedVariable, UndefinedError): return True except: return False diff --git a/lib/ansible/vars/__init__.py b/lib/ansible/vars/__init__.py index 74f41d9caf..57c8341559 100644 --- a/lib/ansible/vars/__init__.py +++ b/lib/ansible/vars/__init__.py @@ -429,8 +429,13 @@ class VariableManager: variables['inventory_dir'] = self._inventory.basedir() variables['inventory_file'] = self._inventory.src() if play: + templar = Templar(loader=loader) + if templar.is_template(play.hosts): + pattern = 'all' + else: + pattern = play.hosts or 'all' # add the list of hosts in the play, as adjusted for limit/filters - variables['ansible_play_hosts_all'] = [x.name for x in self._inventory.get_hosts(pattern=play.hosts or 'all', ignore_restrictions=True)] + variables['ansible_play_hosts_all'] = [x.name for x in self._inventory.get_hosts(pattern=pattern, ignore_restrictions=True)] variables['ansible_play_hosts'] = [x for x in variables['ansible_play_hosts_all'] if x not in play._removed_hosts] variables['ansible_play_batch'] = [x.name for x in self._inventory.get_hosts() if x.name not in play._removed_hosts]