aboutsummaryrefslogtreecommitdiffstats
path: root/main/ansible/add-lxc-container_shell-option.patch
blob: e7734101732abd048293013e18cad5f5469dc1c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
From d9b11e63387aad25cf53b2de4e77e139b2102982 Mon Sep 17 00:00:00 2001
From: lu1as <lukas.steiner@steinheilig.de>
Date: Thu, 31 May 2018 01:25:09 +0200
Subject: [PATCH] Add lxc `container_shell` option

---
 .../modules/cloud/lxc/lxc_container.py        | 29 ++++++++++++-------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/lib/ansible/modules/cloud/lxc/lxc_container.py b/lib/ansible/modules/cloud/lxc/lxc_container.py
index e0be3e4145db..21c7ad05610f 100644
--- a/lib/ansible/modules/cloud/lxc/lxc_container.py
+++ b/lib/ansible/modules/cloud/lxc/lxc_container.py
@@ -75,6 +75,11 @@
     container_command:
         description:
           - Run a command within a container.
+    container_shell:
+        description:
+          - Shell used for executing *container_command*.
+        default: bash
+        version_added: "2.7"
     lxc_path:
         description:
           - Place container under PATH
@@ -166,9 +171,10 @@
     is "stopped" and the container does not exist it will be first created,
     "started", the command executed, and then "stopped". If you use a "|"
     in the variable you can use common script formatting within the variable
-    itself The "container_command" option will always execute as BASH.
-    When using "container_command" a log file is created in the /tmp/ directory
-    which contains both stdout and stderr of any command executed.
+    itself. If your container doesn't have BASH installed, you can change
+    the shell by specifying "container_shell". When using "container_command"
+    a log file is created in the /tmp/ directory which contains both stdout
+    and stderr of any command executed.
   - If "archive" is **true** the system will attempt to create a compressed
     tarball of the running container. The "archive" option supports LVM backed
     containers and will create a snapshot of the running container when
@@ -531,13 +537,12 @@
 # container without using SSH.  The template will attempt to work within the
 # home directory of the user that was attached to the container and source
 # that users environment variables by default.
-ATTACH_TEMPLATE = """#!/usr/bin/env bash
-pushd "$(getent passwd $(whoami)|cut -f6 -d':')"
+ATTACH_TEMPLATE = """#!/usr/bin/env %(container_shell)s
+cd $(getent passwd $(whoami)|cut -f6 -d':')
     if [[ -f ".bashrc" ]];then
         source .bashrc
         unset HOSTNAME
     fi
-popd
 
 # User defined command
 %(container_command)s
@@ -550,15 +555,15 @@ def create_script(command):
     This method should be backward compatible with Python 2.4+ when executing
     from within the container.
 
-    :param command: command to run, this can be a script and can use spacing
+    :param command: shell and command to run, this can be a script and can use spacing
                     with newlines as separation.
-    :type command: ``str``
+    :type command: ``list``
     """
 
     (fd, script_file) = tempfile.mkstemp(prefix='lxc-attach-script')
     f = os.fdopen(fd, 'wb')
     try:
-        f.write(to_bytes(ATTACH_TEMPLATE % {'container_command': command}, errors='surrogate_or_strict'))
+        f.write(to_bytes(ATTACH_TEMPLATE % {'container_shell': command[0], 'container_command': command[1]}, errors='surrogate_or_strict'))
         f.flush()
     finally:
         f.close()
@@ -940,7 +945,7 @@ def _execute_command(self):
             elif container_state == 'stopped':
                 self._container_startup()
 
-            self.container.attach_wait(create_script, container_command)
+            self.container.attach_wait(create_script, [self.module.params.get('container_shell'), container_command])
             self.state_change = True
 
     def _container_startup(self, timeout=60):
@@ -1703,6 +1708,10 @@ def main():
             container_command=dict(
                 type='str'
             ),
+            container_shell=dict(
+                type='str',
+                default='bash'
+            ),
             container_config=dict(
                 type='str'
             ),