feat: initial cross-distro package management role

Supports apt, dnf, yum, pacman, apk and zypper. Variables cover install,
remove, upgrade, cache refresh and autoremove.
This commit is contained in:
2026-05-24 16:40:42 +02:00
commit c94df9fefa
12 changed files with 273 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
*.retry

43
README.md Normal file
View File

@@ -0,0 +1,43 @@
# ansible-role-packages
Manages Linux packages across distributions using the native package manager.
Supported package managers: `apt`, `dnf`, `yum`, `pacman`, `apk`, `zypper`.
## Requirements
- Ansible >= 2.14
- `community.general` collection (required for Arch, Alpine, openSUSE targets)
## Role Variables
| Variable | Default | Description |
|---|---|---|
| `packages_install` | `[]` | List of packages to install |
| `packages_remove` | `[]` | List of packages to remove |
| `packages_state` | `present` | State for installed packages: `present` or `latest` |
| `packages_upgrade` | `false` | Upgrade all packages on the system |
| `packages_update_cache` | `true` | Refresh the package cache before operations |
| `packages_cache_valid_time` | `3600` | Maximum cache age in seconds before forcing a refresh (apt only) |
| `packages_autoremove` | `false` | Remove unused dependencies after operations (apt, dnf only) |
## Example Playbook
```yaml
- hosts: servers
roles:
- role: ansible-role-packages
vars:
packages_install:
- curl
- git
- vim
packages_remove:
- telnet
packages_update_cache: true
packages_upgrade: false
```
## License
MIT

8
defaults/main.yml Normal file
View File

@@ -0,0 +1,8 @@
---
packages_install: []
packages_remove: []
packages_upgrade: false
packages_update_cache: true
packages_cache_valid_time: 3600
packages_state: present
packages_autoremove: false

1
handlers/main.yml Normal file
View File

@@ -0,0 +1 @@
---

38
meta/main.yml Normal file
View File

@@ -0,0 +1,38 @@
---
galaxy_info:
author: mathieu
description: Cross-distribution Linux package management
license: MIT
min_ansible_version: "2.14"
platforms:
- name: Debian
versions:
- bullseye
- bookworm
- name: Ubuntu
versions:
- focal
- jammy
- noble
- name: EL
versions:
- "8"
- "9"
- name: Fedora
versions:
- all
- name: ArchLinux
versions:
- all
- name: Alpine
versions:
- all
- name: opensuse
versions:
- all
galaxy_tags:
- packages
- system
- linux
dependencies: []

26
tasks/apk.yml Normal file
View File

@@ -0,0 +1,26 @@
---
- name: Update apk cache
community.general.apk:
update_cache: true
become: true
when: packages_update_cache | bool
- name: Upgrade all packages
community.general.apk:
upgrade: true
become: true
when: packages_upgrade | bool
- name: Install packages
community.general.apk:
name: "{{ packages_install }}"
state: "{{ packages_state }}"
become: true
when: packages_install | length > 0
- name: Remove packages
community.general.apk:
name: "{{ packages_remove }}"
state: absent
become: true
when: packages_remove | length > 0

34
tasks/apt.yml Normal file
View File

@@ -0,0 +1,34 @@
---
- name: Update apt cache
ansible.builtin.apt:
update_cache: true
cache_valid_time: "{{ packages_cache_valid_time }}"
become: true
when: packages_update_cache | bool
- name: Upgrade all packages
ansible.builtin.apt:
upgrade: dist
become: true
when: packages_upgrade | bool
- name: Install packages
ansible.builtin.apt:
name: "{{ packages_install }}"
state: "{{ packages_state }}"
become: true
when: packages_install | length > 0
- name: Remove packages
ansible.builtin.apt:
name: "{{ packages_remove }}"
state: absent
purge: false
become: true
when: packages_remove | length > 0
- name: Remove unused dependencies
ansible.builtin.apt:
autoremove: true
become: true
when: packages_autoremove | bool

33
tasks/dnf.yml Normal file
View File

@@ -0,0 +1,33 @@
---
- name: Update dnf cache
ansible.builtin.dnf:
update_cache: true
become: true
when: packages_update_cache | bool
- name: Upgrade all packages
ansible.builtin.dnf:
name: "*"
state: latest
become: true
when: packages_upgrade | bool
- name: Install packages
ansible.builtin.dnf:
name: "{{ packages_install }}"
state: "{{ packages_state }}"
become: true
when: packages_install | length > 0
- name: Remove packages
ansible.builtin.dnf:
name: "{{ packages_remove }}"
state: absent
become: true
when: packages_remove | length > 0
- name: Remove unused dependencies
ansible.builtin.dnf:
autoremove: true
become: true
when: packages_autoremove | bool

9
tasks/main.yml Normal file
View File

@@ -0,0 +1,9 @@
---
- name: Assert supported package manager
ansible.builtin.assert:
that:
- ansible_pkg_mgr in ['apt', 'dnf', 'yum', 'pacman', 'apk', 'zypper']
fail_msg: "Package manager '{{ ansible_pkg_mgr }}' is not supported by this role"
- name: Include package manager tasks
ansible.builtin.include_tasks: "{{ ansible_pkg_mgr }}.yml"

26
tasks/pacman.yml Normal file
View File

@@ -0,0 +1,26 @@
---
- name: Update pacman cache
community.general.pacman:
update_cache: true
become: true
when: packages_update_cache | bool
- name: Upgrade all packages
community.general.pacman:
upgrade: true
become: true
when: packages_upgrade | bool
- name: Install packages
community.general.pacman:
name: "{{ packages_install }}"
state: "{{ packages_state }}"
become: true
when: packages_install | length > 0
- name: Remove packages
community.general.pacman:
name: "{{ packages_remove }}"
state: absent
become: true
when: packages_remove | length > 0

27
tasks/yum.yml Normal file
View File

@@ -0,0 +1,27 @@
---
- name: Update yum cache
ansible.builtin.yum:
update_cache: true
become: true
when: packages_update_cache | bool
- name: Upgrade all packages
ansible.builtin.yum:
name: "*"
state: latest
become: true
when: packages_upgrade | bool
- name: Install packages
ansible.builtin.yum:
name: "{{ packages_install }}"
state: "{{ packages_state }}"
become: true
when: packages_install | length > 0
- name: Remove packages
ansible.builtin.yum:
name: "{{ packages_remove }}"
state: absent
become: true
when: packages_remove | length > 0

27
tasks/zypper.yml Normal file
View File

@@ -0,0 +1,27 @@
---
- name: Refresh zypper repositories
community.general.zypper_repository:
runrefresh: true
become: true
when: packages_update_cache | bool
- name: Upgrade all packages
community.general.zypper:
name: "*"
state: dist-upgrade
become: true
when: packages_upgrade | bool
- name: Install packages
community.general.zypper:
name: "{{ packages_install }}"
state: "{{ packages_state }}"
become: true
when: packages_install | length > 0
- name: Remove packages
community.general.zypper:
name: "{{ packages_remove }}"
state: absent
become: true
when: packages_remove | length > 0