From c1fa5d29089080eb05429fb468706245a5f51e69 Mon Sep 17 00:00:00 2001 From: Alan Rominger Date: Tue, 19 Apr 2022 11:40:13 -0400 Subject: [PATCH] Stringify all env vars, not just those from file --- ansible_runner/config/_base.py | 5 ++++- test/unit/config/test__base.py | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/ansible_runner/config/_base.py b/ansible_runner/config/_base.py index 64a3c5dcb..e3955a28f 100644 --- a/ansible_runner/config/_base.py +++ b/ansible_runner/config/_base.py @@ -234,7 +234,7 @@ def _prepare_env(self, runner_mode='pexpect'): try: envvars = self.loader.load_file('env/envvars', Mapping) if envvars: - self.env.update({str(k): str(v) for k, v in envvars.items()}) + self.env.update(envvars) except ConfigurationError: debug("Not loading environment vars") # Still need to pass default environment to pexpect @@ -293,6 +293,9 @@ def _prepare_env(self, runner_mode='pexpect'): if not self.containerized: self.env['ANSIBLE_CACHE_PLUGIN_CONNECTION'] = self.fact_cache + # Pexpect will error with non-string envvars types, so we ensure string types + self.env = {str(k): str(v) for k, v in self.env.items()} + debug('env:') for k, v in sorted(self.env.items()): debug(f' {k}: {v}') diff --git a/test/unit/config/test__base.py b/test/unit/config/test__base.py index 5c2c8c407..827b0e181 100644 --- a/test/unit/config/test__base.py +++ b/test/unit/config/test__base.py @@ -73,7 +73,7 @@ def test_base_config_project_dir(tmp_path): assert rc.project_dir == tmp_path.joinpath('project').as_posix() -def test_prepare_environment_vars_only_strings(mocker): +def test_prepare_environment_vars_only_strings_from_file(mocker): rc = BaseConfig(envvars=dict(D='D')) value = dict(A=1, B=True, C="foo") @@ -92,6 +92,20 @@ def test_prepare_environment_vars_only_strings(mocker): assert rc.env['D'] == 'D' +def test_prepare_environment_vars_only_strings_from_interface(): + rc = BaseConfig(envvars=dict(D='D', A=1, B=True, C="foo")) + rc._prepare_env() + + assert 'A' in rc.env + assert isinstance(rc.env['A'], six.string_types) + assert 'B' in rc.env + assert isinstance(rc.env['B'], six.string_types) + assert 'C' in rc.env + assert isinstance(rc.env['C'], six.string_types) + assert 'D' in rc.env + assert rc.env['D'] == 'D' + + def test_prepare_environment_pexpect_defaults(): rc = BaseConfig() rc._prepare_env()