diff --git a/changelogs/fragments/55938-dnf-fix-wildcard-matching-state-absent.yaml b/changelogs/fragments/55938-dnf-fix-wildcard-matching-state-absent.yaml new file mode 100644 index 00000000000000..8f6fa1c61ae616 --- /dev/null +++ b/changelogs/fragments/55938-dnf-fix-wildcard-matching-state-absent.yaml @@ -0,0 +1,2 @@ +bugfixes: + - "dnf - fix wildcard matching for state: absent (https://github.com/ansible/ansible/issues/55938)" diff --git a/lib/ansible/modules/packaging/os/dnf.py b/lib/ansible/modules/packaging/os/dnf.py index 7a395675a6382f..25454ddd55907e 100644 --- a/lib/ansible/modules/packaging/os/dnf.py +++ b/lib/ansible/modules/packaging/os/dnf.py @@ -1108,6 +1108,14 @@ def ensure(self): installed = self.base.sack.query().installed() for pkg_spec in pkg_specs: + # short-circuit installed check for wildcard matching + if '*' in pkg_spec: + try: + self.base.remove(pkg_spec) + except dnf.exceptions.MarkingError as e: + failure_response['failures'].append('{0} - {1}'.format(pkg_spec, to_native(e))) + continue + installed_pkg = list(map(str, installed.filter(name=pkg_spec).run())) if installed_pkg: candidate_pkg = self._packagename_dict(installed_pkg[0]) diff --git a/test/integration/targets/dnf/tasks/repo.yml b/test/integration/targets/dnf/tasks/repo.yml index 89aa87462a8864..978d4817d7caca 100644 --- a/test/integration/targets/dnf/tasks/repo.yml +++ b/test/integration/targets/dnf/tasks/repo.yml @@ -256,6 +256,26 @@ that: - rpm_main_result.rc == 0 - rpm_weak_result.rc == 1 # the weak dependency shouldn't be installed + + # https://github.com/ansible/ansible/issues/55938 + - name: Install foo-* + dnf: + name: foo-* + state: present + + - name: Uninstall foo-* + dnf: + name: foo-* + state: absent + + - name: Check if all foo packages are removed + shell: rpm -qa foo-* | wc -l + register: rpm_result + + - name: Verify rpm result + assert: + that: + - rpm_result.stdout == '0' always: - name: Clean up dnf: