Microsoft Azure: Virtuelle Maschinen zeitgesteuert automatisch starten und stoppen

Oftmals ist aus ausreichend, wenn virtuelle Maschinen bzw. Server in Microsoft Azure zeitgesteuert eingeschaltet sind. Gerade im Office-Umfeld reicht es beispielsweise, Server nur werktags zu den Arbeitszeiten zu aktivieren. Das kann auf Dauer richtig Geld sparen!

Manuelles Starten und Stoppen ist zwar jederzeit möglich, auf Dauer aber unbequem. Abhilfe schafft hier ein kleines Script, welches als Runbook in einem Automation-Konto nach einem festen Zeitplan läuft und die Aufgabe zuverlässig und automatisch durchführt.

Wie geht das?

Dieses Runbook automatisiert das planmäßige Starten und Herunterfahren von virtuellen Azure-Maschinen. Sie können mehrere individuelle Leistungspläne für Ihre virtuellen Maschinen mit einfachen Tag-Metadaten im Azure-Portal oder über PowerShell implementieren. Beispielsweise können Sie eine einzelne VM oder eine ganze Gruppe von VMs  von 10:00 Uhr und 6:00 Uhr, den ganzen Tag samstags und sonntags und an bestimmten Tagen des Jahres, wie z.B. an Feiertagen, heruntergefahren werden.

Das Runbook soll mittels eines Zeitplanes in einem Azure Automation-Konto mit einem konfigurierten Abonnement und zugehörigen Zugriffsberechtigungen ausgeführt werden. Beispielsweise kann es einmal pro Stunde ausgeführt werden und überprüft alle Zeitplan-Tags, die es auf Ihren virtuellen Maschinen oder Ressourcengruppen findet. Wenn die aktuelle Zeit innerhalb eines von Ihnen definierten Shutdown-Zeitraums fällt, beendet das Runbook die VM, wodurch keine Berechnungsgebühren entstehen. Wenn die aktuelle Zeit außerhalb eines markierten Shutdown-Zeitraums liegt, bedeutet dies, dass die VM ausgeführt werden soll, sodass das Runbook eine solche VM automatisch startet.

 

Ergebnis des Runbooks

Sobald das Runbook eingerichtet und geplant ist, ist es ausreichend, die Tags der einzelnen Ressourcen entsprechend anzupassen, damit das Runbook beim nächsten Lauf entsprechend reagiert – eine schnelle, einfache und übersichtliche Lösung für alle virtuellen Microsoft Azure Server!

 

Warum sollten Sie das Script nutzen?

Kosten sparen!

Der größte Kostenfaktur der Azure-Abo-Kosten bei der Verwendung von Virtual Machines (IaaS) ist die Laufzeit: wie viele Stunden laufen die VMs pro Monat. Wenn Sie VMs haben, die während bestimmter Zeiträume gestoppt werden können, können Sie die Rechnung reduzieren, indem Sie sie ausschalten (und die Bereitstellung aufheben).

Leider enthält Microsoft Azure direkt keine Werkzeuge, um einen Zeitplan wie diesen zu verwalten. Deswegen hilft dieses Script ungemein, und das ganze ohne Drittanbieter-Tools

Wie funktioniert es

Weitere Details: Zunächst müssen wir für jede Ressource den Zeitplan definieren. Zum Beispiel möchten wir vielleicht unsere VMs nach Geschäftsschluss abschalten und sie anlaufen lassen, bevor die Leute am Morgen im Büro ankommen. Oder wir wollen VM’s das ganze Wochenende über herunterfahren, nicht nur nachts. Oder an Feiertagen. Wir brauchen also einen flexiblen Ansatz für den Zeitplaner.

Man könnte natürlich ein fest definiertes Runbook zum Herunterfahren eines speziellen Servers nach einem eigenen Zeitplan verwenden. Bei mehreren Servern oder differenzierten Zeitplänen wird das aber schnell unübersichtlich. Deswegen macht es Sinn, von vornherein eine flexible, Tag-basierte Steuerung einzurichten und das Runbook und dessen Zeitplan allgemein zu halten. Wir verwenden einfach ein Tag auf eine virtuelle Maschine oder eine Azure-Ressourcengruppe, die VMs enthält. Dieses Tag ist eine einfache Zeichenfolge, die beschreibt, wie oft die VM heruntergefahren werden soll.

Tag-Beschreibung

