linux-rhel-centos-fedora automation python rhel libvirt selinux api

Python for RHEL Administration: Libs & Bindings (Artikel 114)

Fortgeschrittene Systemadministration mit Python unter RHEL. Einsatz von nativen Bindings zur Steuerung von SELinux, Libvirt und Firewalld direkt aus Python-Code.

# Python on RHEL: Tiefe System-Integration für DevOps

TL;DR / Management Summary In der RHEL-Welt (Red Hat Enterprise Linux) ist Python mehr als nur eine Skriptsprache – es ist die Basis des Betriebssystems. Viele System-Tools (DNF, Cockpit, Anaconda) sind in Python geschrieben. Ein Senior Admin nutzt die nativen RHEL Python Bindings, um komplexe Aufgaben wie das Management von SELinux-Policies, das Steuern von KVM-VMs via Libvirt oder die Manipulation der Firewall direkt und performant aus Python-Code heraus zu lösen.


# 1. Einführung & Architektur

Die Python-Abhängigkeit.

RHEL setzt massiv auf Python. Der System-Default (/usr/bin/python3) ist heilig und sollte niemals durch manuelle Installationen (z.B. Conda oder Source-Builds) korrumpiert werden.

# Die Bindings-Schicht (Mermaid)

graph LR
    A[Python Script] --> B[libselinux-python]
    A --> C[libvirt-python]
    A --> D[python3-firewall]
    B --> E[SELinux Kernel]
    C --> F[Hypervisor / KVM]
    D --> G[firewalld Daemon]

# 2. SELinux-Steuerung via Python

Automatisierung der Sicherheit.

Mit dem Modul selinux können Sie den Status abfragen und Labels prüfen, ohne Text-Outputs von Shell-Befehlen parsen zu müssen.

import selinux

# Status abfragen
if selinux.is_selinux_enabled():
    print(f"SELinux is active in {selinux.selinux_getenforcemode()[1]} mode.")

# Kontext einer Datei prüfen
status, context = selinux.getfilecon('/etc/shadow')
print(f"Context of shadow: {context}")

# 3. Libvirt & Virtualisierung

VM-Management per Code.

Anstatt virsh aufzurufen, nutzen wir das libvirt Modul für stabilere Automatisierung.

import libvirt

conn = libvirt.open('qemu:///system')
if conn == None:
    print('Failed to open connection to qemu:///system')
    exit(1)

# Liste aller laufenden VMs
domains = conn.listDomainsID()
for domain_id in domains:
    dom = conn.lookupByID(domain_id)
    print(f"Running VM: {dom.name()} (ID: {domain_id})")

conn.close()

# 4. Day-2 Operations: Firewalld-API

Dynamische Firewall-Änderungen.

RHEL bietet das Modul firewall, um direkt mit dem DBus-Interface von firewalld zu sprechen.

from firewall.client import FirewallClient

fw = FirewallClient()
# Prüfen, ob ein Port in einer Zone offen ist
is_open = fw.queryPort("public", "tcp", 80)
print(f"Is Port 80 open in public zone? {is_open}")

# 5. Troubleshooting & “War Stories”

Wenn die Bindings fehlen.

# Story 1: “Der fehlende Import”

Symptom: Ein Skript wirft ModuleNotFoundError: No module named 'libvirt', obwohl Python installiert ist. Ursache: Die RHEL-System-Bibliotheken werden nicht via pip, sondern via dnf installiert. Lösung: sudo dnf install python3-libvirt. Suchen Sie immer erst in den RHEL-Repos nach python3-<name>.

# Story 2: “Virtualenv Isolation”

Symptom: In einem venv funktionieren die System-Module (wie selinux) nicht. Ursache: Ein Standard-Virtualenv isoliert den User-Code komplett vom System-Python. Lösung: Erstellen Sie das Virtualenv mit Zugriff auf die System-Packages: python3 -m venv --system-site-packages my-admin-env.


# 6. Fazit & Empfehlung

  • RHEL Standards: Nutzen Sie DNF-Pakete für System-Libraries.
  • Sicherheit: Führen Sie Skripte, die SELinux oder Firewalld ändern, immer unter einem dedizierten Service-Account mit Sudo-Rechten aus.
  • Performance: Native Bindings sind deutlich schneller als der Aufruf von subprocess.run(["nmcli", ...]).

# Anhang: Cheatsheet

Modul DNF Paket Zweck
selinux python3-libselinux SELinux Management
libvirt python3-libvirt Virtualisierung (KVM)
firewall python3-firewall Firewalld Steuerung
rpm python3-rpm RPM Datenbank-Zugriff
dnf python3-dnf DNF Library (API v2)
nmclient python3-NetworkManager Netzwerk Steuerung