Hallo zusammen!
Ich setze Ansible nun schon seit einigen Jahren in der Produktion ein, um alle geplanten Aufgaben auf den verschiedenen Windows-Servern auszuführen.
Eine der gängigen Maßnahmen ist der Neustart der Server.
In meinem Fall gibt es drei Situationen:
- Den Server bedingungslos neu starten
- Neustart, falls ein Neustart erforderlich ist, um beispielsweise Updates zu installieren
- Neustart erzwingen, wenn die Betriebszeit mehr als X Tage beträgt
In diesem Artikel werde ich diese drei Playbooks vorstellen.
Playbook 1: Windows neu starten
Wir beginnen mit dem „einfachsten“ Playbook, nämlich dem Neustart von Windows. Dieses Playbook basiert auf win_reboot.
---
- name: Windows Reboot
hosts: windows
tasks:
- name: Reboot
ansible.windows.win_reboot:
msg: Reboot by Ansible
reboot_timeout: 600
Beim Neustart wird eine Meldung ausgegeben, die im Ereignis-Observer verfügbar ist. Die Aufgabe bleibt 600 Sekunden (10 Minuten) lang in der Warteschlange, um abzuwarten, bis der Server wieder online ist. Auf diese Weise kann die erfolgreiche Ausführung des Playbooks bestätigt werden.
Die Installation bestimmter Updates kann länger als 10 Minuten dauern; in diesem Fall schlägt die Ausführung des Playbooks fehl.
Playbook 2: Windows bei Bedarf neu starten
Das zweite Playbook startet Windows nur bei Bedarf neu. Um dies zu überprüfen, wird geprüft, ob ein bestimmter Schlüssel in der Windows-Registrierung vorhanden ist.
Wenn dieser Schlüssel vorhanden ist, wird der Server neu gestartet.
---
- name: Windows Reboot if needed
hosts: all
tasks:
- name: Check if reboot is required
ansible.windows.win_reg_stat:
path: HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired
name: RebootRequiredSince
register: reboot_required
#- name: Debug Message
# ansible.builtin.debug:
# msg: Reboot is required for host
# when: reboot_required.exists == true
- name: Reboot
ansible.windows.win_reboot:
msg: Reboot by Ansible
reboot_timeout: 600
when: reboot_required.exists == true
Playbook 3: Windows neu starten, wenn die Betriebszeit mehr als X Tage beträgt
Das letzte Playbook hat mir etwas mehr Kopfzerbrechen bereitet, da es mit Ansible keine direkte Lösung gibt, um die Betriebszeit des Servers auszugeben.
Hier ist das Playbook, ich erkläre es euch anschließend:
---
- name: Windows Reboot if needed
hosts: all
tasks:
- name: Check if reboot is required
ansible.windows.win_reg_stat:
path: HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired
name: RebootRequiredSince
register: reboot_required
#- name: Debug Message
# ansible.builtin.debug:
# msg: Reboot is required for host
# when: reboot_required.exists == true
- name: Reboot
ansible.windows.win_reboot:
msg: Reboot by Ansible
reboot_timeout: 600
when: reboot_required.exists == true
Am „schwierigsten“ war es, die Betriebszeit des Windows-Servers abzurufen. Dazu habe ich PowerShell verwendet und den Befehl mit win_shell ausgeführt.
Um die Betriebszeit abzurufen, lese ich die Konsolenausgabe aus, damit ich das Ergebnis mit Ansible verarbeiten kann; die Variable, die die Betriebszeit enthält, wird dabei in das JSON-Format umgewandelt.
Anschließend verarbeite ich die Ausgabe in Ansible im JSON-Format, um sie in eine Variable zu speichern, die ich im Playbook verwenden kann.
Auf dieser Grundlage kann ich die Verfügbarkeit des Windows-Servers nutzen, um zu entscheiden, ob ich ihn neu starten soll oder nicht.