Das Runbook sucht nach einem Tag mit dem Namen „AutoShutdownSchedule“, der einer virtuellen Maschine oder Ressourcengruppe, die VMs enthält, zugewiesen wird. Der Wert dieses Tags sind ein oder mehrere Zeitplan-Einträge oder Zeitbereiche, die definieren, wann VMs heruntergefahren werden sollen. Anders herum gesagt sind die Zeiten, die hier nicht aufgeführt sind, die Zeiten, in denen die VM aktiv, also gestartet sein soll. Jedes Mal, wenn das Runbook die aktuelle Zeit gegen den Zeitplan prüft, stellt es sicher, dass die VM entsprechend ein- oder ausgeschaltet wird.

Wichtig: Das Script prüft gegen die Zeit aus der Zeitzone UTC/GMT, man muss also die Zeiten entsprechend „umrechnen“.

Es gibt zwei Arten von Einträgen:

  • Zeitbereich: Zwei Zeitangaben pro Tag oder absolutes Datum getrennt durch ‚->‘ (Strich größer-als). Verwenden Sie diese Option, um einen Zeitraum festzulegen, in dem die VMs heruntergefahren werden sollen.
  • Wochentag / Datum: Interpretiert als ein Tag, an dem VMs abgeschaltet werden sollen.

Alle Zeiten müssen Strings sein, die erfolgreich als „DateTime“ -Werte analysiert werden können. In anderen Worten, PowerShell muss in der Lage sein, den Text-Wert, den Sie zur Verfügung stellen, als Datums- und Zeitwert zu interpretieren. Es ist ein überraschendes Maß an Flexibilität erlaubt, und der einfachste Weg, einen vorgesehenen Wert zu testen, ist, eine PowerShell-Eingabeaufforderung zu öffnen und den Befehl

auszuführen, und sehen, was passiert. Wenn PowerShell einen formatierten Zeitstempel liefert, ist das gut. Wenn es beschwert, dass es nicht weiß, was gemeint ist, versuchen Sie, die Zeit anders zu schreiben.

Zeitplan-Tag-Beispiele

Der einfachste Weg, um den Zeitplan zu schreiben, ist, den Plan zuerst in Worte zu fassen. Danach kann man den Zeitplan dann Runbook-tauglich übersetzenDenken Sie daran, dass jeder Zeitraum, der nicht als Shutdown-Zeit definiert ist, zum Start der VM führt und damit kostenpflichtige Online-Zeit ist.

Sehen wir uns einige Beispiele an:

Herunterfahren von 10 Uhr bis 6 Uhr UTC jeden Tag

Herunterfahren von 10 Uhr bis 6 Uhr UTC jeden Tag (anderes Format, dasselbe Ergebnis wie oben)

Shut down von 8 Uhr bis 12 Uhr und von 2 Uhr bis 7 Uhr UTC jeden Tag (bringt online von 12-2am für die Wartung zwischen)

Shut down den ganzen Tag Samstag und Sonntag (Mitternacht bis Mitternacht)

Heruntergefahren von 2 Uhr bis 7 Uhr UTC jeden Tag und den ganzen Tag am Wochenende

Shut down zu Weihnachten und Neujahr

Heruntergefahren von 2 Uhr bis 7 Uhr UTC jeden Tag, und den ganzen Tag an Wochenenden und am Weihnachtstag

Shut down immer – ich will, dass diese VM nie automatisch läuft

Was das Runbook macht

Das Runbook „AutoShutdownSchedule“ ist ein Azure Automation Runbook. Es kann einmal zu einem Zeitpunkt manuell ausgeführt werden, sollte aber so konfiguriert sein, dass es auf einem Zeitplan ausgeführt wird, z.B. einmal pro Stunde.

Das Runbook erwartet zwei Parameter: den Namen des Azure-Abonnements, das die VMs enthält, und den Namen eines Azure Automation-Berechtigungsnachweises mit gespeichertem Benutzernamen und Kennwort für das zu verwendende Konto für die Verbindung zu diesem Abonnement. Wenn nicht spezifisch konfiguriert, sucht das Runbook standardmäßig nach einem Credential-Asset mit dem Namen „Default Automation Credential“ und einer Variable mit dem Namen „Default Azure Subscription“. Diese Einstellungen werden im Folgenden näher erläutert. Es gibt einen dritten Parameter namens „Simulate“, der, wenn True, dem Runbook sagt, dass er nur Pläne auswerten, aber nicht umsetzen soll. Dies wird später beschrieben.

