Deze blogpost is het vervolg op een eerdere blogpost. In deze blog leg ik je graag uit hoe bij Interconnect de golden images worden aangemaakt.
Golden images - basis
Ieder golden image start met het bepalen van de benodigde resources per werkplek (processor, werkgeheugen, harde schijf, netwerk en eventueel grafische rekenkracht) en het bepalen van het besturingssysteem en standaardapplicaties. Bij Interconnect is gekozen voor de volgende configuratie (beide type werkplekken hebben dezelfde configuratie):
Processor |
4 vCPU |
Werkgeheugen |
8 GB |
Harde schijf |
75 GB |
Grafische kaart |
We gebruiken geen acceleration |
Als besturingssysteem is gekozen om Windows 10 Enterprise (versie 1903) te gebruiken. We gebruiken linked clones als template in Horizon View. Dat wil zeggen dat iedere VDI VM dezelfde parent disk gebruikt en per VM een child disk heeft.
Golden images – automatisch of handmatig
Voor het aanmaken van de golden images heb je grofweg twee opties: handmatig of automatisch.
Het voordeel van het handmatig aanmaken van de images is dat je precies ziet wat er gebeurt en alle stappen zelf in de hand hebt. Het nadeel is echter dat het foutgevoeliger is en het veel tijd kost. Daarom worden de golden images bij Interconnect volledig geautomatiseerd aangemaakt, van begin tot eind. Zo is het proces altijd precies hetzelfde. Om het proces te automatiseren wordt er gebruik gemaakt van Microsoft System Center Configuration Manager (task sequence, applicaties, updates etc.), PowerCLI en PowerShell.
In onze SCCM installatie bestaat een device collection speciaal voor de VDI templates. De VDI Operation System Deployment task sequence wordt gedeployed naar deze collectie.
Golden images - Script
Voordat we de images geautomatiseerd aanmaakten deden we iedere stap met de hand. De stappen waren grofweg: VM aanmaken, Windows installeren, Windows updates met alle laatste updates, alle applicaties applicatie voor applicatie installeren en de updates hiervan installeren. Als laatste stap voerden we de VMware OS Optimization Tool uit om het image wat op te schonen en te optimaliseren. De resultaten van het handmatig aanmaken van de images waren wisselend, soms ontbrak er een applicatie of instelling. Door Dit te standaardiseren en te automatiseren hebben we nu steeds hetzelfde resultaat. In een enkel geval mislukt het installeren van een update en wordt het bouwen geannuleerd. Het met de hand maken van een image kostte al gauw 2 dagen (inclusief testen). Nu het geautomatiseerd is zijn we slechts 4 uur kwijt (inclusief testen).
Het aanmaken van de VM gaat met PowerCLI:
# Variabelen $vcenter = '' # fqdn van je vCenter host $viewserver = '' # fqdn van een van je Horizon connection servers $templatename = '20190917-A-S-01' # Datum van vandaag, alpha, standaard, volgnummer $isopath = '' # Pad naar de boot ISO van SCCM $datastore = '' # Naam van de datastore zoals die in vCenter staat $memory = 8 # Grootte van het geheugen van de VM in GB $disksize = 75 # Grootte van de harddisk van de VM in GB $numcpu = 4 # Aantal sockets $numcores = 4 # Aantal cores per socket $location = 'Templates' # Locatie van de VM (map) $resourcepool = 'VDI' # Resourcepool waar de VM moet worden aangemaakt $portgroup = '' # Portgroup waarin de werkplek moet zitten $collectionname = 'VDI - Autoprovisioning' # Naam van de device collection in SCCM waar de VM moet worden neergezet (hier staat de task sequence naar gedeployed) # Laad de benodigde modules Import-Module 'C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1' Import-Module VMware.VimAutomation.Vds # 1. Maak verbinding met vCenter Connect-VIServer -Server $vcenter -Credential (Get-Credential) # 2. Maak een VM aan New-VM ` -Name $templatename ` -Datastore $datastore ` -DiskGB $disksize ` -DiskStorageFormat Thin ` -MemoryGB $memory ` -NumCpu $numcpu ` -CoresPerSocket $numcores ` -GuestId windows9_64Guest ` -Location $location ` -CD ` -ResourcePool $resourcepool # 3. Zet hotplug uit $vm = Get-VM $templatename $vmConfigSpec = New-Object VMware.Vim.VirtualMachineConfigSpec $vmConfigSpec.extraconfig += New-Object VMware.Vim.optionvalue $vmConfigSpec.extraconfig[0].Key='devices.hotplug' $vmConfigSpec.extraconfig[0].Value='false' $vm.ExtensionData.ReconfigVM($vmConfigSpec) # 4. Voeg netwerkkaart toe aan de VM Get-VM -Name $templatename | New-NetworkAdapter -Portgroup $portgroup -Type Vmxnet3 -StartConnected -WakeOnLan # 5. Vraag MAC adres op van VM $macaddress = (Get-NetworkAdapter -VM $templatename | Select MacAddress).MacAddress # 6. Koppel de boot ISO aan de VM Get-VM -Name $templatename | Get-CDDrive | Set-CDDrive -IsoPath $isopath -StartConnected $true -Confirm:$false # 7. Voeg de VM toe aan de SCCM collectie Import-CMComputerInformation -CollectionName $collectionname -ComputerName $templatename -MacAddress $macaddress # 8. Werk de collectie bij (wacht hierna enkele minuten) Invoke-CMCollectionUpdate -Name $collectionname # 9. Start de VM Start-VM -VM $templatename # 10. Aan het einde van de Task Sequence schrijft onze VM een bestand weg naar een share om aan te geven dat de deployment gelukt is. Tot die tijd wachten we while(-not (Test-Path -Path "S:\ContentLibrary\Inbox\$($templatename).txt")){ Sleep -Seconds 60 } # 11. Verwijder de ISO van de VM Get-VM -Name $templatename | Get-CDDrive | Set-CDDrive -NoMedia -Confirm:$false # 12. Verwijder de CD drive van de VM zodra deze uit staat (dit gaat bij ons ook automatisch aan het einde van de Task Sequence) Get-VM -Name $templatename | Get-CDDrive | Remove-CDDrive -Confirm:$false # 13. Aanmaken snapshot voor Horizon New-Snapshot -VM $templatename -Name "BaseInstall" # 14. Recompose aansturen in Horizon View Invoke-Command -ComputerName $viewserver -Credential (Get-Credential) -ScriptBlock ` { param($pool,$templatename) Import-Module 'C:\Program Files\VMware\VMware View\Server\extras\PowerShell\add-snapin.ps1' Update-AutomaticLinkedClonePool -Pool_id $pool -ParentVmPath /Interconnect/vm/Templates/$templatename -ParentSnapshotPath /BaseInstall Get-DesktopVM -Pool_id $pool | Send-LinkedCloneRecompose -ParentVmPath /Interconnect/vm/Templates/$templatename -ParentSnapshotPath /BaseInstall -forceLogoff $True -Schedule ((Get-Date).AddMinutes(1)) } -ArgumentList $pool,$templatename
Golden images – Task Sequence
Onze Task Sequence voor het uitrollen van Windows en het installeren van de applicaties is eigenlijk vrij eenvoudig. Voor we de applicaties installeren, installeren we .NET 3.5 en de VMware Tools. De applicaties worden in groepjes geinstalleerd en tussen ieder groepje zit een herstart van de VM. Aan het eind van de VM wordt een optimalisatie script uitgevoerd (onder anderen VMware OS Optimization Tool, voorbereiden virusscanner op sysprep, compact OS, dism en het verwijderen van de SCCM SMS Agent certificaten en config).
Golden images – Optimaliseren
Voorbereiden anti-virus
Bij sommige anti-virus software is het noodzakelijk dat je de installatie voorbereid op een sysprep. Zie hiervoor de handleiding of knowledge base van de fabrikant.
SCCM SMS Agent certificaten en config verwijderen
De SCCM agent maakt certificaten aan op basis van de computernaam (onder anderen) en daarom is het belangrijk om alles behalve de client zelf te verwijderen.
Onderstaande commando’s verwijdert:
- ini -> basis configuratie bestand met certificaat thumbprint en hardware identifiers
- Certificaten in LocalMachine\SMS\ (2 stuks)
- Reset WMI namespace van SCCM client
net stop ccmexec del %WINDIR%\smscfg.ini powershell -command "Remove-Item -Path HKLM:\Software\Microsoft\SystemCertificates\SMS\Certificates\* -Force" wmic /namespace:\\root\ccm\invagt path inventoryActionStatus where InventoryActionID="{00000000-0000-0000-0000-000000000001}" DELETE /NOINTERACTIVE
Optimaliseren Windows
Onderstaande commando’s ruimen de Windows installatie op:
- Uitschakelen Windows Update
- Alle shadow copies verwijderen
- Verwijderen Windows Update cache in C:\Windows\SoftwareDistribution\Download
- Verborgen installatie bestanden verwijderen
- Prefetch bestanden verwijderen
- Disk Cleanup uitvoeren
- .NET precompilen
- DISM cleanup
- OS Compact
- Defragmenteren
- Eventlog opruimen
REM ********************* REM Stop and disable Windows update service REM ********************* sc stop wuauserv sc config wuauserv start= disabled REM ********************* REM Delete any existing shadow copies REM ********************* vssadmin delete shadows /All /Quiet REM ********************* REM delete files in c:\Windows\SoftwareDistribution\Download\ REM ********************* del c:\Windows\SoftwareDistribution\Download\*.* /f /s /q REM ********************* REM delete hidden install files REM ********************* del %windir%\$NT* /f /s /q /a:h REM ********************* REM delete prefetch files REM ********************* del c:\Windows\Prefetch\*.* /f /s /q REM ********************* REM Run Disk Cleanup to remove temp files, empty recycle bin REM and remove other unneeded files REM Note: Makes sure to run c:\windows\system32\cleanmgr /sageset:1 command on your initially created parent image and check all the boxes of items you want to delete REM ********************* c:\windows\system32\cleanmgr /sagerun:1 REM ******************** REM Execute queued compilation jobs for .NET Framework REM ******************** cd c:\Windows\Microsoft.NET\Framework\v4.0.30319 ngen executequeueditems REM ******************** REM Cleanup Image with DISM REM ******************** dism.exe /online /cleanup-image /startcomponentcleanup /resetbase REM ******************** REM CompactOS REM ******************** compact /compactos:always REM ******************** REM Defragment the VM disk REM ******************** sc config defragsvc start= auto net start defragsvc defrag c: /U /V net stop defragsvc sc config defragsvc start= disabled REM ********************* REM Clear all event logs REM ********************* wevtutil el 1>cleaneventlog.txt for /f %%x in (cleaneventlog.txt) do wevtutil cl %%x del cleaneventlog.txt
Alle bovenstaande stappen zorgen ervoor dat de footprint van het besturingssysteem zo klein mogelijk is en daardoor zo efficiënt mogelijk werkt.
Plaats reactie