Python for DevOps & System Automation (Artikel 052)
Einsatz von Python zur Automatisierung komplexer Systemaufgaben. Von der API-Interaktion über File-Management bis hin zur Entwicklung robuster DevOps-Tools.
# Python for DevOps: Die Brücke zwischen Bash und Applikation
TL;DR / Management Summary Wenn Bash-Skripte zu komplex werden (über 500 Zeilen) oder massive Datenverarbeitung (JSON/XML) nötig ist, ist Python die Rettung. Dank einer riesigen Standardbibliothek und Modulen wie
requests,pandasoderfabricist Python das Schweizer Taschenmesser für Admins. Es ist lesbar, wartbar und der Standard für die Kommunikation mit modernen Cloud-APIs.
# 1. Einführung & Architektur
Warum Python statt Bash?
- Bash: Ideal für einfache Prozess-Ketten und OS-Kommandos. Schwach bei Datenstrukturen und Fehlerbehandlung.
- Python: Ideal für Logik, API-Integration und Objektorientierung. Bietet echte Fehlerbehandlung (
try/except).
graph LR
A[Bash Script] -->|Simple| B[Cron / Small Tasks]
C[Python Script] -->|Complex| D[API Integrations]
C -->|Complex| E[Data Parsing / Reporting]
C -->|Complex| F[Cross-Platform Tools]
# 2. Best Practices: Saubere Entwicklung
Kein Chaos auf dem Server.
# Virtual Environments (venv)
Installieren Sie niemals Python-Module global mit pip install (Gefahr für das OS-Python!).
sudo apt update && sudo apt install python3-venv
python3 -m venv ~/scripts/.venv
source ~/scripts/.venv/bin/activate
# Jetzt sicher installieren
pip install requests
# Der Safety-Header (Shebang)
#!/usr/bin/env python3
import sys
import os
def main():
# Logik hier
pass
if __name__ == "__main__":
main()
# 3. Praxis-Szenarien
Was Admins täglich brauchen.
# API-Abfragen (Requests)
import requests
def get_pve_status():
response = requests.get("https://proxmox:8006/api2/json/nodes", verify=False)
if response.status_code == 200:
data = response.json()
print(f"Nodes found: {len(data['data'])}")
get_pve_status()
# System-Kommandos sicher ausführen
Statt os.system() nutzen wir subprocess:
import subprocess
def check_disk_usage():
# capture_output=True verhindert Text-Salat im Terminal
result = subprocess.run(["df", "-h", "/"], capture_output=True, text=True)
print(result.stdout)
# 4. Day-2 Operations: Packaging & Deployment
Tools an das Team verteilen.
# Requirements.txt
Halten Sie Abhängigkeiten fest:
pip freeze > requirements.txt
# Auf anderem Server wiederherstellen
pip install -r requirements.txt
# Fehlerbehandlung (E-Mail/Alert)
try:
critical_task()
except Exception as e:
send_alert_to_pagerduty(f"CRITICAL: {str(e)}")
sys.exit(1)
# 5. Troubleshooting & “War Stories”
Wenn das Skript hakt.
# Story 1: “Der Python 2 Geist”
Symptom: Ein Skript funktioniert auf dem Dev-Laptop, aber wirft auf dem Server Syntax-Fehler.
Ursache: Der Aufruf python zeigt auf einem alten Server noch auf Python 2.7.
Lösung: Nutzen Sie immer explizit python3. Prüfen Sie dies im Shebang und im Alias.
# Story 2: “Memory Leak in Long-Running-Scripts”
Symptom: Ein Automatisierungs-Skript, das 24/7 läuft, wird immer langsamer und frisst RAM.
Ursache: Offene Dateihandler oder unkontrollierte Listen-Wachstum.
Lösung: Nutzen Sie Context Manager (with open(...) as f:) und räumen Sie globale Variablen auf.
# 6. Fazit & Empfehlung
- Bash für alles unter 10 Minuten Entwicklungszeit.
- Python für alles, was APIs nutzt oder Fehlerbehandlung braucht.
- Linter: Nutzen Sie
flake8oderpylint, um sauberen Code zu garantieren.
# Anhang: Cheatsheet
| Aufgabe | Modul | Beispiel |
|---|---|---|
| JSON parsen | import json |
json.loads(string) |
| Filesystem | import pathlib |
Path("/tmp").exists() |
| Zeit/Datum | import datetime |
datetime.datetime.now() |
| Argumente | import argparse |
--help Support bauen |
| Remote SSH | import paramiko |
SSH via Python |
| Env Vars | import os |
os.getenv("API_KEY") |
| Performance | import timeit |
Zeit messen |