Nach der erfolgreichen Authentifizierung des Ziel-Abonnements sucht das Runbook nach einer beliebigen VM- oder Ressourcengruppe mit einem Tag „AutoShutdownSchedule“. Alle Ressourcengruppen ohne dieses spezifische Tag werden ignoriert. Für jede gefundene, mit Tag markierte Ressource, werden die Zeitpläne ausgewertet und gegen die aktuelle UTC-Systemzeit geprüft. Dabei werden folgende Ergebnisse vom Runbook ermittelt:

  • Wenn die aktuelle Zeit außerhalb der definierten Zeitpläne liegt, kommt das Runbook zu dem Schluss, dass dies die „Onlinezeit“ ist und startet jede direkt oder indirekt markierte VM, die gerade gestoppt ist.
  • Wenn die aktuelle Zeit zu einem der Zeitpläne passt, kommt das Runbook zu dem Schluss, dass dies die „Abschaltzeit“ ist und stoppt jede direkt oder indirekt markierte VM, die gerade eingeschaltet ist.
  • Wenn einer der definierten Zeitpläne nicht erkannt werden kann, wird er ignoriert und als Online-Zeit betrachtet. Das Verhalten im Fehlerfall bedeutet also, die betroffene VM zu starten oder aktiviert zu lassen; es werden keine VM’s gestoppt, wenn der Zeitplan einen Fehler enthält!

Runbook-Protokolle

Verschiedene Ausgabemeldungen werden vom Runbook jedes Mal aufgezeichnet, wenn es ausgeführt wird, und zeigt an, welche Aktionen durchgeführt wurden und ob Fehler bei der Verarbeitung von Tags oder beim Zugriff auf das Abonnement auftraten. Diese Protokolle können in der Ausgabe jedes Jobs gefunden werden.

Performance

Das Starten und Herunterfahren erfolgt nacheinander, jeweils eine VM nacheinander. Dies hilft, Probleme mit VMs zu vermeiden, die zu demselben Cloud-Dienst gehören, der nur eine Mitglieds-VM zu einem Zeitpunkt zum Ein- oder Ausschalten zulässt. Das Starten und Stoppen kann eine Minute oder zwei pro VM dauern, deswegen könnte es sich in großen Umgebungen lohnen, das Runbook anpassen, um parallele Aktionen auszuführen.

Testen

Um das Runbook zu testen, ohne Ihre VMs zu starten oder zu stoppen, können Sie die Option „Simulate“ verwenden. Wenn dieser Parameter auf „True“ gesetzt ist, werden die Zeitpläne ausgewertet, aber es werden keine Start- oder Stop-Maßnahmen ergriffen. Sie können dann sehen, ob alles erwartungsgemäß funktioniert, bevor Sie das Runbook live mittels Zeitplan aktivieren.

Einrichten in Azure

Jetzt gehen wir die Schritte durch, um dieses Runbook in Ihrem Azure-Abonnement zu aktivieren.

Voraussetzungen

Dies ist ein Azure Automation Runbook, und als solche müssen Sie Folgendes verwenden:

  • Microsoft Azure-Abonnement (einschließlich Testabonnements)
  • Azure Automation-Konto erstellt im Abonnement (Anweisungen)
  • Runbook-Datei

Importieren Sie das Runbook

Das Runbook ist als Download verfügbar. Sie können diese wie folgt in Ihr Automatisierungskonto importieren:

  1. Anmeldung unter https://portal.azure.com
  2. Öffnen Sie das Automatisierungskonto, das das Runbook enthält
  3. Öffnen Sie die Runbooks-Ansicht aus dem Abschnitt Ressourcen
  4. Klicken Sie im oberen Menü auf Runbook hinzufügen
  5. Wählen Sie Ein vorhandenes Runbook importieren
  6. Klicken Sie zum Hochladen auf Erstellen
  7. Prüfen Sie, dass „AutoShutdownSchedule“ nun in der Runbooks-Liste angezeigt wird
  8. Öffnen Sie das Runbook aus der Liste
  9. Klicken Sie im oberen Menü auf Bearbeiten
  10. Klicken Sie im oberen Menü auf Veröffentlichen und prüfen Sie, dass der Status „veröffentlicht“ ist.

 

 

 

Credential-Asset erstellen

Wenn das Runbook ausgeführt wird, greift es auf Ihr Abonnement mit den von Ihnen konfigurierten Anmeldeinformationen zu. Standardmäßig sucht es nach einem Credential namens „Default Automation Credential“ und verzweigt dort auf einen Benutzer, den Sie im Azure Active Directory des Abonnements erstellen und die Berechtigungen zum Verwalten von Abonnementressourcen erteilen, z.B. als Co-Administrator.

