Skip to content

Commit

Permalink
Create a raw lookup for hostvars that does not template the data
Browse files Browse the repository at this point in the history
When using hostvars to get extra connection-specific vars for connection
plugins, use this raw lookup to avoid prematurely templating all of the
hostvar data (triggering unnecessary lookups).

Fixes #17024
  • Loading branch information
jimi-c committed Sep 21, 2016
1 parent e131ab8 commit 139d99d
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 6 deletions.
8 changes: 7 additions & 1 deletion lib/ansible/executor/task_executor.py
Expand Up @@ -437,7 +437,13 @@ def _execute(self, variables=None):
# get the connection and the handler for this execution
if not self._connection or not getattr(self._connection, 'connected', False) or self._play_context.remote_addr != self._connection._play_context.remote_addr:
self._connection = self._get_connection(variables=variables, templar=templar)
self._connection.set_host_overrides(host=self._host, hostvars=variables.get('hostvars', {}).get(self._host.name, {}))
hostvars = variables.get('hostvars', None)
if hostvars:
try:
target_hostvars = hostvars.raw_get(self._host.name)
except:
target_hostvars = dict()
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
Expand Down
15 changes: 10 additions & 5 deletions lib/ansible/vars/hostvars.py
Expand Up @@ -68,20 +68,25 @@ def _find_host(self, host_name):
host = self._inventory.get_host(host_name)
return host

def __getitem__(self, host_name):
def raw_get(self, host_name):
'''
Similar to __getitem__, however the returned data is not run through
the templating engine to expand variables in the hostvars.
'''
host = self._find_host(host_name)
if host is None:
raise j2undefined

data = self._variable_manager.get_vars(loader=self._loader, host=host, include_hostvars=False)
return self._variable_manager.get_vars(loader=self._loader, host=host, include_hostvars=False)

def __getitem__(self, host_name):
data = self.raw_get(host_name)
sha1_hash = sha1(str(data).encode('utf-8')).hexdigest()
if sha1_hash in self._cached_result:
result = self._cached_result[sha1_hash]
else:
#templar = Templar(variables=data, loader=self._loader)
#result = templar.template(data, fail_on_undefined=False, static_vars=STATIC_VARS)
result = data
templar = Templar(variables=data, loader=self._loader)
result = templar.template(data, fail_on_undefined=False, static_vars=STATIC_VARS)
self._cached_result[sha1_hash] = result
return result

Expand Down

0 comments on commit 139d99d

Please sign in to comment.