Windows-Updates mit Ansible automatisieren
In diesem Blogbeitrag zeige ich Dir, wie Du ein Ansible Playbook erstellst, um Windows-Updates auf Deinen Systemen anzuwenden. Dieses Playbook ermöglicht es Dir, automatisiert Sicherheits- und Systemupdates auf allen Windows-Clients und -Servern zu installieren.
Einführung
Ansible ist ein mächtiges Tool zur Automatisierung von IT-Prozessen, und mit diesem Playbook kannst Du sicherstellen, dass Deine Windows-Systeme stets auf dem neuesten Stand sind. Das Playbook sorgt dafür, dass notwendige Updates installiert und erforderliche Neustarts durchgeführt werden.
Aufbau des Playbooks
Allgemeine Struktur
Das Playbook ist so aufgebaut, dass es auf allen angegebenen Hosts (in diesem Fall Windows-Rechner) ausgeführt wird. Es sammelt zunächst Fakten über die Systeme und überprüft dann, ob ein Neustart erforderlich ist, bevor es mit der Installation der Updates fortfährt.
Variablen und Aufgaben
Variable für Neustart-Bedarf
vars:
initial_reboot: |-
{{ 86400 <
(( ((ansible_date_time.date+" "+ansible_date_time.time)|to_datetime('%Y-%m-%d %H:%M:%S')) -
ansible_facts.lastboot|to_datetime('%Y-%m-%d %H:%M:%SZ')).total_seconds())|abs }}
````
Diese Variable überprüft, ob die Systemlaufzeit länger als ein Tag ist. Wenn ja, wird ein Neustart vor der Update-Installation empfohlen.
---
#### Systeme neu starten bei hoher Betriebszeit
```yaml
- name: Neustart, wenn das System eine hohe Betriebszeit hat
win_reboot:
when: initial_reboot and not ansible_check_mode
tags:
- never
- reboot
Hier wird das System neu gestartet, falls es eine hohe Betriebszeit hat, um sicherzustellen, dass das System frisch ist, bevor Updates angewendet werden.
Updates suchen und installieren
- block:
- name: >
{{ 'Install' if 'install' in ansible_run_tags else 'Search' }} updates
{{ 'will automatically reboot' if 'reboot' in ansible_run_tags else 'no reboot' }}
win_updates:
category_names:
- SecurityUpdates
- CriticalUpdates
- UpdateRollups
- DefinitionUpdates
- Updates
reboot: "{{ 'yes' if 'reboot' in ansible_run_tags else 'no' }}"
state: "{{ 'installed' if 'install' in ansible_run_tags else 'searched' }}"
become: yes
become_method: runas
become_user: SYSTEM
register: update_results
tags:
- never
- install
- check
Diese Aufgabe sucht nach den angegebenen Updates und installiert sie, falls erforderlich. Der Parameter reboot bestimmt, ob das System nach der Installation automatisch neu gestartet wird.
Fehlerbehandlung bei fehlgeschlagenen Updates
rescue:
- name: Windows-Update fehlgeschlagen?
debug:
msg: "Fehler: {{ update_results.msg }}"
when: update_results is failed and update_results.msg is defined
tags:
- always
Falls die Updates fehlschlagen, wird hier eine Fehlermeldung ausgegeben.
Erneuter Neustart bei ausstehenden Updates
- name: Server hatte ausstehende Neustarts?
win_reboot:
when: not ansible_check_mode and
update_results is failed and
update_results.msg is search('A reboot is required')
tags:
- never
- reboot
Wenn ein Neustart erforderlich ist, wird dieser hier ausgeführt.
Ergebnisse melden
always:
- name: Ergebnisse melden
debug:
var: update_results
tags:
- never
- install
- check
Am Ende werden die Ergebnisse der Update-Installation gemeldet.
Das gesamte Playbook
---
# BESCHREIBUNG
# Windows-Updates anwenden
- name: Windows-Updates anwenden
hosts: all
gather_facts: yes
vars:
initial_reboot: |-
{{ 86400 <
(( ((ansible_date_time.date+" "+ansible_date_time.time)|to_datetime('%Y-%m-%d %H:%M:%S')) -
ansible_facts.lastboot|to_datetime('%Y-%m-%d %H:%M:%SZ')).total_seconds())|abs }}
tasks:
# Systeme neu starten, wenn die Betriebszeit länger als ein Tag ist
# auf diese Weise wissen wir, dass das System wieder hochgefahren ist
# bevor Updates angewendet wurden
- name: Neustart, wenn das System eine hohe Betriebszeit hat
win_reboot:
when: initial_reboot and not ansible_check_mode
tags:
- never
- reboot
- block:
- name: >
{{ 'Install' if 'install' in ansible_run_tags else 'Search' }} updates
{{ 'will automatically reboot' if 'reboot' in ansible_run_tags else 'no reboot' }}
win_updates:
category_names:
- SecurityUpdates
- CriticalUpdates
- UpdateRollups
- DefinitionUpdates
- Updates
reboot: "{{ 'yes' if 'reboot' in ansible_run_tags else 'no' }}"
state: "{{ 'installed' if 'install' in ansible_run_tags else 'searched' }}"
become: yes
become_method: runas
become_user: SYSTEM
register: update_results
tags:
- never
- install
- check
rescue:
- name: Windows-Update fehlgeschlagen?
debug:
msg: "Fehler: {{ update_results.msg }}"
when: update_results is failed and update_results.msg is defined
tags:
- always
- name: Server hatte ausstehende Neustarts?
win_reboot:
when: not ansible_check_mode and
update_results is failed and
update_results.msg is search('A reboot is required')
tags:
- never
- reboot
always:
- name: Ergebnisse melden
debug:
var: update_results
tags:
- never
- install
- check
Nutzung und Beispielbefehle
Um dieses Ansible Playbook für die Installation von Windows-Updates zu nutzen, musst Du sicherstellen, dass Ansible korrekt konfiguriert ist und Deine Windows-Hosts erreichbar sind.
Updates nur prüfen (kein Installieren)
ansible-playbook -i hosts windows_updates.yml --tags check
Durchsucht die Windows-Rechner nach verfügbaren Updates, ohne sie zu installieren.
Updates installieren, ohne Neustart
ansible-playbook -i hosts windows_updates.yml --tags install
Installiert die gefundenen Updates, ohne das System automatisch neu zu starten.
Updates installieren und bei Bedarf neu starten
ansible-playbook -i hosts windows_updates.yml --tags install,reboot
Installiert die Updates und startet das System neu, falls dies notwendig ist.
Nur Systeme mit hoher Betriebszeit neu starten
ansible-playbook -i hosts windows_updates.yml --tags reboot
Startet nur die Systeme neu, die eine Betriebszeit von mehr als einem Tag haben.
Fazit
Mit diesem Ansible Playbook stellst Du sicher, dass Deine Windows-Systeme immer die neuesten Sicherheits- und Systemupdates erhalten. Der komplette Prozess – Prüfen, Installieren und Neustarten – ist automatisiert und spart Zeit sowie manuellen Aufwand. Setze das Playbook ein, um Deine Systeme zuverlässig aktuell und sicher zu halten.
Kommentare