Die Schritte:

  1. Erstellen Sie einen Azure Active Directory-Benutzer für die Verwendung im Runbook, wenn Sie dies noch nicht getan haben. Dieses Konto ist das „Dienstkonto“ für das Runbook und es muss ein Co-Administrator im Ziel-Abonnement sein
  2. Anmeldung unter https://portal.azure.com
  3. Öffnen Sie das Automatisierungskonto, das das Runbook enthält
  4. Öffnen Sie die Ressourcenansicht aus dem Abschnitt Ressourcen
  5. Öffnen Sie die Anmeldeinformationenansicht
  6. Klicken Sie im oberen Menü auf Anmeldeinformation hinzufügen
  7. Geben Sie die Details für die neue Berechtigung ein. Empfohlen wird, den Namen „Default Automation Credential“ zu verwenden.
  8. Klicken Sie auf Erstellen

Variable für Abonnementname erstellen

Das Runbook muss auch wissen, mit welchem Abonnement zu sich verbinden soll, wenn es ausgeführt wird.Theoretisch kann ein Runbook eine Verbindung zu einem beliebigen Abonnement herstellen, so dass wir es beim Ausführen mit angeben müssen. Dies geschieht einfach durch das Einrichten einer Variablen in unserem Automatisierungskonto.

  1. Anmeldung unter https://portal.azure.com
  2. Notieren Sie den Namen Ihres Zielabonnements, wie in Durchsuchen> Abonnements angezeigt
  3. Öffnen Sie das Automatisierungskonto, das das Runbook enthält
  4. Öffnen Sie die Ressourcenansicht aus dem Abschnitt Ressourcen
  5. Öffnen Sie die Ansicht Variablen
  6. Klicken Sie im oberen Menü auf Variable hinzufügen
  7. Geben Sie der Variablen einen Namen (standardmäßig „Default Azure Subscription“) und geben Sie den Namen der Variablen als Variablenwert ein.
  8. Klicken Sie auf Erstellen.

Planen Sie das Runbook

Das Runbook sollte in regelmäßigen Abständen ausgeführt werden. Wie zuvor beschrieben bestimmt dies nicht den Ein- / Ausschaltzeitplan der einzelnen Server. Es bestimmt nur, wie oft die Zeitpläne der einzelnen Ressourcen gegen die aktuelle Systemzeit überprüft werden. Azure erlaubt bis zu einer stündlichen Frequenz:

  1. Öffnen Sie in der Runbooks-Liste das neue Runbook „AutoShutdownSchedule“
  2. Öffnen Sie die Zeitplanansicht unter Details
  3. Klicken Sie im oberen Menü auf Plan hinzufügen
  4. Klicken Sie auf Verknüpfen eines Zeitplans mit Ihrem Runbook
  5. Klicken Sie auf Neuen Zeitplan erstellen
  6. Geben Sie einen Namen wie „Stündlicher Zeitplan“
  7. Stellen Sie die Startzeit auf die Zeit ein, die Sie zuerst ausführen möchten, z.B. das nächste volle Stunde
  8. Set Wiederholung aufStündlich
  9. Klicken Sie auf Erstellen

Optional:

  • Wenn Sie einen Credential- oder Subskriptionsnamen direkt angeben und die Standardnamen nicht verwenden möchten, klicken Sie auf Configure your runbook parameters
  • Geben Sie den Namen des Berechtigung (Credentials) ein, den das Runbook verwenden soll
  • Geben Sie den Namen des Abonnements ein, das das Runbook verwenden soll
  • Klicken Sie auf OK, um die geöffneten Dialoge zu schließen
  • Bestätigen Sie, dass der Zeitplan nun in der Liste mit dem Status aktiviert erscheint

Konfigurieren von Shutdown Schedule Tags

Schließlich müssen wir unsere VM-Ressourcengruppen taggen. Das Tag-Format wurde oben beschrieben. So erstellen Sie Zeitplan-Tags:

  1. Anmeldung unter https://portal.azure.com
  2. Navigieren Sie zu Durchsuchen> Ressourcengruppen, und öffnen Sie eine Ressourcengruppe, die VMs zum Planen enthält
  3. Klicken Sie oben rechts auf das Tag-Symbol
  4. Geben Sie im Feld Schlüssel „AutoShutdownSchedule“
  5. Geben Sie im Feld Wert einen Zeitplan wie oben beschrieben ein, z. B. „01:30 -> 06:00“
  6. Klicken Sie im oberen Menü auf Speichern

