fix for psuedo-connection hostvars not propagating to connection

(mostly done by jimi-c, tested working)

(cherry picked from commit 9f998dbfc49ab5b7a587db6a7099096a414f5841)
This commit is contained in:
nitzmahone 2016-06-10 10:13:53 -07:00
parent efed4e577c
commit 6b286ee0c8
4 changed files with 9 additions and 10 deletions

View file

@ -7,6 +7,7 @@ Ansible Changes By Release
* If the user is not using paramiko or vault, allow Ansible to run if pycrypto is not installed. * If the user is not using paramiko or vault, allow Ansible to run if pycrypto is not installed.
* Fixed a bug in pkg_util module that caused "update_catalog must be one of" error if 'update_catalog' arg was used. * Fixed a bug in pkg_util module that caused "update_catalog must be one of" error if 'update_catalog' arg was used.
* Fixed a bug where psuedo-connection vars (eg, ansible_winrm_transport) defined in group_vars or host_vars were not getting passed to the connection.
## 2.1 "The Song Remains the Same" - ACTIVE DEVELOPMENT ## 2.1 "The Song Remains the Same" - ACTIVE DEVELOPMENT

View file

@ -409,7 +409,7 @@ class TaskExecutor:
# get the connection and the handler for this execution # 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: 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 = self._get_connection(variables=variables, templar=templar)
self._connection.set_host_overrides(host=self._host) self._connection.set_host_overrides(host=self._host, hostvars=variables.get('hostvars', {}).get(self._host.name, {}))
else: else:
# if connection is reused, its _play_context is no longer valid and needs # 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 # to be replaced with the one templated above, in case other data changed

View file

@ -112,7 +112,7 @@ class ConnectionBase(with_metaclass(ABCMeta, object)):
raise AnsibleError("Internal Error: this connection module does not support running commands via %s" % self._play_context.become_method) raise AnsibleError("Internal Error: this connection module does not support running commands via %s" % self._play_context.become_method)
def set_host_overrides(self, host): def set_host_overrides(self, host, hostvars=None):
''' '''
An optional method, which can be used to set connection plugin parameters An optional method, which can be used to set connection plugin parameters
from variables set on the host (or groups to which the host belongs) from variables set on the host (or groups to which the host belongs)

View file

@ -78,16 +78,14 @@ class Connection(ConnectionBase):
super(Connection, self).__init__(*args, **kwargs) super(Connection, self).__init__(*args, **kwargs)
def set_host_overrides(self, host): def set_host_overrides(self, host, hostvars=None):
''' '''
Override WinRM-specific options from host variables. Override WinRM-specific options from host variables.
''' '''
host_vars = combine_vars(host.get_group_vars(), host.get_vars())
self._winrm_host = self._play_context.remote_addr self._winrm_host = self._play_context.remote_addr
self._winrm_port = int(self._play_context.port or 5986) self._winrm_port = int(self._play_context.port or 5986)
self._winrm_scheme = host_vars.get('ansible_winrm_scheme', 'http' if self._winrm_port == 5985 else 'https') self._winrm_scheme = hostvars.get('ansible_winrm_scheme', 'http' if self._winrm_port == 5985 else 'https')
self._winrm_path = host_vars.get('ansible_winrm_path', '/wsman') self._winrm_path = hostvars.get('ansible_winrm_path', '/wsman')
self._winrm_user = self._play_context.remote_user self._winrm_user = self._play_context.remote_user
self._winrm_pass = self._play_context.password self._winrm_pass = self._play_context.password
@ -104,7 +102,7 @@ class Connection(ConnectionBase):
self._winrm_transport = 'kerberos,%s' % transport_selector self._winrm_transport = 'kerberos,%s' % transport_selector
else: else:
self._winrm_transport = transport_selector self._winrm_transport = transport_selector
self._winrm_transport = host_vars.get('ansible_winrm_transport', self._winrm_transport) self._winrm_transport = hostvars.get('ansible_winrm_transport', self._winrm_transport)
if isinstance(self._winrm_transport, basestring): if isinstance(self._winrm_transport, basestring):
self._winrm_transport = [x.strip() for x in self._winrm_transport.split(',') if x.strip()] self._winrm_transport = [x.strip() for x in self._winrm_transport.split(',') if x.strip()]
@ -116,7 +114,7 @@ class Connection(ConnectionBase):
self._winrm_kwargs = dict(username=self._winrm_user, password=self._winrm_pass) self._winrm_kwargs = dict(username=self._winrm_user, password=self._winrm_pass)
argspec = inspect.getargspec(Protocol.__init__) argspec = inspect.getargspec(Protocol.__init__)
supported_winrm_args = set(argspec.args) supported_winrm_args = set(argspec.args)
passed_winrm_args = set([v.replace('ansible_winrm_', '') for v in host_vars if v.startswith('ansible_winrm_')]) passed_winrm_args = set([v.replace('ansible_winrm_', '') for v in hostvars if v.startswith('ansible_winrm_')])
unsupported_args = passed_winrm_args.difference(supported_winrm_args) unsupported_args = passed_winrm_args.difference(supported_winrm_args)
# warn for kwargs unsupported by the installed version of pywinrm # warn for kwargs unsupported by the installed version of pywinrm
@ -128,7 +126,7 @@ class Connection(ConnectionBase):
# pass through matching kwargs, excluding the list we want to treat specially # pass through matching kwargs, excluding the list we want to treat specially
for arg in passed_winrm_args.difference(internal_kwarg_mask).intersection(supported_winrm_args): for arg in passed_winrm_args.difference(internal_kwarg_mask).intersection(supported_winrm_args):
self._winrm_kwargs[arg] = host_vars['ansible_winrm_%s' % arg] self._winrm_kwargs[arg] = hostvars['ansible_winrm_%s' % arg]
def _winrm_connect(self): def _winrm_connect(self):
''' '''