Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Force pkg_mgr yum for rhel < 8, dnf for rhel > 8 #54010

Merged
merged 2 commits into from
Apr 9, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions changelogs/fragments/facts-pkg-mgr-rhel.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
bugfixes:
- facts - ensure that the default package manager for RHEL < 8 is yum, and dnf for newer
24 changes: 14 additions & 10 deletions lib/ansible/module_utils/facts/system/pkg_mgr.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,17 @@ def _check_rh_versions(self, pkg_mgr_name, collected_facts):
# If there's some new magical Fedora version in the future,
# just default to dnf
pkg_mgr_name = 'dnf'
else:
# If it's not Fedora and it's Red Hat family of distros, assume RHEL
# or a clone. For versions of RHEL < 8 that Ansible supports, the
# vendor supported official package manager is 'yum' and in RHEL 8+
# (as far as we know at the time of this writing) it is 'dnf'.
# If anyone wants to force a non-official package manager then they
# can define a provider to either the package or yum action plugins.
if int(collected_facts['ansible_distribution_major_version']) < 8:
pkg_mgr_name = 'yum'
else:
pkg_mgr_name = 'dnf'
return pkg_mgr_name

def _check_apt_flavor(self, pkg_mgr_name):
Expand Down Expand Up @@ -107,11 +118,10 @@ def collect(self, module=None, collected_facts=None):
pkg_mgr_name = pkg['name']

# Handle distro family defaults when more than one package manager is
# installed, the ansible_fact entry should be the default package
# manager provided by the distro.
# installed or available to the distro, the ansible_fact entry should be
# the default package manager officially supported by the distro.
if collected_facts['ansible_os_family'] == "RedHat":
if pkg_mgr_name not in ('yum', 'dnf'):
pkg_mgr_name = self._check_rh_versions(pkg_mgr_name, collected_facts)
pkg_mgr_name = self._check_rh_versions(pkg_mgr_name, collected_facts)
elif collected_facts['ansible_os_family'] == 'Debian' and pkg_mgr_name != 'apt':
# It's possible to install yum, dnf, zypper, rpm, etc inside of
# Debian. Doing so does not mean the system wants to use them.
Expand All @@ -124,11 +134,5 @@ def collect(self, module=None, collected_facts=None):
if pkg_mgr_name == 'apt':
pkg_mgr_name = self._check_apt_flavor(pkg_mgr_name)

# pacman has become available by distros other than those that are Arch
# based by virtue of a dependency to the systemd mkosi project, this
# handles some of those scenarios as they are reported/requested
if pkg_mgr_name == 'pacman' and collected_facts['ansible_os_family'] in ["RedHat"]:
pkg_mgr_name = self._check_rh_versions(collected_facts)

facts_dict['pkg_mgr'] = pkg_mgr_name
return facts_dict