Skip to content

Commit

Permalink
package_facts add alias support
Browse files Browse the repository at this point in the history
  • Loading branch information
bcoca committed Apr 26, 2024
1 parent 124d031 commit 2d690d7
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 11 deletions.
2 changes: 2 additions & 0 deletions changelogs/fragments/package_facts_aliases.yml
@@ -0,0 +1,2 @@
minor_changes;
- package_facts module now supports using aliases for supported package managers, for example managers=yum or managers=dnf will resolve to using the underlying rpm.
52 changes: 41 additions & 11 deletions lib/ansible/modules/package_facts.py
Expand Up @@ -14,30 +14,42 @@
options:
manager:
description:
- The package manager used by the system so we can query the package information.
- Since 2.8 this is a list and can support multiple package managers per system.
- The package manager(s) used by the system so we can query the package information.
This is a list and can support multiple package managers per system, since version 2.8.
- The 'portage' and 'pkg' options were added in version 2.8.
- The 'apk' option was added in version 2.11.
- The 'pkg_info' option was added in version 2.13.
- Aliases were added in 2.18, to support using C(auto={{ansible_facts['pkg_mgr']}})
default: ['auto']
choices: ['auto', 'rpm', 'apt', 'portage', 'pkg', 'pacman', 'apk', 'pkg_info']
choices:
auto: Depending on O(strategy), will match the first or all package managers provided, in order
rpm: For .rpm based distros, requires RPM Python bindings, not installed by default on Suse (python3-rpm)
yum: Alias to rpm
dnf: Alias to rpm
dnf5: Alias to rpm
zypper: Alias to rpm
apt: For .deb based distros, C(python-apt) package must be installed on targeted hosts
portage: Handles ebuild packages, it requires the C(qlist) utility, which is part of 'app-portage/portage-utils'
pkg: libpkg front end (FreeBSD)
pkg5: Alias to pkg
pkgng: Alias to pkg
pacman: Archlinux package managaer/builder
apk: Alpine linux package manager
pkg_info: OpenBSD package manager
openbsd_pkg: Alias To pkg_info
type: list
elements: str
strategy:
description:
- This option controls how the module queries the package managers on the system.
V(first) means it will return only information for the first supported package manager available.
V(all) will return information for all supported and available package managers on the system.
choices: ['first', 'all']
choices:
first: means it will return only information for the first supported package manager available.
all: will return information for all supported and available package managers on the system.
default: 'first'
type: str
version_added: "2.8"
version_added: "2.5"
requirements:
- For 'portage' support it requires the C(qlist) utility, which is part of 'app-portage/portage-utils'.
- For Debian-based systems C(python-apt) package must be installed on targeted hosts.
- For SUSE-based systems C(python3-rpm) package must be installed on targeted hosts.
This package is required because SUSE does not include RPM Python bindings by default.
author:
- Matthew Jones (@matburt)
- Brian Coca (@bcoca)
Expand Down Expand Up @@ -247,6 +259,13 @@
from ansible.module_utils.facts.packages import LibMgr, CLIMgr, get_all_pkg_managers


ALIASES = {
'rpm': ['dnf', 'dfn5','yum' , 'zypper'],
'pkg': ['pkg5', 'pkgng'],
'pkg_info': ['openbsd_pkg'],
}


class RPM(LibMgr):

LIB = 'rpm'
Expand Down Expand Up @@ -485,9 +504,13 @@ def main():
# get supported pkg managers
PKG_MANAGERS = get_all_pkg_managers()
PKG_MANAGER_NAMES = [x.lower() for x in PKG_MANAGERS.keys()]
# add aliases
PKG_MANAGER_NAMES.extend([alias for alist in ALIASES.values() for alias in alist])

# start work
global module

# choices are not set for 'manager' as they are computed dynamically and validated below instead of in argspec
module = AnsibleModule(argument_spec=dict(manager={'type': 'list', 'elements': 'str', 'default': ['auto']},
strategy={'choices': ['first', 'all'], 'default': 'first'}),
supports_check_mode=True)
Expand All @@ -513,12 +536,19 @@ def main():
seen = set()
for pkgmgr in managers:

if found and strategy == 'first':
if strategy == 'first' and found:
break

# substitute aliases for aliased
for aliased in ALIASES:
if pkgmgr in ALIASES[aliased]
pkgmgr = aliased
break

# dedupe as per above
if pkgmgr in seen:
continue

seen.add(pkgmgr)
try:
try:
Expand Down

0 comments on commit 2d690d7

Please sign in to comment.