summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Martz <matt@sivel.net>2021-01-10 12:13:30 -0600
committerGitHub <noreply@github.com>2021-01-10 12:13:30 -0600
commitc32371db56c057bc0f382884b380258b653dd2be (patch)
tree3b5a444c9220466687249ff82eedb6bfe7540c1f
parentcdcd2ed49aecef3bd6b62dfa6847eb2149cdf268 (diff)
downloadansible-c32371db56c057bc0f382884b380258b653dd2be.tar.gz
[stable-2.9] Fix async interpreter parsing (#72636) (#72924)
* Fix async interpreter parsing. Fixes #70690 * Target localhost instead of remote host * Don't forget inventory * Address shellcheck issue (cherry picked from commit 83764ad) Co-authored-by: Matt Martz <matt@sivel.net>
-rw-r--r--changelogs/fragments/70690-async-interpreter.yml3
-rw-r--r--lib/ansible/modules/utilities/logic/async_wrapper.py13
-rw-r--r--test/integration/targets/noexec/aliases3
-rw-r--r--test/integration/targets/noexec/inventory1
-rwxr-xr-xtest/integration/targets/noexec/runme.sh9
-rw-r--r--test/integration/targets/noexec/test-noexec.yml8
6 files changed, 29 insertions, 8 deletions
diff --git a/changelogs/fragments/70690-async-interpreter.yml b/changelogs/fragments/70690-async-interpreter.yml
new file mode 100644
index 0000000000..55a29f3c15
--- /dev/null
+++ b/changelogs/fragments/70690-async-interpreter.yml
@@ -0,0 +1,3 @@
+bugfixes:
+- async - Fix Python 3 interpreter parsing from module by comparing with bytes
+ (https://github.com/ansible/ansible/issues/70690)
diff --git a/lib/ansible/modules/utilities/logic/async_wrapper.py b/lib/ansible/modules/utilities/logic/async_wrapper.py
index 640e74cf93..5379726ae6 100644
--- a/lib/ansible/modules/utilities/logic/async_wrapper.py
+++ b/lib/ansible/modules/utilities/logic/async_wrapper.py
@@ -21,7 +21,7 @@ import time
import syslog
import multiprocessing
-from ansible.module_utils._text import to_text
+from ansible.module_utils._text import to_text, to_bytes
PY3 = sys.version_info[0] == 3
@@ -114,14 +114,11 @@ def _filter_non_json_lines(data):
def _get_interpreter(module_path):
- module_fd = open(module_path, 'rb')
- try:
+ with open(module_path, 'rb') as module_fd:
head = module_fd.read(1024)
- if head[0:2] != '#!':
+ if head[0:2] != b'#!':
return None
- return head[2:head.index('\n')].strip().split(' ')
- finally:
- module_fd.close()
+ return head[2:head.index(b'\n')].strip().split(b' ')
def _make_temp_dir(path):
@@ -152,7 +149,7 @@ def _run_module(wrapped_cmd, jid, job_path):
filtered_outdata = ''
stderr = ''
try:
- cmd = shlex.split(wrapped_cmd)
+ cmd = [to_bytes(c, errors='surrogate_or_strict') for c in shlex.split(wrapped_cmd)]
# call the module interpreter directly (for non-binary modules)
# this permits use of a script for an interpreter on non-Linux platforms
interpreter = _get_interpreter(cmd[0])
diff --git a/test/integration/targets/noexec/aliases b/test/integration/targets/noexec/aliases
new file mode 100644
index 0000000000..a072dfcd2f
--- /dev/null
+++ b/test/integration/targets/noexec/aliases
@@ -0,0 +1,3 @@
+shippable/posix/group2
+skip/docker
+skip/osx
diff --git a/test/integration/targets/noexec/inventory b/test/integration/targets/noexec/inventory
new file mode 100644
index 0000000000..ab9b62c8bb
--- /dev/null
+++ b/test/integration/targets/noexec/inventory
@@ -0,0 +1 @@
+not_empty # avoid empty empty hosts list warning without defining explicit localhost
diff --git a/test/integration/targets/noexec/runme.sh b/test/integration/targets/noexec/runme.sh
new file mode 100755
index 0000000000..ff7065583a
--- /dev/null
+++ b/test/integration/targets/noexec/runme.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+set -eux
+
+trap 'umount "${OUTPUT_DIR}/ramdisk"' EXIT
+
+mkdir "${OUTPUT_DIR}/ramdisk"
+mount -t tmpfs -o size=32m,noexec,rw tmpfs "${OUTPUT_DIR}/ramdisk"
+ANSIBLE_REMOTE_TMP="${OUTPUT_DIR}/ramdisk" ansible-playbook -i inventory "$@" test-noexec.yml
diff --git a/test/integration/targets/noexec/test-noexec.yml b/test/integration/targets/noexec/test-noexec.yml
new file mode 100644
index 0000000000..3c7d756b56
--- /dev/null
+++ b/test/integration/targets/noexec/test-noexec.yml
@@ -0,0 +1,8 @@
+- hosts: localhost
+ gather_facts: false
+ tasks:
+ - ping:
+
+ - command: sleep 1
+ async: 2
+ poll: 1