--- - name: Prüfe, ob aktueller Zeitpunkt im Maintenance-Window liegt set_fact: now: "{{ lookup('pipe', 'date +%H:%M') }}" window_start: "{{ maintenance_window_start }}" window_end: "{{ maintenance_window_end }}" changed_when: false tags: preflight - name: Maintenance-Window-Check (Abbruch, wenn außerhalb) fail: msg: "Aktuelle Zeit {{ now }} liegt außerhalb des Maintenance-Windows ({{ window_start }} - {{ window_end }}). Upgrade wird abgebrochen!" when: >- ( (window_start < window_end and (now < window_start or now > window_end)) or (window_start > window_end and (now < window_start and now > window_end)) ) tags: preflight - name: Prüfe freien Speicherplatz auf / (mind. 5GB empfohlen) stat: path: / register: root_stat tags: preflight - name: Warnung bei zu wenig Speicherplatz assert: that: - root_stat.stat.avail_bytes > 5368709120 fail_msg: "Wenig freier Speicherplatz auf /: {{ root_stat.stat.avail_bytes | human_readable }} (mind. 5GB empfohlen)" success_msg: "Genügend Speicherplatz auf /: {{ root_stat.stat.avail_bytes | human_readable }}" tags: preflight - name: Prüfe Erreichbarkeit von SUSE Manager uri: url: "{{ suma_api_url }}" method: GET validate_certs: no timeout: 10 register: suma_reachable ignore_errors: true retries: 3 delay: 5 tags: preflight - name: Warnung, wenn SUSE Manager nicht erreichbar assert: that: - suma_reachable.status is defined and suma_reachable.status == 200 fail_msg: "SUSE Manager API nicht erreichbar!" success_msg: "SUSE Manager API erreichbar." tags: preflight - name: Prüfe, ob VMware-Snapshot-Modul verfügbar ist shell: "python3 -c 'import pyVmomi'" register: pyvmomi_check ignore_errors: true changed_when: false tags: preflight - name: Warnung, wenn pyVmomi nicht installiert ist assert: that: - pyvmomi_check.rc == 0 fail_msg: "pyVmomi (VMware-Modul) nicht installiert!" success_msg: "pyVmomi ist installiert." tags: preflight - name: Prüfe, ob aktueller SUSE Manager Channel synchronisiert ist uri: url: "{{ suma_api_url }}" method: POST body_format: json headers: Content-Type: application/json body: | { "method": "auth.login", "params": ["{{ suma_api_user }}", "{{ suma_api_pass }}"], "id": 1 } validate_certs: no timeout: 20 register: suma_api_login ignore_errors: true retries: 3 delay: 10 async: 60 poll: 0 tags: preflight - name: Hole Channel-Details für Ziel-CLM-Version uri: url: "{{ suma_api_url }}" method: POST body_format: json headers: Content-Type: application/json body: | { "method": "channel.software.getDetails", "params": ["{{ suma_api_login.json.result }}", "{{ target_clm_version }}"], "id": 2 } validate_certs: no timeout: 20 register: suma_channel_details ignore_errors: true retries: 3 delay: 10 async: 60 poll: 0 tags: preflight - name: Prüfe Channel-Sync-Status assert: that: - suma_channel_details.json.result.last_sync is defined fail_msg: "Channel {{ target_clm_version }} ist nicht synchronisiert!" success_msg: "Channel {{ target_clm_version }} wurde zuletzt synchronisiert am {{ suma_channel_details.json.result.last_sync }}." tags: preflight - name: Slack-Benachrichtigung bei kritischen Fehlern (Beispiel) slack: token: "{{ slack_token | default('xoxb-...') }}" msg: "[CRITICAL] Fehler beim Preflight-Check auf {{ inventory_hostname }}: {{ ansible_failed_result.msg | default('Unbekannter Fehler') }}" channel: "#linux-admins" when: slack_enabled | default(false) and (ansible_failed_result is defined and ansible_failed_result is not none) ignore_errors: true tags: preflight