3 Playbooks zum Neustart von Windows mit Ansible

Inhalt

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.

Romain Drouche

Romain Drouche

Systemarchitekt | MCSE: Core Infrastructure

Experte für IT-Infrastrukturen mit mehr als 15 Jahren Praxiserfahrung. Derzeit als Projektleiter für Systeme und Netzwerke sowie als Verantwortlicher für Informationssicherheit (SSI) tätig, setze ich meine Expertise für die Zuverlässigkeit und Sicherheit technologischer Umgebungen ein.

GHinM▶