From 3637ce45385e92a3d96095464d752c43a6fdf775 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Wed, 27 Mar 2019 18:41:32 -0400 Subject: [PATCH] Handle gracefully a bad module 'results' key (#53973) * Handle gracefully a bad module 'results' key fixes #53962 --- changelogs/fragments/clean_results.yml | 2 ++ lib/ansible/plugins/action/__init__.py | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 changelogs/fragments/clean_results.yml diff --git a/changelogs/fragments/clean_results.yml b/changelogs/fragments/clean_results.yml new file mode 100644 index 00000000000..71c4fd423b2 --- /dev/null +++ b/changelogs/fragments/clean_results.yml @@ -0,0 +1,2 @@ +bugfixes: + - disallow non dict results from module and allow user to continue using with a warning. diff --git a/lib/ansible/plugins/action/__init__.py b/lib/ansible/plugins/action/__init__.py index b56438dd8ae..ff2db2bfc31 100644 --- a/lib/ansible/plugins/action/__init__.py +++ b/lib/ansible/plugins/action/__init__.py @@ -21,6 +21,7 @@ from ansible import constants as C from ansible.errors import AnsibleError, AnsibleConnectionFailure, AnsibleActionSkip, AnsibleActionFail from ansible.executor.module_common import modify_module from ansible.executor.interpreter_discovery import discover_interpreter, InterpreterDiscoveryRequiredError +from ansible.module_utils.common._collections_compat import Sequence from ansible.module_utils.json_utils import _filter_non_json_lines from ansible.module_utils.six import binary_type, string_types, text_type, iteritems, with_metaclass from ansible.module_utils.six.moves import shlex_quote @@ -909,6 +910,12 @@ class ActionBase(with_metaclass(ABCMeta, object)): if data.pop("_ansible_suppress_tmpdir_delete", False): self._cleanup_remote_tmp = False + # NOTE: yum returns results .. but that made it 'compatible' with squashing, so we allow mappings, for now + if 'results' in data and (not isinstance(data['results'], Sequence) or isinstance(data['results'], string_types)): + data['ansible_module_results'] = data['results'] + del data['results'] + display.warning("Found internal 'results' key in module return, renamed to 'ansible_module_results'.") + # remove internal keys remove_internal_keys(data)