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 |