diff --git a/awx/main/expect/isolated_manager.py b/awx/main/expect/isolated_manager.py index 0554aa1109..a213113ae6 100644 --- a/awx/main/expect/isolated_manager.py +++ b/awx/main/expect/isolated_manager.py @@ -1,3 +1,4 @@ +import fnmatch import json import os import shutil @@ -17,6 +18,15 @@ logger = logging.getLogger('awx.isolated.manager') playbook_logger = logging.getLogger('awx.isolated.manager.playbooks') +def set_pythonpath(venv_libdir, env): + env.pop('PYTHONPATH', None) # default to none if no python_ver matches + for version in os.listdir(venv_libdir): + if fnmatch.fnmatch(version, 'python[23].*'): + if os.path.isdir(os.path.join(venv_libdir, version)): + env['PYTHONPATH'] = os.path.join(venv_libdir, version, "site-packages") + ":" + break + + class IsolatedManager(object): def __init__(self, cancelled_callback=None, idle_timeout=None): @@ -37,6 +47,7 @@ class IsolatedManager(object): env['ANSIBLE_RETRY_FILES_ENABLED'] = 'False' env['ANSIBLE_HOST_KEY_CHECKING'] = 'False' env['ANSIBLE_LIBRARY'] = os.path.join(os.path.dirname(awx.__file__), 'plugins', 'isolated') + set_pythonpath(os.path.join(settings.ANSIBLE_VENV_PATH, 'lib'), env) def finished_callback(runner_obj): if runner_obj.status == 'failed': diff --git a/awx/main/management/commands/test_isolated_connection.py b/awx/main/management/commands/test_isolated_connection.py index aa6a936b3d..8c8c726926 100644 --- a/awx/main/management/commands/test_isolated_connection.py +++ b/awx/main/management/commands/test_isolated_connection.py @@ -1,3 +1,4 @@ +import os import shutil import sys import tempfile @@ -7,6 +8,8 @@ from django.core.management.base import BaseCommand, CommandError import ansible_runner +from awx.main.expect.isolated_manager import set_pythonpath + class Command(BaseCommand): """Tests SSH connectivity between a controller and target isolated node""" @@ -29,12 +32,15 @@ class Command(BaseCommand): getattr(settings, 'AWX_ISOLATED_PRIVATE_KEY', None) ]): ssh_key = settings.AWX_ISOLATED_PRIVATE_KEY + env = dict(os.environ.items()) + set_pythonpath(os.path.join(settings.ANSIBLE_VENV_PATH, 'lib'), env) res = ansible_runner.interface.run( private_data_dir=path, host_pattern='all', inventory='{} ansible_ssh_user={}'.format(hostname, settings.AWX_ISOLATED_USERNAME), module='shell', module_args='ansible-runner --version', + envvars=env, verbosity=3, ssh_key=ssh_key, ) diff --git a/awx/main/tasks.py b/awx/main/tasks.py index c8e2f748f6..80f288ddc3 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -4,7 +4,6 @@ # Python from collections import OrderedDict, namedtuple import errno -import fnmatch import functools import importlib import json @@ -870,12 +869,8 @@ class BaseTask(object): raise RuntimeError( 'a valid Python virtualenv does not exist at {}'.format(venv_path) ) - env.pop('PYTHONPATH', None) # default to none if no python_ver matches - for version in os.listdir(venv_libdir): - if fnmatch.fnmatch(version, 'python[23].*'): - if os.path.isdir(os.path.join(venv_libdir, version)): - env['PYTHONPATH'] = os.path.join(venv_libdir, version, "site-packages") + ":" - break + + isolated_manager.set_pythonpath(venv_libdir, env) def add_awx_venv(self, env): env['VIRTUAL_ENV'] = settings.AWX_VENV_PATH