diff --git a/changelogs/fragments/fix_setup_bad_subset.yml b/changelogs/fragments/fix_setup_bad_subset.yml new file mode 100644 index 00000000000..1bc1ce9977f --- /dev/null +++ b/changelogs/fragments/fix_setup_bad_subset.yml @@ -0,0 +1,2 @@ +bugfixes: + - setup - fix error handling on bad subset given. diff --git a/lib/ansible/modules/setup.py b/lib/ansible/modules/setup.py index f2040dfc34b..520b9471969 100644 --- a/lib/ansible/modules/setup.py +++ b/lib/ansible/modules/setup.py @@ -126,10 +126,10 @@ EXAMPLES = """ # import module snippets from ..module_utils.basic import AnsibleModule +from ansible.module_utils._text import to_text +from ansible.module_utils.facts import ansible_collector, default_collectors +from ansible.module_utils.facts.collector import CollectorNotFoundError, CycleFoundInFactDeps, UnresolvedFactDep from ansible.module_utils.facts.namespace import PrefixFactNamespace -from ansible.module_utils.facts import ansible_collector - -from ansible.module_utils.facts import default_collectors def main(): @@ -162,13 +162,16 @@ def main(): namespace = PrefixFactNamespace(namespace_name='ansible', prefix='ansible_') - fact_collector = \ - ansible_collector.get_ansible_collector(all_collector_classes=all_collector_classes, - namespace=namespace, - filter_spec=filter_spec, - gather_subset=gather_subset, - gather_timeout=gather_timeout, - minimal_gather_subset=minimal_gather_subset) + try: + fact_collector = ansible_collector.get_ansible_collector(all_collector_classes=all_collector_classes, + namespace=namespace, + filter_spec=filter_spec, + gather_subset=gather_subset, + gather_timeout=gather_timeout, + minimal_gather_subset=minimal_gather_subset) + except (TypeError, CollectorNotFoundError, CycleFoundInFactDeps, UnresolvedFactDep) as e: + # bad subset given, collector, idk, deps declared but not found + module.fail_json(msg=to_text(e)) facts_dict = fact_collector.collect(module=module) diff --git a/test/integration/targets/gathering_facts/runme.sh b/test/integration/targets/gathering_facts/runme.sh index 4635562710e..9904c9e78e6 100755 --- a/test/integration/targets/gathering_facts/runme.sh +++ b/test/integration/targets/gathering_facts/runme.sh @@ -16,3 +16,6 @@ ansible-playbook verify_merge_facts.yml -v "$@" -e 'ansible_facts_parallel: Fals # ensure we dont clobber facts in loop ansible-playbook prevent_clobbering.yml -v "$@" + +# ensure we dont fail module on bad subset +ansible-playbook verify_subset.yml "$@" diff --git a/test/integration/targets/gathering_facts/verify_subset.yml b/test/integration/targets/gathering_facts/verify_subset.yml new file mode 100644 index 00000000000..89132756ea7 --- /dev/null +++ b/test/integration/targets/gathering_facts/verify_subset.yml @@ -0,0 +1,13 @@ +- hosts: localhost + gather_facts: false + tasks: + - name: bad subset used + setup: gather_subset=nonsense + register: bad_sub + ignore_errors: true + + - name: verify we fail the right way + assert: + that: + - bad_sub is failed + - "'MODULE FAILURE' not in bad_sub['msg']"