Fix delegation to containers between hosts
Tasks which delegate from a container to a container on a separate host currently fail because the 'physical_host_addr' variable, which those tasks use to connect to a physical host, is exclusively set as the address of the originating container's physical host. Assign a new host variable, 'physical_host_addrs', which contains a mapping of each physical host and its address, so the tasks can now lookup of the correct address to use depending on the target container. Change-Id: If594914df53efacc6d5bba148f4f46280f5a117d
This commit is contained in:
parent
d66fb8f310
commit
8b1a07d2d6
@ -64,7 +64,8 @@ class Connection(SSH.Connection):
|
|||||||
|
|
||||||
def set_host_overrides(self, host, hostvars=None):
|
def set_host_overrides(self, host, hostvars=None):
|
||||||
if self._container_check() or self._chroot_check():
|
if self._container_check() or self._chroot_check():
|
||||||
physical_host_addr = hostvars.get('physical_host_addr',
|
physical_host_addrs = hostvars.get('physical_host_addrs', {})
|
||||||
|
physical_host_addr = physical_host_addrs.get(self.physical_host,
|
||||||
self.physical_host)
|
self.physical_host)
|
||||||
self.host = self._play_context.remote_addr = physical_host_addr
|
self.host = self._play_context.remote_addr = physical_host_addr
|
||||||
|
|
||||||
|
@ -104,6 +104,9 @@ class StrategyModule(LINEAR.StrategyModule):
|
|||||||
def _queue_task(self, host, task, task_vars, play_context):
|
def _queue_task(self, host, task, task_vars, play_context):
|
||||||
"""Queue a task to be sent to the worker.
|
"""Queue a task to be sent to the worker.
|
||||||
|
|
||||||
|
Set a host variable, 'physical_host_addrs', containing a dictionary of
|
||||||
|
each physical host and its 'ansible_host' variable.
|
||||||
|
|
||||||
Modify the playbook_context to disable pipelining and use the paramiko
|
Modify the playbook_context to disable pipelining and use the paramiko
|
||||||
transport method when a task is being delegated.
|
transport method when a task is being delegated.
|
||||||
"""
|
"""
|
||||||
@ -112,9 +115,16 @@ class StrategyModule(LINEAR.StrategyModule):
|
|||||||
return
|
return
|
||||||
|
|
||||||
_play_context = copy.deepcopy(play_context)
|
_play_context = copy.deepcopy(play_context)
|
||||||
if 'physical_host' in host.vars:
|
|
||||||
physical_host = self._inventory.get_host_variables(host.vars['physical_host'])
|
groups = self._inventory.get_group_dict()
|
||||||
host.set_variable('physical_host_addr', physical_host['ansible_host'])
|
physical_hosts = groups.get('hosts', groups.get('all', {}))
|
||||||
|
physical_host_addrs = {}
|
||||||
|
for physical_host in physical_hosts:
|
||||||
|
physical_host_vars = self._inventory.get_host_variables(physical_host)
|
||||||
|
physical_host_addr = physical_host_vars.get('ansible_host', physical_host)
|
||||||
|
physical_host_addrs[physical_host] = physical_host_addr
|
||||||
|
host.set_variable('physical_host_addrs', physical_host_addrs)
|
||||||
|
|
||||||
if task.delegate_to:
|
if task.delegate_to:
|
||||||
# If a task uses delegation change the play_context
|
# If a task uses delegation change the play_context
|
||||||
# to use paramiko with pipelining disabled for this
|
# to use paramiko with pipelining disabled for this
|
||||||
|
Loading…
x
Reference in New Issue
Block a user