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:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*.retry
|
||||||
43
README.md
Normal file
43
README.md
Normal 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
8
defaults/main.yml
Normal 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
1
handlers/main.yml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
38
meta/main.yml
Normal file
38
meta/main.yml
Normal 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
26
tasks/apk.yml
Normal 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
34
tasks/apt.yml
Normal 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
33
tasks/dnf.yml
Normal 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
9
tasks/main.yml
Normal 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
26
tasks/pacman.yml
Normal 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
27
tasks/yum.yml
Normal 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
27
tasks/zypper.yml
Normal 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
|
||||||
Reference in New Issue
Block a user