Terug naar overzicht

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).

1 kopie kopie

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.

Tags

Plaats reactie

1000 Resterende tekens