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:
parent
800ef36999
commit
5af635977e
@ -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)
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user