Fix async interpreter parsing (#72636)
* Fix async interpreter parsing. Fixes #70690 * Target localhost instead of remote host * Don't forget inventory * Address shellcheck issue
This commit is contained in:
parent
1b70260d5a
commit
83764ad506
6 changed files with 29 additions and 8 deletions
3
changelogs/fragments/70690-async-interpreter.yml
Normal file
3
changelogs/fragments/70690-async-interpreter.yml
Normal file
|
@ -0,0 +1,3 @@
|
|||
bugfixes:
|
||||
- async - Fix Python 3 interpreter parsing from module by comparing with bytes
|
||||
(https://github.com/ansible/ansible/issues/70690)
|
|
@ -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])
|
||||
|
|
3
test/integration/targets/noexec/aliases
Normal file
3
test/integration/targets/noexec/aliases
Normal file
|
@ -0,0 +1,3 @@
|
|||
shippable/posix/group2
|
||||
skip/docker
|
||||
skip/macos
|
1
test/integration/targets/noexec/inventory
Normal file
1
test/integration/targets/noexec/inventory
Normal file
|
@ -0,0 +1 @@
|
|||
not_empty # avoid empty empty hosts list warning without defining explicit localhost
|
9
test/integration/targets/noexec/runme.sh
Executable file
9
test/integration/targets/noexec/runme.sh
Executable file
|
@ -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
|
8
test/integration/targets/noexec/test-noexec.yml
Normal file
8
test/integration/targets/noexec/test-noexec.yml
Normal file
|
@ -0,0 +1,8 @@
|
|||
- hosts: localhost
|
||||
gather_facts: false
|
||||
tasks:
|
||||
- ping:
|
||||
|
||||
- command: sleep 1
|
||||
async: 2
|
||||
poll: 1
|
Loading…
Reference in a new issue