From e0bf87763079bf6f90d546397a82b480a6b4f994 Mon Sep 17 00:00:00 2001 From: Jihan El Karz Date: Wed, 29 Apr 2026 14:54:06 +0200 Subject: [PATCH] fix(roles/glances): skip for rhel10 --- CHANGELOG.md | 5 +++-- COMPATIBILITY.md | 2 +- roles/glances/README.md | 2 +- roles/glances/tasks/main.yml | 15 +++++++++++++++ .../glances/templates/etc/profile.d/glances.sh.j2 | 5 ++++- 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8975416b5..a01825875 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +* **role:glances**: Add RHEL 10 / Rocky 10 / Alma 10 support by installing glances into a Python venv via pip, since the package is not available in EPEL 10. * **role:network**: README still claimed the role disables zeroconf, but the corresponding `NOZEROCONF=yes` task was removed in 2024 (NetworkManager no longer adds the zeroconf route by default). Bring the README in line with what the role actually does and call out the Hetzner-specific `hc-utils` cleanup explicitly. * **role:haveged**: Setting `haveged__service_state: 'stopped'` produced the invalid systemctl command `stopp` because of a `[:-2]` slice in the task name. The role now uses `ansible.builtin.service` directly with the configured state, so all four valid values (`reloaded` / `restarted` / `started` / `stopped`) work as expected. * **role:unattended_upgrades**: Correct README description; the role deactivates Unattended Upgrades by setting both `APT::Periodic` flags to `0` in `/etc/apt/apt.conf.d/20auto-upgrades` (Debian/Ubuntu), it does not remove the `unattended-upgrades` package. @@ -72,7 +73,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * **role:freeipa_client**: Add `meta/argument_specs.yml`. No behaviour change. * **role:haveged, role:libmaxminddb, role:qemu_guest_agent**: README now also explains *what* the underlying tool actually does and when you'd want it (entropy daemon, MaxMind GeoIP reader library, hypervisor-to-guest communication channel) instead of just linking out. * **roles**: README intros across 19 roles (`ansible_init`, `cockpit`, `collect_rpmnew_rpmsave`, `crypto_policy`, `hostname`, `kdump`, `repo_collabora`, `repo_docker`, `repo_gitlab_ce`, `repo_gitlab_runner`, `repo_grafana`, `repo_influxdb`, `repo_mongodb`, `repo_redis`, `selinux`, `snmp`, `sshd`, `timezone`, `unattended_upgrades`) now explain in one or two sentences what the underlying software actually is and when an admin would use it, instead of just naming it. -* **COMPATIBILITY**: Promote the RHEL 10 column from `(x)` (or empty) to `x` (proven) for the 23 roles exercised by `setup_basic` and validated on a RHEL 10 host: `at`, `cloud_init`, `cockpit`, `dnf_makecache`, `hostname`, `icinga2_agent`, `kdump`, `login`, `lvm`, `mailto_root`, `monitoring_plugins`, `motd`, `network`, `python`, `python_venv`, `repo_icinga`, `repo_monitoring_plugins`, `rsyslog`, `selinux`, `system_update`, `systemd_journald`, `timezone`, `tools`. `glances` stays at `(x)` because the package is missing in EPEL 10 (see the role's "Platform Support" section). +* **COMPATIBILITY**: Promote the RHEL 10 column from `(x)` (or empty) to `x` (proven) for the 23 roles exercised by `setup_basic` and validated on a RHEL 10 host: `at`, `cloud_init`, `cockpit`, `dnf_makecache`, `hostname`, `icinga2_agent`, `kdump`, `login`, `lvm`, `mailto_root`, `monitoring_plugins`, `motd`, `network`, `python`, `python_venv`, `repo_icinga`, `repo_monitoring_plugins`, `rsyslog`, `selinux`, `system_update`, `systemd_journald`, `timezone`, `tools`. * **COMPATIBILITY**: `at`, `haveged`, `mod_maxminddb` and `qemu_guest_agent` are now expected to work on Debian 12 / 13 and Ubuntu 22.04 / 24.04 / 26.04 (marked `(x)`: code-reviewed, untested in production). * **role:hostname, role:kdump, role:timezone**: Add `meta/argument_specs.yml` so Ansible validates the role variables (types, choices) at role entry. No behaviour change. * **role:libmaxminddb, role:mod_maxminddb**: Add `meta/argument_specs.yml`. No behaviour change. @@ -86,7 +87,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * **role:apps**: Document that the role uses `ansible.builtin.package` internally, so `state: 'latest'` works on backends that support it. * **role:cloud_init**: README now lists all cleanup actions (`cloud-init` package removal, `/etc/NetworkManager/conf.d/99-cloud-init.conf`, `/etc/cloud/cloud.cfg.rpmsave`). * **role:dnf_versionlock**: README explains the RHEL 7 vs RHEL 8+ backend differences (`yum-plugin-versionlock` vs `dnf-command(versionlock)` and the corresponding lock-list paths). -* **role:glances**: Document the optional `glances__skip_repo_baseos` variable (skip the implicit `repo_baseos` invocation on Rocky 9) and the implicit `repo_epel` / `repo_baseos` dependencies. Add a "Platform Support" section noting that the role currently fails on RHEL 10 / Rocky 10 / Alma 10 because `glances` is not packaged in EPEL 10. +* **role:glances**: Document the optional `glances__skip_repo_baseos` variable (skip the implicit `repo_baseos` invocation on Rocky 9) and the implicit `repo_epel` / `repo_baseos` dependencies. * **role:icingaweb2_module_company**: Document the install-once idempotency (module is installed on first run only; subsequent runs do not overwrite local customizations) and the controller-side download mechanism. * **role:icingaweb2_module_incubator**: Document the controller-side download mechanism and that the directory is overwritten on every run, so changing `icingaweb2_module_incubator__version` is the supported upgrade path. * **role:icingaweb2_module_pdfexport**: Document the controller-side download mechanism and the upgrade-on-rerun behaviour. Add a pointer that runtime dependencies (e.g. a headless browser) have to be installed separately. diff --git a/COMPATIBILITY.md b/COMPATIBILITY.md index 2ff0bc05e..bb7c26aca 100644 --- a/COMPATIBILITY.md +++ b/COMPATIBILITY.md @@ -43,7 +43,7 @@ freeipa_client | | | x | x | x | | | freeipa_server | | | x | x | x | | | | github_project_createrepo | | | x |(x)|(x) | | | | gitlab_ce | | | x |(x)|(x) | | | | -glances |(x) |(x) | x | x |(x) | (x) | (x) | (x) | +glances |(x) |(x) | x | x | x | (x) | (x) | (x) | glpi_agent | | | x | x |(x) | | | | grafana | | | x | x | x | | | | grafana_grizzly |(x) |(x) | x | x |(x) | (x) | (x) | (x) | diff --git a/roles/glances/README.md b/roles/glances/README.md index 79c8e6355..9e4157035 100644 --- a/roles/glances/README.md +++ b/roles/glances/README.md @@ -11,7 +11,7 @@ This role installs [glances](https://nicolargo.github.io/glances/) and drops a s ## Platform Support -`glances` is currently **not packaged in EPEL 10**, so this role fails with `No package glances available.` on RHEL 10 and clones (Rocky / Alma 10). Install glances manually (e.g. via `pip install glances` in a venv, or from a third-party repo) on those hosts and skip this role. +`glances` is not packaged in EPEL 10. On RHEL 10 and clones (Rocky / Alma 10) the role installs glances into a dedicated Python venv at `/opt/python-venv/glances` via pip; on all other supported platforms glances is installed from the distribution package. ## Tags diff --git a/roles/glances/tasks/main.yml b/roles/glances/tasks/main.yml index 969ebb3d1..c4208e48f 100644 --- a/roles/glances/tasks/main.yml +++ b/roles/glances/tasks/main.yml @@ -5,6 +5,21 @@ name: - 'glances' state: 'present' + when: + - 'not (ansible_facts["os_family"] == "RedHat" and ansible_facts["distribution_major_version"] | int >= 10)' + + - name: 'Install glances into a Python venv (RHEL 10+)' + ansible.builtin.include_role: + name: 'linuxfabrik.lfops.python_venv' + vars: + python_venv__venvs__role_var: + - name: 'glances' + packages: + - 'glances' + exposed_binaries: + - 'glances' + when: + - 'ansible_facts["os_family"] == "RedHat" and ansible_facts["distribution_major_version"] | int >= 10' - name: 'Deploy /etc/profile.d/glances.sh' ansible.builtin.template: diff --git a/roles/glances/templates/etc/profile.d/glances.sh.j2 b/roles/glances/templates/etc/profile.d/glances.sh.j2 index 3c0a5906d..7dab40a45 100644 --- a/roles/glances/templates/etc/profile.d/glances.sh.j2 +++ b/roles/glances/templates/etc/profile.d/glances.sh.j2 @@ -1,7 +1,10 @@ # {{ ansible_managed }} # 2022051701 -{% if ansible_facts['distribution'] == 'RedHat' and ansible_facts['distribution_major_version']|int < 8 %} +{% if ansible_facts['os_family'] == 'RedHat' and ansible_facts['distribution_major_version'] | int >= 10 %} +alias top='/opt/python-venv/glances/bin/glances -t 1' +alias glances='/opt/python-venv/glances/bin/glances -t 1' +{% elif ansible_facts['distribution'] == 'RedHat' and ansible_facts['distribution_major_version'] | int < 8 %} alias top='glances -t 1 --disable-docker' alias glances='glances -t 1 --disable-docker' {% else %}