Ein WSUS-Server ist zwar nützlich, kann jedoch beträchtliche Ressourcen beanspruchen, oft langsam reagieren und erfordert zudem erheblichen Wartungsaufwand oder zusätzliche Software zur Instandhaltung. Eine effizientere Lösung bietet die Nutzung von Ansible zur Abfrage von Updates. Mit diesem Playbook kannst Du auf jedem Host nach Updates suchen und diese strukturiert in einer Statusmail auflisten.

Voraussetzungen

Bevor Du dieses Playbook verwenden kannst, stelle sicher, dass die folgenden Voraussetzungen erfüllt sind:

  1. Ansible installiert: Auf Deinem Steuerungsrechner (Controller) muss Ansible installiert sein.
  2. Windows-Hosts konfiguriert: Die Windows-Hosts müssen für die Verwaltung durch Ansible konfiguriert sein. Dies umfasst die Einrichtung der WinRM-Verbindung. Ist dies nicht der Fall geht es hier zur offiziellen Ansible Doku.
  3. PSWindowsUpdate-Modul: Das PSWindowsUpdate-Modul muss auf den Windows-Hosts verfügbar sein. Falls nicht, installiert das Playbook dieses Modul automatisch.
  4. SMTP-Server: Ein funktionierender SMTP-Server muss konfiguriert sein, um die Status-E-Mail zu versenden.
  5. E-Mail-Einstellungen: Die E-Mail-Einstellungen (SMTP-Server, Port, Absender- und Empfängeradresse) müssen korrekt im Playbook angegeben werden.
  6. Berechtigungen: Der Benutzer, der das Playbook ausführt, benötigt die entsprechenden Berechtigungen, um Änderungen auf den Windows-Hosts vorzunehmen und E-Mails zu versenden.
# Ansible-Playbook, um sicherzustellen, dass das PSWindowsUpdate-Modul auf Windows-Hosts installiert ist,
# ausstehende Updates zu überprüfen, den Update-Status zu protokollieren und einen konsolidierten Bericht per E-Mail zu senden.

- hosts: all
  vars:
    # Definiert den Pfad zur E-Mail-Berichtsdatei
    email_report_file: "/tmp/linux_email_report.txt"

  tasks:
    - name: E-Mail-Berichtsdatei initialisieren
      copy:
        # Erstellt oder überschreibt die E-Mail-Berichtsdatei mit leerem Inhalt
        content: ""
        dest: "{{ email_report_file }}"
      delegate_to: localhost
      run_once: true

    - name: Sicherstellen, dass das PSWindowsUpdate-Modul installiert ist
      win_shell: |
        # Überprüft, ob das PSWindowsUpdate-Modul installiert ist, und installiert es bei Bedarf
        if (-not (Get-Module -ListAvailable -Name PSWindowsUpdate)) {
          Install-Module -Name PSWindowsUpdate -Force -AllowClobber
        }
      register: module_update
      ignore_errors: true

    - name: PSWindowsUpdate-Modul importieren und nach Updates suchen
      win_shell: |
        # Importiert das PSWindowsUpdate-Modul und erhält eine Liste der ausstehenden Updates
        Import-Module PSWindowsUpdate
        $Updates = Get-WindowsUpdate -MicrosoftUpdate -AcceptAll -IgnoreReboot
        $UpdateTitles = $Updates | ForEach-Object { $_.Title }
        $UpdateTitles -join "`n"
      register: update_titles
      ignore_errors: true

    - name: Update-Titel mit richtiger Formatierung protokollieren
      lineinfile:
        # Protokolliert den Hostnamen und die Liste der ausstehenden Updates im HTML-Format
        path: "{{ email_report_file }}"
        line: |
          <b>{{ inventory_hostname }}</b> | Ausstehende Updates:
          {{ update_titles.stdout | regex_replace('`n', '<br>') }}
      delegate_to: localhost

# Aufgabe zum Lesen des konsolidierten E-Mail-Berichts und Senden per E-Mail

- hosts: localhost
  gather_facts: no
  vars:
    # Definiert den Pfad zur E-Mail-Berichtsdatei
    email_report_file: "/tmp/linux_email_report.txt"

  tasks:
    - name: E-Mail-Bericht aus Datei lesen
      slurp:
        # Liest den Inhalt der E-Mail-Berichtsdatei
        src: "{{ email_report_file }}"
      register: email_content

    - name: E-Mail-Inhalt dekodieren und HTML-E-Mail-Body vorbereiten
      set_fact:
        # Dekodiert den Inhalt von Base64 und formatiert ihn als HTML
        email_body: "<p>Hier ist der Statusbericht für die Server-Updates:</p><p>{{ (email_content.content | b64decode).splitlines() | join('<br>') }}</p>"

    - name: Status-E-Mail senden, nachdem alle Hosts aktualisiert wurden
      mail:
        # Sendet die E-Mail mit dem konsolidierten Bericht
        host: dein-mail-server.com
        port: 25
        from: ansible@example.com
        to: dein-email@example.com
        subject: "Server Update Status"
        subtype: html
        body: "{{ email_body }}"
        charset: utf8

Fehlerbehebung

WinRM ist oft zickig und nicht auf allen Windows Versionen gleich. Sollten einzelne Server Fehler zurückmelden ist der einfachste Weg die Befehle welche Ansible ausführt manuell auf dem fehlerhaften Host auszuführen und zu schauen wo es hakt.

Überprüfen, ob das PSWindowsUpdate-Modul installiert ist:

Get-Module -ListAvailable -Name PSWindowsUpdate

Installieren des PSWindowsUpdate-Moduls:

Install-Module -Name PSWindowsUpdate -Force -AllowClobber

Importieren des PSWindowsUpdate-Moduls und Suchen nach Updates:

Import-Module PSWindowsUpdate
Get-WindowsUpdate -MicrosoftUpdate -AcceptAll -IgnoreReboot

🤞 1x pro Monat unsere News, Tipps und Tutorials gebündelt direkt in dein Postfach!

Wir senden keinen Spam! Erfahre mehr in unserer Datenschutzerklärung.


Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.