Text size
Ausprobiert & getestet6 Min. Lesezeit

Python für die Automation im Alltag

Kleine Python-Tools, die Stunden sparen, von Cloud-Reinigung bis zu Kubernetes-Berichten.

Python for everyday automation
KI-generierte Illustration

Wenn ein Bash-Skript über 100 Zeilen wächst oder mit einer API kommunizieren muss, wechsle ich zu Python. Es ist lesbar, es hat eine Bibliothek für fast alles, und Kollegen können es verstehen, ohne eine Entschlüsselungssitzung.

Man muss kein Software-Ingenieur sein, um nützliche Python für DevOps zu schreiben. Ein paar Bibliotheken und Gewohnheiten decken das meiste ab, was Sie brauchen.

Die Bibliotheken, die ich benutze

  • Boto3Das AWS SDK. Alles in AWS ist von dort aus erreichbar. (Azure hat azure-identity und Dienstleistungsschutzprogramme; Google Cloud hat google-cloud-* (Bildschriften und Bibliotheken)
  • KürbungenDer offizielle Kubernetes-Client.
  • httppx oder Anträge: Aufrufen von REST-APIs.
  • Typ oder Klicken: Erstellen von Befehlszeilenwerkzeugen mit Argumenten und Hilfetext.
  • reich: schöne Tische, Farben und Fortschrittsbalken im Terminal.
  • Pydantisch: Validierung der Konfiguration und der Daten.
  • PYYAML / Ruamel.yaml: Lesen und Schreiben von YAML.
  • Beharrlichkeit: Wiederholung von Versuchen mit Backoff für schuppige APIs.

Verpackung mit UV

Python-Packaging war früher schmerzhaft: virtuelle Umgebungen, Pip, Anforderungendateien, Versionskonflikte. u, von Astral, hat es dramatisch einfacher und schneller gemacht.

uv init cloud-tools
cd cloud-tools
uv add boto3 typer rich
uv run python main.py

Mein Lieblingsmerkmal für kleine Schriften: Inline-Abhängigkeiten- Ich weiß . Sie können Abhängigkeiten oben in einer einzigen Datei deklarieren, und uv run automatisch mit der Umgebung umgeht:

# /// script
# requires-python = ">=3.12"
# dependencies = ["boto3", "typer", "rich"]
# ///

Dann kann jeder rennen . uv run cleanup.py ohne irgendetwas zu arrangieren. Perfekt, um kleine Werkzeuge in einem Team zu teilen.

Das beste Automatisierungs-Skript ist das, das ein Kollege morgen ausführen kann, ohne Sie zu fragen, wie.

Beispiel: Finden von ungenutzten Cloud-Ressourcen

Ein Beispiel aus der realen Welt: Suche nach nicht angeschlossenen EBS-Volumen (eine klassische Abfallquelle) und lösche sie optional.

# /// script
# requires-python = ">=3.12"
# dependencies = ["boto3", "typer", "rich"]
# ///
import boto3
import typer
from rich.console import Console
from rich.table import Table

app = typer.Typer()
console = Console()


@app.command()
def unattached_volumes(
    region: str = "eu-central-1",
    delete: bool = typer.Option(False, help="Actually delete the volumes"),
):
    """List (and optionally delete) unattached EBS volumes."""
    ec2 = boto3.client("ec2", region_name=region)
    paginator = ec2.get_paginator("describe_volumes")
    pages = paginator.paginate(Filters=[{"Name": "status", "Values": ["available"]}])

    table = Table("Volume ID", "Size (GiB)", "Created", "Name")
    volumes = []
    for page in pages:
        for v in page["Volumes"]:
            name = next((t["Value"] for t in v.get("Tags", []) if t["Key"] == "Name"), "-")
            table.add_row(v["VolumeId"], str(v["Size"]), v["CreateTime"].date().isoformat(), name)
            volumes.append(v["VolumeId"])

    console.print(table)
    console.print(f"[bold]{len(volumes)}[/bold] unattached volumes in {region}")

    if delete and volumes and typer.confirm("Delete all of them?"):
        for vol_id in volumes:
            ec2.delete_volume(VolumeId=vol_id)
            console.print(f"Deleted {vol_id}")


if __name__ == "__main__":
    app()

Beachten Sie einige Gewohnheiten:

  • Seitenauflage: AWS-APIs geben Ergebnisse in Seiten zurück. Verwenden Sie immer Paginatoren, sonst sehen Sie nur die erste Seite.
  • Standardeinstellung für TrockenlaufEs gibt nur eine Liste , wenn du nicht bestanden hast . --delete, und dann auch noch um Bestätigung bittet.
  • Lesbarer Ausgang Mit einem Tisch.

Beispiel: ein Kubernetes-Bericht

Welche Kapseln haben keine Ressourcenanfragen? Eine Frage, die oft auftaucht:

from kubernetes import client, config

config.load_kube_config()  # or load_incluster_config() inside a pod
v1 = client.CoreV1Api()

for pod in v1.list_pod_for_all_namespaces().items:
    for c in pod.spec.containers:
        requests = (c.resources and c.resources.requests) or {}
        if "cpu" not in requests or "memory" not in requests:
            print(f"{pod.metadata.namespace}/{pod.metadata.name} [{c.name}] missing requests")

Zehn Zeilen und Sie haben einen Bericht, den Sie jede Woche in der Informatik veröffentlichen können.

Gewohnheiten für Automatisierungsskripte

  • Standardeinstellung für Trockenlauf für alles, was zerstörerisch ist.
  • Verwenden Sie die Standard-Zertifikatskette (Umgebung, Profile, SSO, Instanzrollen) Nie Hardcode-Anmeldeinformationen.
  • - Was machst du ?, mit genügend Details, um es später zu rekonstruieren.
  • Fehler und erneute Versuche für Netzwerkanrufe.
  • Hinweise auf Typ hinzufügen und einen Linter und Formatter laufen lassen (Ruff ist schnell und macht beides).
  • Schreib einen kleinen Test . für die Logik, die zählt.
  • Setzen Sie es in Git., mit einem README, das erklärt, was es tut und wie es ausgeführt wird.

Von Skript zu Werkzeug

Wenn ein Drehbuch zu etwas wird, auf das sich das Team verlassen kann:

  • Gib ihm eine richtige CLI mit Typper und Hilfe Text.
  • Verpacken Sie es mit UV, damit es mit uv tool install.
  • Führen Sie es in CI oder als Kubernetes CronJob aus, anstatt von Laptops.
  • Überlegen Sie, ob Sie es als Teil Ihrer Plattform oder als Betreiber nutzen.

Also, wo fange ich an?

Wählen Sie eine wiederholende Aufgabe aus, die Sie jede Woche machen, wie Ressourcen bereinigen, einen Bericht erstellen oder Zertifikate überprüfen. Schreiben Sie ein kleines Python-Skript mit UVs Inline-Dependenzen. Teilen Sie es. Sie werden überrascht sein, wie schnell das Team um mehr bittet.

Meine Meinung: Python verwandelt "Ich mache es manuell, es dauert nur zehn Minuten" in "es läuft jede Nacht und niemand denkt mehr daran".

Desly