diff --git a/changelogs/fragments/config_encoding_resilience.yml b/changelogs/fragments/config_encoding_resilience.yml new file mode 100644 index 00000000000..eb6905070b6 --- /dev/null +++ b/changelogs/fragments/config_encoding_resilience.yml @@ -0,0 +1,2 @@ +bugfixes: + - config - encoding failures on config values should be non-fatal (https://github.com/ansible/ansible/issues/63310) diff --git a/lib/ansible/config/manager.py b/lib/ansible/config/manager.py index f76c8bf6ac1..de146062e34 100644 --- a/lib/ansible/config/manager.py +++ b/lib/ansible/config/manager.py @@ -390,7 +390,11 @@ class ConfigManager(object): origin = None for entry in entry_list: name = entry.get('name') - temp_value = container.get(name, None) + try: + temp_value = container.get(name, None) + except UnicodeEncodeError: + self.WARNINGS.add(u'value for config entry {0} contains invalid characters, ignoring...'.format(to_text(name))) + continue if temp_value is not None: # only set if env var is defined value = temp_value origin = name diff --git a/lib/ansible/utils/py3compat.py b/lib/ansible/utils/py3compat.py index 5ffb09e9d78..6b46b5e8996 100644 --- a/lib/ansible/utils/py3compat.py +++ b/lib/ansible/utils/py3compat.py @@ -27,14 +27,19 @@ class _TextEnviron(MutableMapping): Mimics the behaviour of os.environ on Python3 """ - def __init__(self, env=None): + def __init__(self, env=None, encoding=None): if env is None: env = os.environ self._raw_environ = env self._value_cache = {} # Since we're trying to mimic Python3's os.environ, use sys.getfilesystemencoding() # instead of utf-8 - self.encoding = sys.getfilesystemencoding() + if encoding is None: + # Since we're trying to mimic Python3's os.environ, use sys.getfilesystemencoding() + # instead of utf-8 + self.encoding = sys.getfilesystemencoding() + else: + self.encoding = encoding def __delitem__(self, key): del self._raw_environ[key] @@ -61,4 +66,4 @@ class _TextEnviron(MutableMapping): return len(self._raw_environ) -environ = _TextEnviron() +environ = _TextEnviron(encoding='utf-8')