Update Role¶
Description: System-maintenance role for refreshing the package index and upgrading installed packages via the OS package manager
Variables¶
author: Kevin Veen-Birkenbach
description: System-maintenance role for refreshing the package index and upgrading installed packages via the OS package manager
license: Infinito.Nexus Community License (Non-Commercial)
company: Kevin Veen-Birkenbach https://www.veen.world
min_ansible_version: 2.9
platforms: [{‘name’: ‘ArchLinux’, ‘versions’: [‘all’]}, {‘name’: ‘Debian’, ‘versions’: [‘all’]}, {‘name’: ‘EL’, ‘versions’: [‘all’]}, {‘name’: ‘Fedora’, ‘versions’: [‘all’]}, {‘name’: ‘Ubuntu’, ‘versions’: [‘all’]}]
galaxy_tags: [‘update’, ‘system’, ‘maintenance’, ‘apt’, ‘pacman’, ‘dnf’]
issue_tracker_url: https://s.infinito.nexus/issues
README¶
Package update¶
Description¶
Operating-system package managers such as apt, pacman and dnf keep installed software in sync with their upstream distribution repositories. Each one ships with a different command surface but they all serve the same goal: refresh the index and upgrade every installed package on the host.
Overview¶
This role refreshes the package index and upgrades every installed
package on the host. tasks/main.yml reads
ansible_facts['distribution'] and dispatches to one task file per
package-manager family. Debian and Ubuntu both use apt, so they
share a single task file; Fedora and CentOS both use dnf, and CentOS
reaches fedora.yml through centos.yml. A separate
unsupported.yml fails loudly with a clear message when a host runs a
distribution that this role does not yet cover.
|
Task file |
Module |
|---|---|---|
|
|
|
|
` debian.yml` |
` ansible.builtin.apt` |
|
` fedora.yml` |
` ansible.builtin.dnf` |
|
` centos.yml` |
` ansible.builtin.dnf` |
anything else |
|
`` ansible.builtin.fail`` |
centos.yml first runs
centos_mirror.sh, which replaces
every metalink= of the CentOS Stream repo files with a baseurl=
on mirror.stream.centos.org and every metalink= of the EPEL repo
files with the file’s own baseurl template on
dl.fedoraproject.org, and then includes fedora.yml. The
Dockerfile runs the same script before its first
dnf call, so the CentOS dev and swarm-node images resolve against
the same source.
Cosmos¶
The diagram places Package update in the Infinito.Nexus cosmos: the components it deploys (capabilities), the central services it consumes (dependencies), and its outward reach (federation and bridged external networks).
flowchart LR
subgraph role [update 💻]
svc_update["update"]
endSolid 1:1 edges are fixed relationships; dashed 0..1 edges are
conditional (enabled only in matching deployments); red 0..0 edges
are turned off in this role. Node markers show the role’s deploy modes
(💻 host, 🐳 compose, 🐝 swarm); ❌ marks a service that is explicitly
turned off, and ⚙️ an Ansible role dependency declared in
meta/main.yml.
Features¶
Per-family dispatch: Routes by
ansible_facts['distribution']so the caller never has to gate the role with awhen:clause.Five-distro coverage: Supports the five default CI distros (Archlinux, Debian, Ubuntu, Fedora, CentOS) without duplicated task code.
Loud on unsupported hosts: Fails with a clear message instead of silently skipping when the host runs an unmapped distribution.
Once-per-play idempotency: Wraps the dispatch in
when: run_once_update is not definedand writes the flag viatasks/utils/once/flag.yml, so repeated invocations within one play are no-ops.
Quick Setup¶
Development¶
Clone, set up the workstation, and deploy Package update onto the local stack:
git clone https://github.com/infinito-nexus/core.git
cd core
make onboard
make compose-deploy mode=reinstall apps=update full_cycle=false
Production¶
Install Package update directly onto the target machine: clone the repository, install the OS prerequisites and the repository toolchain, then deploy against localhost over a local connection (no SSH, no container):
git clone https://github.com/infinito-nexus/core.git
cd core
bash scripts/install/package.sh
make install
source scripts/meta/env/load.sh
APP=update
DOMAIN=<your-domain>
TLS_MODE=self_signed
SSH_PUBLIC_KEY="<your-ssh-public-key>"
INVENTORY=inventories/production
infinito administration inventory provision "$INVENTORY" \
--inventory-file "$INVENTORY/devices.yml" \
--host localhost \
--include "$APP" \
--vars "{\"TLS_MODE\": \"$TLS_MODE\", \"DOMAIN_PRIMARY\": \"$DOMAIN\", \"users\": {\"administrator\": {\"authorized_keys\": [\"$SSH_PUBLIC_KEY\"]}}}"
infinito administration deploy dedicated "$INVENTORY/devices.yml" \
--password-file "$INVENTORY/.password" \
--diff -vv
Developer Notes¶
To extend support for a new distribution, add the distribution name to
the lookup dict in main.yml. When the new
distribution shares a package manager with an existing entry, point it
at that entry’s task file. When it brings a new package manager, add a
new family file under tasks/ and keep
meta/main.yml platforms in sync.
Further Resources¶
Credits¶
Implemented by Kevin Veen-Birkenbach. Part of the Infinito.Nexus Project and maintained by Kevin Veen-Birkenbach. Licensed under the Infinito.Nexus Community License (Non-Commercial).