# 06 — Ansible-Automatisierung ## Konzept **Ansible legt keine Crons in den Containern an.** Stattdessen: 1. Auf dem **Proxmox-Host** existiert ein **Cron-Job** (wöchentlich) 2. Der Cron startet ein **Shell-Script** 3. Das Script führt **`ansible-playbook`** aus 4. Ansible verbindet sich per **SSH** zu den CTs und führt Wartungs-Tasks aus ``` /etc/cron.weekly/pve-lxc-disk-maintenance ↓ (Symlink) /root/ansible/run-disk-maintenance.sh ↓ ansible-playbook playbooks/disk-maintenance.yml ↓ SSH docker (101) · media (109) · AIDEV (110) ``` ## Verzeichnisstruktur ``` /root/ansible/ ├── ansible.cfg ├── run-disk-maintenance.sh → von cron.weekly aufgerufen ├── inventory/ │ ├── hosts.yml → Hosts + CT-spezifische Variablen │ └── group_vars/all.yml → globale Schwellwerte ├── playbooks/ │ └── disk-maintenance.yml └── roles/ └── disk_cleanup/ ├── defaults/main.yml ├── tasks/main.yml └── handlers/main.yml ``` ## Verwaltete Hosts | Ansible-Host | VMID | IP | Besonderheiten | |--------------|------|-----|----------------| | docker | 101 | 192.168.10.101 | Frigate-Pfade auf `/mnt/records` | | media | 109 | 192.168.20.6 | Jellyfin-Cache-Pfad | | aidev | 110 | 10.100.2.13 | Dev-Tooling optional | SSH als `root` vom Proxmox-Host — Key-Auth war bereits eingerichtet. ## Was das Playbook macht | Task | Beschreibung | |------|--------------| | Journal | `journalctl --vacuum-size=200M` | | apt | `autoclean` / `autoremove` / `clean` | | Docker-Logs | Dateien >50 MB auf 10 MB kürzen | | Docker | Gestoppte Container (>7 T.), dangling Images, Build-Cache (>14 T.) | | Docker-Volumes | Nur **dangling** Volumes | | daemon.json | Log-Limits `10m` × `3` — nur wenn Datei noch nicht existiert | | fstrim | `/` im Container (**wichtig für Thin-Pool**) | | Frigate | Aufnahme-Ordner älter als 30 Tage löschen | | Jellyfin | Cache-Dateien älter als 30 Tage löschen | ### Tags (optional) ```bash # Alles (Standard) ansible-playbook playbooks/disk-maintenance.yml # Nur aggressive Image-Bereinigung zusätzlich ansible-playbook playbooks/disk-maintenance.yml --tags aggressive # Nur Frigate oder Jellyfin ansible-playbook playbooks/disk-maintenance.yml --tags frigate ansible-playbook playbooks/disk-maintenance.yml --tags jellyfin ``` ## Cron ```bash ls -la /etc/cron.weekly/pve-lxc-disk-maintenance # → Symlink nach /root/ansible/run-disk-maintenance.sh ``` - **Intervall:** `cron.weekly` (typisch Sonntag morgens) - **Log:** `/var/log/pve-lxc-disk-maintenance.log` ### Cron deaktivieren ```bash rm /etc/cron.weekly/pve-lxc-disk-maintenance ``` ### Cron auf täglich umstellen (Beispiel) ```bash echo '0 3 * * * root /root/ansible/run-disk-maintenance.sh' > /etc/cron.d/pve-lxc-disk-maintenance ``` ## Konfiguration anpassen Globale Werte: `/root/ansible/inventory/group_vars/all.yml` ```yaml journal_max_size: 200M docker_prune_stopped_containers_older_than: 168h # 7 Tage docker_prune_unused_images_older_than: 336h # 14 Tage (Tag: aggressive) frigate_recordings_retain_days: 30 jellyfin_cache_max_age_days: 30 fstrim_enabled: true ``` Host-spezifisch in `inventory/hosts.yml` (z. B. Frigate-Pfade nur auf `docker`). ## Voraussetzungen - **Ansible** auf dem Proxmox-Host installiert (`apt install ansible`) - **SSH** vom Host zu den CTs als root - CTs müssen laufen (für SSH) ## Manuell testen ```bash /root/ansible/run-disk-maintenance.sh # oder cd /root/ansible && ansible-playbook playbooks/disk-maintenance.yml ```