From 07248e5ec1ed7cc7e2c8f77d9a2f635a58eca610 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Tue, 17 Nov 2020 12:09:46 -0500 Subject: [PATCH] avoid key errors on environment access (#72620) --- changelogs/fragments/better_os_environ_access.yml | 2 ++ lib/ansible/executor/task_executor.py | 2 +- lib/ansible/module_utils/basic.py | 8 ++++++-- 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 changelogs/fragments/better_os_environ_access.yml diff --git a/changelogs/fragments/better_os_environ_access.yml b/changelogs/fragments/better_os_environ_access.yml new file mode 100644 index 00000000000..b511593f926 --- /dev/null +++ b/changelogs/fragments/better_os_environ_access.yml @@ -0,0 +1,2 @@ +bugfixes: + - avoid possible errors accessing os.environ by not assuming existance of variables. diff --git a/lib/ansible/executor/task_executor.py b/lib/ansible/executor/task_executor.py index cfbc60a1915..22e9526f75b 100644 --- a/lib/ansible/executor/task_executor.py +++ b/lib/ansible/executor/task_executor.py @@ -1020,7 +1020,7 @@ def start_connection(play_context, variables, task_uuid): Starts the persistent connection ''' candidate_paths = [C.ANSIBLE_CONNECTION_PATH or os.path.dirname(sys.argv[0])] - candidate_paths.extend(os.environ['PATH'].split(os.pathsep)) + candidate_paths.extend(os.environ.get('PATH', '').split(os.pathsep)) for dirname in candidate_paths: ansible_connection = os.path.join(dirname, 'ansible-connection') if os.path.isfile(ansible_connection): diff --git a/lib/ansible/module_utils/basic.py b/lib/ansible/module_utils/basic.py index 9370c6ad3bd..61db4a30504 100644 --- a/lib/ansible/module_utils/basic.py +++ b/lib/ansible/module_utils/basic.py @@ -2649,8 +2649,12 @@ class AnsibleModule(object): old_env_vals[key] = os.environ.get(key, None) os.environ[key] = val if path_prefix: - old_env_vals['PATH'] = os.environ['PATH'] - os.environ['PATH'] = "%s:%s" % (path_prefix, os.environ['PATH']) + path = os.environ.get('PATH', '') + old_env_vals['PATH'] = path + if path: + os.environ['PATH'] = "%s:%s" % (path_prefix, path) + else: + os.environ['PATH'] = path_prefix # If using test-module.py and explode, the remote lib path will resemble: # /tmp/test_module_scratch/debug_dir/ansible/module_utils/basic.py