diff --git a/lib/ansible/executor/task_executor.py b/lib/ansible/executor/task_executor.py index 2a1bc45ff6..847c451fb7 100644 --- a/lib/ansible/executor/task_executor.py +++ b/lib/ansible/executor/task_executor.py @@ -31,6 +31,7 @@ from ansible.module_utils.six import iteritems, string_types, binary_type from ansible.module_utils._text import to_text from ansible.playbook.conditional import Conditional from ansible.playbook.task import Task +from ansible.plugins.connection import ConnectionBase from ansible.template import Templar from ansible.utils.encrypt import key_for_hostname from ansible.utils.listify import listify_lookup_plugin_terms @@ -476,16 +477,17 @@ class TaskExecutor: self._play_context.remote_addr != self._connection._play_context.remote_addr): self._connection = self._get_connection(variables=variables, templar=templar) hostvars = variables.get('hostvars', None) - if hostvars: + # only template the vars if the connection actually implements set_host_overrides + # NB: this is expensive, and should be removed once connection-specific vars are being handled by play_context + sho_impl = getattr(type(self._connection), 'set_host_overrides', None) + if hostvars and sho_impl and sho_impl != ConnectionBase.set_host_overrides: try: - target_hostvars = hostvars.raw_get(self._host.name) + target_hostvars = hostvars.get(self._host.name) except: # FIXME: this should catch the j2undefined error here # specifically instead of all exceptions target_hostvars = dict() - else: - target_hostvars = dict() - self._connection.set_host_overrides(host=self._host, hostvars=target_hostvars) + self._connection.set_host_overrides(host=self._host, hostvars=target_hostvars) else: # if connection is reused, its _play_context is no longer valid and needs # to be replaced with the one templated above, in case other data changed