Haikos Blog Blog von Haiko Hertes zu allen Themen rund um Microsoft und Datacenter

21Aug/180

Azure / PowerShell – Das OS Image eines VMSS ändern

Da es hierzu keine gute Dokumentation im Netz gibt und ich heute dieses Problem hatte schreibe ich diesen kurzen Blog-Artikel.

Das Problem:

In verschiedenen bestehenden Virtual Maschine Scale Sets (VMSS) in Azure wird ein angepasstes Windows Server 2016 Image verwendet. Dieses Image sollte nun aktualisiert und weiter angepasst werden. Dazu habe ich aus dem Image eine VM erstellt, diese entsprechend hergerichtet und dann mit sysprep generalisiert. Danach habe ich mit Azure ein Image davon aufzeichnen lassen. Nun möchte ich dieses Image in den bestehenden VMSS einsetzen. Über das Portal geht das nicht und die PowerShell-Befehle sind nur unzureichend beschrieben.

Die Lösung:

Dieses kleine PowerShell-Skript legt das Basis-OS-Image für ein definiertes VMSS neu fest und löst danach das Re-Image der Instanzen aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Parameters
[string]$NewVmssBaseImageName = "VMSS-Base-Image-Name"
[string]$SubscriptionId = "123456789"
[string]$VMSSRessourceGroup = "RessourceGroupName"
[string]$VMSSName = "VMSSName"
 
# Connect to Azure
Connect-AzureRmAccount -Subscription $SubscriptionId
Set-AzureRmContext -SubscriptionId $SubscriptionId
 
# Get Image ID
$ImageId = (Get-AzureRmImage | Where Name -eq $NewVmssBaseImageName).Id
# Get VMSS
$VMSS = Get-AzureRmVmss -ResourceGroupName $VMSSRessourceGroup -VMScaleSetName $VMSSName
# Set new OS Image
$VMSS | Update-AzureRmVmss -ImageReferenceId $ImageId
# Upgrade VM instances to latest model
Update-AzureRmVmssInstance -InstanceId (Get-AzureRmVmssVM -VMScaleSetName $VMSS.Name -ResourceGroupName $VMSS.ResourceGroupName).InstanceId -ResourceGroupName $VMSSRessourceGroup -VMScaleSetName $VMSSName
2Feb/130

Server 2012: Unattend.xml für geklonte Maschinen

Will man einen Server 2012 klonen, ist es nötig, diesen vor dem Klonvorgang mit Hilfe von Sysprep vorzubereiten. Dabei gehen einige Informationen verloren, u.a. die SID, Hostname, IP-Adresse und co. Das ist hier auch gewollt. Allerdings gehen auch andere Informationen verloren, die dann nach dem Ausrollen des Images erneut eingegeben werden müssen, u.a. verschiedene Spracheinstellungen, Produkt-Key, das lokale Administratorpasswort und einiges mehr.

Um nun nicht auf vielen Klonen diese Informationen immer wieder neu eingeben zu müssen, kann man sich mit einer Unattend.xml, einer sogenannten "Antwortdatei", behelfen. In dieser kann man all diese Informationen vorab festlegen und sie werden dann automatisch verarbeitet.

Eine solche Unattend.xml muss entweder bereits vor dem Sysprep oder dann später mittels DISM in den Pfad %WINDIR%\Panther\Unattend gelegt werden.

Möchte man diese Aufgabe mit DISM für bereits existierende Images erledigen, ist der Ablauf in etwa der folgende:

1
2
3
4
dism /Mount-Wim /MountDir:C:\Mount /WimFile:C:\Image.wim /index:1
mkdir C:\Mount\Windows\Panther\Unattend
copy "C:\unattend.xml" C:\Mount\Windows\Panther\Unattend
dism /Unmount-Wim /MountDir:C:\Mount /commit

Damit wird das Image mittels DISM (schreibend) bereitgestellt, die Antwortdatei an den passenden Pfad kopiert und das Image zurückgeschrieben. Die Antwortdatei selber kann man mit Hilfe des "Windows System Image Manager" (SIM) erzeugen, welcher Bestandteil des WAIK und WADK ist. Nötig sind hierbei mindestens folgende Angaben im Teilbereich oobeSe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <InputLocale>de-de</InputLocale>
            <SystemLocale>de-de</SystemLocale>
            <UILanguage>de-de</UILanguage>
            <UILanguageFallback>en-us</UILanguageFallback>
            <UserLocale>de-de</UserLocale>
</component>
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <OOBE>
                <HideEULAPage>true</HideEULAPage>
                <HideLocalAccountScreen>true</HideLocalAccountScreen>
                <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
                <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
                <NetworkLocation>Work</NetworkLocation>
                <ProtectYourPC>3</ProtectYourPC>
                <SkipMachineOOBE>true</SkipMachineOOBE>
                <SkipUserOOBE>true</SkipUserOOBE>
            </OOBE>
            <UserAccounts>
                <AdministratorPassword>
                    <Value>P@$$w0rd!</Value>
                    <PlainText>true</PlainText>
                </AdministratorPassword>
            </UserAccounts>
            <TimeZone>W. Europe Standard Time</TimeZone>
</component>

Damit werden die nötigen Eingaben vollständig automatisiert, der geklonte Server bootet nach dem Ausrollen des Images mehrfach durch, bis er abschliessend am Login steht. Das Administrator-Kennwort ist hier mit "P@$$w0rd!" festgelegt, kann aber geändert werden.

Wenn mann ohnehin eine Antwortdatei nutzt, kann man damit auch gleich noch weitere Einstellungen setzen, z.B.:

- Autologin
- Firewall abschalten
- Automatischen Start des Servermanagers abschalten
- Verstärkte Sicherheit im IE abschalten
- Remotedesktop einschalten
- Kennwort des lokalen Admin läuft nie ab
- uvm.

Die fertige Antwortdatei sieht dann in etwa so aus:

(Beispieldatei kann hier heruntergeladen werden)