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:
- Ansible installiert: Auf Deinem Steuerungsrechner (Controller) muss Ansible installiert sein.
- 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.
- PSWindowsUpdate-Modul: Das PSWindowsUpdate-Modul muss auf den Windows-Hosts verfügbar sein. Falls nicht, installiert das Playbook dieses Modul automatisch.
- SMTP-Server: Ein funktionierender SMTP-Server muss konfiguriert sein, um die Status-E-Mail zu versenden.
- E-Mail-Einstellungen: Die E-Mail-Einstellungen (SMTP-Server, Port, Absender- und Empfängeradresse) müssen korrekt im Playbook angegeben werden.
- 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
Schreibe einen Kommentar