Nach Sie diesen Vorgangs für jede VM-Ressourcengruppe in Ihrem Abonnement wiederholt haben, ist alles vorbereitet, um die virtuellen Maschinen automatisch herunterzufahren und zu starten.Sie können die Tags jederzeit aktualisieren und änderen, ohne den Code des Runbooks anpassen zu müssen.Denken Sie daran, dass VMs in nicht getaggten Ressourcengruppen nicht vom Runbook verwaltet werden.

Erstprüfung

Um zu überprüfen, dass das Runbook funktioniert, können wir einen ersten Test manuell ausführen und die Ergebnisse überprüfen. Das ist einfach:

Weisen Sie der VM oder Ressourcengruppe, die Sie zum Testen verwenden möchten, ein Shutdown-Terminplan-Tag zu. Geben Sie ihm einen Zeitplan, der die aktuelle Zeit abdeckt. Der einfachste Weg ist, den heutigen Tag der Woche zu verwenden, z.B. „Mittwoch“.

  1. Starten der Test-VM
  2. Klicken Sie in der Runbook-Ansicht unter Ihrem Automatisierungskonto auf die Schaltfläche Start im oberen Menü.
  3. Überprüfen Sie, ob die Parameter korrekt sind, wenn Sie nicht die Standardwerte verwenden möchten. Setzen Sie den Paramenter „Simulate“ auf „True“, um ohne Änderungen zu testen. Wählen Sie „Ausführen“ in Azure aus, und klicken Sie auf OK
  4. Öffnen Sie die Ausgabe-Ansicht, und warten Sie, bis das Runbook ausgeführt wird. Es dauert ca. 1-2 Minuten.

Jetzt hoffen wir, dass Nachrichten in der Ausgabe angezeigt werden, die uns zeigen, dass eine markierte VM- oder Ressourcengruppe gefunden wurde, dass die aktuelle Zeit innerhalb eines Shutdown-Zeitplans liegt und dass die beabsichtigten VMs bei einer normalen Ausführung gestoppt worden wären. Eventuell auftretende Fehler sollten auch in der Ausgabe aufgezeichnet werden.

Testen Sie danach den umgekehrten Fall: Starten von VMs, die entsprechend dem Zeitplan ausgeführt werden sollen (wenn sie sich nicht in einem explizit definierten Abschaltzeitraum befinden, sollten sie gestartet werden). Hierfür können wir unser Zeitplan-Tag aktualisieren und erneut wie folgt testen:

  1. Kehren Sie zur Test-VM- oder Ressourcengruppe zurück und legen Sie das AutoShutdownSchedule so fest, dass es die aktuelle Zeit nicht abdeckt. Zum Beispiel, wenn heute Mittwoch ist, setzen Sie den Tag-Wert auf „Dienstag“. Durch erneutes Setzen des Tags wird das bestehende Tag mit demselben Namen überschrieben (Hinweis: Sie können das Dropdown-Menü verwenden, um vorherige Tag-Tasten und Werte auszuwählen).
  2. Starten Sie nun das Runbook mit den gleichen Schritten wie zuvor und beobachten Sie die Ausgabe

Dieses Mal sollten wir sehen, dass die aktuelle Uhrzeit nicht mit denAbschaltplänen für die VM oder Gruppe übereinstimmt, und Sie sehen im Runbook-Bericht, dass die gewünschten VMs gestartet werden würden.

Fehlerbehebung

Um nach Problemen zu suchen, können Sie den Jobprotokoll des Runbooks untersuchen und die Ausgabe und den Streams / Verlauf für jeden einzelnen Job zu betrachten. Im neuen Portal enthält die Ausgabe-Ansicht nicht unbedingt Fehlerdetails, daher sollten Sie auch die Stream-Ansicht überprüfen.

Konfiguration des Automations-Kontos

Bevor das Runbook in einer produktiven Umgebung aktiviert wird (was Sie sicherlich vorhaben) empfehle ich Ihnen, Ihr Automatisierungskonto als „Basic“ anstelle eines kostenlosen Kontos („Free) zu konfigurieren. Dadurch wird sichergestellt, dass die 500-Minuten Laufzeitbegrenzung pro Monat nicht greift und das Runbook sicher läuft. Die Kosten für die Ausführungszeit des Runbooks sind extrem niedrig für zusätzliche Minuten, so dass der geringe Aufpreis leicht durch die Berechnung der kostenpflichtigen VM-Laufzeiten ausgeglichen werden kann.

Der Code

 

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht.