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 syslog
|
||||||
import multiprocessing
|
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
|
PY3 = sys.version_info[0] == 3
|
||||||
|
|
||||||
|
@ -114,14 +114,11 @@ def _filter_non_json_lines(data):
|
||||||
|
|
||||||
|
|
||||||
def _get_interpreter(module_path):
|
def _get_interpreter(module_path):
|
||||||
module_fd = open(module_path, 'rb')
|
with open(module_path, 'rb') as module_fd:
|
||||||
try:
|
|
||||||
head = module_fd.read(1024)
|
head = module_fd.read(1024)
|
||||||
if head[0:2] != '#!':
|
if head[0:2] != b'#!':
|
||||||
return None
|
return None
|
||||||
return head[2:head.index('\n')].strip().split(' ')
|
return head[2:head.index(b'\n')].strip().split(b' ')
|
||||||
finally:
|
|
||||||
module_fd.close()
|
|
||||||
|
|
||||||
|
|
||||||
def _make_temp_dir(path):
|
def _make_temp_dir(path):
|
||||||
|
@ -152,7 +149,7 @@ def _run_module(wrapped_cmd, jid, job_path):
|
||||||
filtered_outdata = ''
|
filtered_outdata = ''
|
||||||
stderr = ''
|
stderr = ''
|
||||||
try:
|
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)
|
# call the module interpreter directly (for non-binary modules)
|
||||||
# this permits use of a script for an interpreter on non-Linux platforms
|
# this permits use of a script for an interpreter on non-Linux platforms
|
||||||
interpreter = _get_interpreter(cmd[0])
|
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