Uyuni Ansible-Collection
Wenn es darum geht, größere Systemlandschaften zu verwalten, sind SUSE Manager und das Open-Source Upstream-Projekt Uyuni nützliche Tools. Sie können dazu verwendet werden, um neue Systeme aufzusetzen, Patches zu verteilen und unterstützen auch Infrastructure as Code mittels SaltStack.
Im Rahmen von Kund:innenprojekten habe ich zahlreiche Installationen und Konfigurationen vorgenommen und so nach einer Automatisierung gesucht. Zum einen um meinen Arbeitsaufwand zu reduzieren (um mehr Zeit dafür zu haben, Katzenvideos zu schauen) - zum anderen um Flüchtigkeitsfehler zu verhindern. Das Uyuni-Projekt stellt hierfür ein Salt-Formula zur Verfügung - aber die meisten Kund:innen setzen faktisch auf Ansible. Uyuni bietet ebenfalls eine rudimentäre Ansible-Integration, um verwaltete Client-Systeme mit Ansible zu steuern. Ich habe aber nach genau dem umgekehrten Weg gesucht: um Uyuni via Ansible zu installieren und zu steuern.
Aus dieser Anforderung heraus entstand in den letzten Monaten eine Ansible Collection, die verschiedene Rollen beinhaltet:
storage
- Vorbereitung des Speichers für den Uyuni-Serverserver
- Installation und Konfiguration des Serversclient
- Registrieren von Client-Systemen
Dieses Thema wurde auf auch auf der SUSECON 2023 (📽️) vorgestellt.
Rollen
Ein vollständiger Uyuni-Server kann so mit Ansible in unter 10 Minuten bereitgestellt werden:
1---
2- name: Install Uyuni
3 hosts: uyuni.giertz.loc
4 become: true
5 roles:
6 - role: stdevel.uyuni.server
Zur Installation von SUSE Manager müssen lediglich die Registrierungscode und SCC-Mail (SUSE Customer Center) ergänzt werden:
1---
2- name: Install SUSE Manager
3 hosts: suma.giertz.loc
4 become: true
5 roles:
6 - role: stdevel.uyuni.server
7 uyuni_scc_reg_code: DERP1337LULZ
8 uyuni_scc_mail: simone@gier.tz
Die Rolle bietet noch weitere Parameter, beispielsweise zur Konfiguration von Software-Kanälen via spacewalk-common-utils
oder Monitoring:
1---
2- name: Install Uyuni
3 hosts: uyuni.giertz.loc
4 become: true
5 roles:
6 - role: stdevel.uyuni.server
7 uyuni_channels:
8 - name: almalinux9
9 arch: x86_64
10 - name: almalinux9-appstream
11 arch: x86_64
12 uyuni_enable_monitoring: true
13 uyuni_install_monitoring_formulas: true
Sofern Software-Kanäle synchronisiert wurden, lassen sich Clients wie folgt registrieren:
1- hosts: clients
2 become: true
3 roles:
4 - role: stdevel.uyuni.client
5 uyuni_server: uyuni.giertz.loc
Module
Die Collection beinhaltet verschiedene Module, um Uyuni-Funktionen aus Ansible heraus auszuführen:
install_patches
- Installation von Patchesinstall_upgrades
- Installation von Paket-Upgradesopenscap_run
- Ausführen von OpenSCAP-Checksreboot_host
- Neustarten des Hosts
So lässt sich beispielsweise ein vollständer Patch-Zyklus in Ansible abbilden:
1- name: Installing patches
2 stdevel.uyuni.install_patches:
3 uyuni_host: 192.168.1.10
4 uyuni_user: admin
5 uyuni_password: admin
6 name: chad.giertz.loc
7 exclude_patches:
8 - openSUSE-2022-10013
9 - openSUSE-SLE-15.3-2022-2118
10
11- name: Check compliance
12 stdevel.uyuni.openscap_run:
13 uyuni_host: 192.168.1.10
14 uyuni_user: admin
15 uyuni_password: admin
16 name: chad.giertz.loc
17 document: /opt/scap-yast2sec-xccdf.xml
18 arguments: --profile Default
19
20- name: Reboot host
21 stdevel.uyuni.reboot_host:
22 uyuni_host: 192.168.1.10
23 uyuni_user: admin
24 uyuni_password: admin
25 name: chad.giertz.loc
Dynamic Inventory
Sobald Systeme installiert und mit Uyuni verwaltet werden, können diese mit dem Dynamic Inventory-Plugin aus Ansible heraus angesprochen werden. Damit entfällt die Notwendigkeit, ein Inventory manuell zu pflegen - was, je nach Systemlandschaft, einen hohen Aufwand darstellen würde.
Dazu muss eine Konfigurationsdatei mit .uyuni.yml
-Postfix angelegt werden. Diese definiert die Zugangsdaten zum Uyuni-System:
1plugin: stdevel.uyuni.inventory
2host: 192.168.1.10
3user: admin
4password: admin
5verify_ssl: false
Weitere Parameter erlauben das Anzeigen von Custom System Information und IPv6-Adressen sowie das Filtern nach Gruppen und benötigtem Reboot:
1plugin: stdevel.uyuni.inventory
2host: 192.168.1.10
3user: admin
4password: admin
5verify_ssl: false
6show_custom_values: true
7pending_reboot_only: true
8ipv6_only: true
9groups:
10 - dev
11 - demo
Anschließend lässt sich das Inventory benutzen - beispielsweise mit ansible-inventory
, um die Funktionsfähigkeit zu überprüfen:
1$ ansible-inventory homelab.uyuni.yml --list
2{
3 "Test": {
4 "hosts": [
5 "uyuni-client-opensuse-leap15"
6 ]
7 },
8 "_meta": {
9 "hostvars": {
10 "uyuni-client-opensuse-leap15": {
11 "ansible_host": "192.168.1.2",
12 "susecon23_system": "1"
13 }
14 }
15 }
16 ...
17}
Ausblick
In Zusammenhang mit weiteren Ansible-Collections lässt sich so ein kompletter Wartungszyklus vollständig automatisieren, z.B. wie folgt:
- Anlegen von VM-Snapshots
- Erstellen von Monitoring-Downtimes
- Installation von Patches und Neustarten des Systems
- Testen der Anwendung
- Entfernen von Snapshots und Downtimes
Feedback ist willkommen! Auf GitHub sind bereits weitere Funktionsideen vermerkt.