Python für die Automation im Alltag
Kleine Python-Tools, die Stunden sparen, von Cloud-Reinigung bis zu Kubernetes-Berichten.
Kleine Python-Tools, die Stunden sparen, von Cloud-Reinigung bis zu Kubernetes-Berichten.

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.
azure-identity und Dienstleistungsschutzprogramme; Google Cloud hat google-cloud-* (Bildschriften und Bibliotheken)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.
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:
--delete, und dann auch noch um Bestätigung bittet.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.
Wenn ein Drehbuch zu etwas wird, auf das sich das Team verlassen kann:
uv tool install.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