Add ability to execute against a remote chroot

In some situations it may be useful to execute a role or
set of tasks against a remote chroot.

This patch aims to add that capability.

Change-Id: Icebec389807aa8782f97a95f63687eb5606f7b22
This commit is contained in:
Jesse Pretorius 2016-11-21 16:51:42 +00:00 committed by Jesse Pretorius (odyssey4me)
parent 800ef36999
commit 5af635977e
2 changed files with 28 additions and 4 deletions

View File

@ -47,20 +47,38 @@ class Connection(SSH.Connection):
self.args = args self.args = args
self.kwargs = kwargs self.kwargs = kwargs
self.vars = self._play_context._attributes['vars'] self.vars = self._play_context._attributes['vars']
self.chroot_path = self.vars.get('chroot_path')
self.container_name = self.vars.get('container_name') self.container_name = self.vars.get('container_name')
self.physical_host = self.vars.get('physical_host') self.physical_host = self.vars.get('physical_host')
self.physical_hostname = self.vars.get('physical_hostname') self.physical_hostname = self.vars.get('physical_hostname')
if self._container_check(): if self._container_check() or self._chroot_check():
self.host = self._play_context.remote_addr = self.physical_host self.host = self._play_context.remote_addr = self.physical_host
def _exec_command(self, cmd, in_data=None, sudoable=True): def _exec_command(self, cmd, in_data=None, sudoable=True):
"""run a command on the remote host.""" """run a command on the remote host."""
if self._container_check(): if self._container_check():
lxc_command = 'lxc-attach --name %s' % self.container_name lxc_command = 'lxc-attach --name %s' % self.container_name
cmd = '%s -- %s' % (lxc_command, cmd) cmd = '%s -- %s' % (lxc_command, cmd)
if self._chroot_check():
chroot_command = 'chroot %s' % self.chroot_path
cmd = '%s %s' % (chroot_command, cmd)
return super(Connection, self)._exec_command(cmd, in_data, sudoable) return super(Connection, self)._exec_command(cmd, in_data, sudoable)
def _chroot_check(self):
if self.chroot_path:
SSH.display.vvv(u'chroot_path: "%s"' % self.chroot_path)
if self.physical_hostname:
SSH.display.vvv(
u'physical_hostname: "%s"' % self.physical_hostname
)
SSH.display.vvv(u'chroot confirmed')
return True
return False
def _container_check(self): def _container_check(self):
if self.container_name: if self.container_name:
SSH.display.vvv(u'container_name: "%s"' % self.container_name) SSH.display.vvv(u'container_name: "%s"' % self.container_name)

View File

@ -94,8 +94,8 @@ 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.
Modify the playbook_context to support adding attributes for LXC Modify the playbook_context to support adding attributes for remote
containers. LXC containers or remote chroots.
""" """
templar = LINEAR.Templar(loader=self._loader, variables=task_vars) templar = LINEAR.Templar(loader=self._loader, variables=task_vars)
if not self._check_when(host, task, templar, task_vars): if not self._check_when(host, task, templar, task_vars):
@ -104,7 +104,7 @@ class StrategyModule(LINEAR.StrategyModule):
_play_context = copy.deepcopy(play_context) _play_context = copy.deepcopy(play_context)
_vars = _play_context._attributes['vars'] _vars = _play_context._attributes['vars']
if task.delegate_to: if task.delegate_to:
# If a task uses delegation change teh 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
# one task on its collection of hosts. # one task on its collection of hosts.
if _play_context.pipelining: if _play_context.pipelining:
@ -148,6 +148,12 @@ class StrategyModule(LINEAR.StrategyModule):
if container_name: if container_name:
_vars['container_name'] = container_name _vars['container_name'] = container_name
chroot_path = _vars.get('chroot_path')
if not chroot_path:
chroot_path = task_vars.get('chroot_path')
if chroot_path:
_vars['chroot_path'] = chroot_path
return super(StrategyModule, self)._queue_task( return super(StrategyModule, self)._queue_task(
host, host,
task, task,