Fetch vars for host directly when calculating the delegated user

This fixes the case in which the delegated to host may not be in the
specified hosts list, in which cases facts/vars for the host were
not available in the injected hostvars.

This also fixes the inventory variable fetching function, so that an
unknown host raises a proper error as opposed to a NoneType exception.

Fixes #8224
This commit is contained in:
James Cammarata 2014-10-10 01:18:18 -05:00
parent 2a0d18b092
commit d19fe8d95d
2 changed files with 14 additions and 1 deletions

View file

@ -437,7 +437,10 @@ class Inventory(object):
def get_variables(self, hostname, update_cached=False, vault_password=None): def get_variables(self, hostname, update_cached=False, vault_password=None):
return self.get_host(hostname).get_variables() host = self.get_host(hostname)
if not host:
raise Exception("host not found: %s" % hostname)
return host.get_variables()
def get_host_variables(self, hostname, update_cached=False, vault_password=None): def get_host_variables(self, hostname, update_cached=False, vault_password=None):

View file

@ -367,6 +367,16 @@ class Runner(object):
if inject['hostvars'][host].get('ansible_ssh_user'): if inject['hostvars'][host].get('ansible_ssh_user'):
# user for delegate host in inventory # user for delegate host in inventory
thisuser = inject['hostvars'][host].get('ansible_ssh_user') thisuser = inject['hostvars'][host].get('ansible_ssh_user')
else:
# look up the variables for the host directly from inventory
try:
host_vars = self.inventory.get_variables(host, vault_password=self.vault_pass)
if 'ansible_ssh_user' in host_vars:
thisuser = host_vars['ansible_ssh_user']
except Exception, e:
# the hostname was not found in the inventory, so
# we just ignore this and try the next method
pass
if thisuser is None and self.remote_user: if thisuser is None and self.remote_user:
# user defined by play/runner # user defined by play/runner