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-Server
  • server - Installation und Konfiguration des Servers
  • client - Registrieren von Client-Systemen
Hinweis

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 Patches
  • install_upgrades - Installation von Paket-Upgrades
  • openscap_run - Ausführen von OpenSCAP-Checks
  • reboot_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.

Übersetzungen: