Exchange 2019 Testumgebung mit Hyper-V automatisieren

Hier gibt es an dieser Stelle mal wieder einen kleinen Betrag aus der Reihe “Hinter den Kulissen”, diesmal geht um die Exchange Testumgebungen. Ich habe ja durchaus häufiger Bedarf an einer Exchange Testumgebung, was liegt da näher als die Installation zu automatisieren?

Vorwort

Im wesentlichen besteht eine Testumgebung bei mir immer aus einem Domain Controller und einem Exchange Server. Gelegentlich sind es auch mal größere Labs mit mehreren Domain Controller und Exchange Servern, manchmal auch in unterschiedlichen Domains. Die Labs installiere ich auf meiner Workstation als Hyper-V VMs.

Vielleicht interessiert es ja den ein oder anderen, wie sich die Installation eines Labs auf dem eigenen Rechner automatisieren lässt und da ich eh gerade dabei war die Umgebung für Exchange 2019 anzupassen, gibt es hier nun einen Artikel dazu.

Die automatische Lab Installation habe ich mit 4 PowerSchell Scripten realisiert, wer wissen will wie genau dies funktioniert kann einfach weiterlesen.

Die Scripte lassen sich allerdings nicht generell einsetzen und erfordern die Anpassung an die eigenen Bedürfnisse. Es gibt diverse Pfade und Abfragen die sich auf meine Workstation beziehen, mit ein wenig Aufwand lässt sich dies aber auch an die eigene Umgebung anpassen.

Die Voraussetzungen

Ich habe mir für jedes Betriebssystem ein Template erstellt und die VHDX Dateien in einem Ordner zusammen gefasst. Die Templates enthalten nur das Betriebssystem und ein paar kleine Anpassungen, ich habe beispielsweise den automatischen Start des Server Managers deaktiviert und die aktuellen Windows Updates installiert:

Exchange 2019 Testumgebung mit Hyper-V automatisieren

Wenn ich eine dieser Vorlagen starte, bootet beispielsweise ein frischer Windows 2016 Server mit den aktuellen Updates. Für mich ist dies eine einfache Handhabung, ich brauche das Betriebssystem nur einmal als Vorlage zu installieren und nach meinen Wünschen anzupassen. Wenn es neue Windows Updates gibt, brauche ich nur die Vorlage hochzufahren, die Updates zu installieren und schon kann ich neue Labs auf Basis der aktuellen Vorlage installieren.

Damit es keine Probleme mit der Installation von Domain Controllern, bzw Mitgliedern gibt führe ich vor dem Runterfahren eines Templates Sysprep mit einer Antwort-Datei aus. So wird eine neue SID generiert und auch direkt das lokale Administrator Passwort gesetzt, welches ich für die Installation verwenden kann.

Alle Scripte finden Interessierte am Ende des Artikels.

Des weiteren gibt es in einem separaten Verzeichnis weitere VHDX Dateien die von den Scripten verwendet werden:

Exchange 2019 Lab Umgebung mit Hyper-V automatisieren

ExchangeDisk.vhdx ist einfach nur eine leere, mit NTFS formatierte 200 GB Disk. ExchangeDisk.vhdx enthält keine Daten, sondern wird durch die Scripte für die Installation von Exchange Server verwendet. Die ResourceEX20XX.vhdx Dateien enthalten die Voraussetzungen für Exchange (UCMA, NET Framework) und das Exchange ISO selbst:

Exchange 2019 Lab Umgebung mit Hyper-V automatisieren

Der Vorteil für mich ist hier, dass ich einfach einzelne Komponenten austauschen oder hinzufügen kann. Wenn es beispielsweise eine neue Exchange Version gibt, tausche ich nur das ISO in der ResourceEXxxxx.vhdx aus. Gleiches gilt für weitere Komponenten wie beispielsweise Visual C++ 2013 Runtime. Da kürzlich die Visual Studio Runtime Voraussetzung für Exchange Server ist, habe ich das Paket einfach zu Resource Disk hinzugefügt und das Script für die Installation des Pakets erweitert.

Die Scripte

Die Automatisierung erfolgt über vier Powershell Scripte:

  • New-ExchangeLab.ps1
  • New-VMFromTemplateV2.ps1
  • New-DomainControllerVM
  • New-ExchangeServerVM.ps1

Das Script New-ExchangeLab.ps1 fragt im Prinzip nur die Parameter für die Installation der Lab Umgebung ab und listet die SSDs meiner Workstation auf damit ich auswählen kann, auf welchen SSDs das Lab bereitgestellt werden soll. New-ExchangeLab.ps1 führt dann die drei weiteren Script mit den angegebenen Parametern aus.

New-VMFromTemplateV2.ps1 klont die entsprechenden VMs aus dem ausgewählten Templates und konfiguriert Hostname und IP-Adresse für die VM.

New-DomainControllerVM installiert die Domain Controller Rolle und stuft den Server zum Domain Controller hoch.

New-ExchangeServerVM.ps1 installiert die Exchange Voraussetzungen und installiert Exchange Server.

Desweiteres gibt es noch die Datei Deploy.xml und sysprep.bat. Sysprep.bat startet Sysprep und verweitst auf die Datei C:\Deploy\deploy.xml. Diese beiden Dateien verwende ich für die Templates um die Installation abzuschließen.

Die Scripte sind nicht generell einsatzbereit sondern müssen an die jeweilige Umgebung angepasst werden.

Zu meiner Verteidigung: Manche Teile der Scripte sind schon recht alt und ich habe sie immer weiter umgeschrieben, daher gibt es teilweise Parameter/Funktionen/Variablen die nicht mehr verwendet werden und auch ein paar statische Pfade und Abfragen die sich auf meine Umgebung beziehen. Schmutzig sind auch die vielen sleeps in den Scripten, bei Gelegenheit werde ich das noch verbessern. Damit die Scripte auch in anderen Umgebungen laufen, müsste also etwas Hand angelegt werden.

Ich bin gerne bereit Fragen zu den Scripten und der Umgebung zu beantworten, setze dann aber PowerShell Kenntnisse voraus. Die Scripte sind ausdrücklich nur für Labs gedacht und nicht für produktive Umgebungen!

Das Script New-ExchangeLab.ps1 fragt diese Parameter ab und erstellt danach eine frische Exchange Lab Umgebung:

Exchange 2019 Testumgebung mit Hyper-V automatisieren

Download

Die Scripte können hier runtergeladen werden:

Anpassung an die eigene Testumgbeung

Wie schon erwähnt müssen die Scripte an die eigene Umgebung angepasst werden. Die folgenden Stellen kann ich schon einmal verraten:

Deploy.xml; Zeile 7, hier muss das lokale Administrator Passwort angegeben werden, dieses wird vom Script abgefragt und dann auch als Domain Administrator Passwort verwendet.

New-ExchangeServerVM.ps1; Zeile 9+10, hier müssen die Pfade zu Resource- und ExchangeDisk angepasst werden.

New-VMFromTemplateV2.ps1; Zeile 16+17, hier muss der Pfad zum Template Verzeichnis angepasst werden, sowie der Name des Hyper-V Virtual Switches eingetragen werden.

Zum Thema sysprep.bat und deploy.xml: Diese beiden Dateien sind nur für die Templates gedacht. Damit mehrere Domain Controller aus dem gleichen Template erzeugt werden können, muss die SID unterschiedlich sein. Zusätzlich muss das Script aber das Administrator Kennwort kennen, um die Befehle ausführen zu können. Nach der Installation des Templates (oder nach Update Installation) führe ich also einmal die sysprep.bat aus. Die kleine Batch-Datei startet Sysprep mit einer Antwortdatei (deploy.xml). So wird eine neue SID generiert und das lokale Administrator Passwort festgelegt.

Update 28.08.2018: Im ZIP fehlte das Script New-ExchangeLab.ps1, dies ist nun enthalten. Vielen Dank für die Hinweise.

6 Replies to “Exchange 2019 Testumgebung mit Hyper-V automatisieren”

  1. Hallo Frank,

    meines Wissens wäre Sysprep doch nur 3x möglich bei deinen Templates. Oder habe ich deine oben beschriebene Handhabung, bezgl. Sysprep, falsch verstanden?

    Gruß
    Danny

  2. Hallo Frank,

    vielen Dank für diese gute Anleitung und natürlich für die Bereitstellung deiner Scripte.
    Wenn ich die Powershell Scripte allerdings herunterlade fehlt das „New-ExchangeLab.ps1“ Script.

    Gruß
    Lars

  3. Hi Frank,

    vielen Dank dafür. Auch ich vermisse die New-ExchangeLab.ps1, kannst du die vielleicht bei Zeiten noch ergänzen?

    Gruß,

    Stefan

  4. Hallo Frank,

    in deinem Script sehe ich deinen Kommentar zum Reboot.
    Ich hatte mal das selbe Problem und habe es wie folgt gelöst:

    $vmCheck = Get-VMIntegrationService -VMName $vmName -Name Takt
    while ($vmCheck.PrimaryStatusDescription -ne „OK“)
    {
    $vmCheck = Get-VMIntegrationService -VMName $vmName -Name Takt
    sleep 1
    }
    sleep 5

    Dabei wird das Attribut Takt der VM abgefragt und diese gibt nur „OK“ wenn die Maschine gebootet ist.
    Das Sleep am Ende von 5 Sekunden ist nur zur Sicherheit.

    Vielleicht macht es sinn nicht den Takt sondern etwas anderes Anzufragen aber damit habe ich bisher keine Probleme gehabt.

    Gruß

    Felix

  5. Da ich mich gerade in Powershell einarbeite, kamen mir die Scripte wie gerufen. Vielen Dank dafür!

    Allerdings fällt mir auf, dass Du Powershell Direct verwendest.
    Was mich interessiert ist, wie du es hinbekommst, dass die Powershell Direct- (oder VMDirect) Befehle auf Host/Gast
    kleiner Windows 2016 bzw. Win10 laufen?

    Soweit ich informiert bin läuft ein Invoke-Command auf den Parameter -VMName oder -VMid nur dann, wenn Gast und Host eben 2016 oder unter 10 laufen.

    Gruß Patric

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.