zondag 6 januari 2013

Een virtuele desktop pool aanmaken met een script (PowerShell natuurlijk)


Voor mijn werk gebruik ik VMware View 5.1 en onderhoud ik 4 desktoppools met in totaal zo'n 500 virtuele desktops met Windows 7. Regelmatig moet ik deze desktoppools opnieuw aanmaken op basis van een bijgewerkt Windows image waarop ik Windows Updates installeer en software bijwerk zoals Silverlight, Flashplayer, Office . Deze nieuwe desktoppools hebben verder precies dezelfde parameters. Ik zocht een makkelijkere manier om makkelijk een nieuwe desktoppool aan te maken, anders dan me helemaal gek te klikken in de View Administrator webinterface en ik vond de oplossing in PowerShell.
Na wat proberen op de command line interface van mijn View connection server, welke voorzien is van VMware vSphere PowerCLI , ontdekte ik hoe ik de diverse parameters van de bestaande desktoppools in een script kon vangen. Het commando dat ik gebruik om een nieuwe desktoppool aanmaak is Add-AutomaticLinkedClonePool. De nieuwe desktoppools die ik regelmatig bijwerk hebben verder dezelfde parameters, dus deze klus leent zich uitstekend voor een script. De eerste stap was om met behulp van Get-Pool te achterhalen welke attributen de bestaande desktop pool objects hebben. Dat bleken er een hele rits te zijn. Een hele rij daarvan is vereist om succesvol een desktoppool aan te maken. Dat scheelt wel ongeveer 120 muisklikken!

Om mijn excellente werk met de rest van de wereld te delen en kennis te doen maken met mijn geweldige scripttalent, plaats ik hier mijn script.


# Maak-NieuweMedewerkersPool.ps1
# Maak een nieuwe desktoppool van automatic linked clones
# 20130105 Paul Wiegmans

# aan te passen variabelen
$gebruikertype = "Medewerkers"  # Studenten, Medewerkers, Plus of Test
$gebruikergroep = "Medewerkers"
$gebruikertag = "MW" 
$nieuwepoolversie = "309"
$snapshot = "/BW7BASISv3/BW7-v3.01/W7 Basis 3.02/v3.05/v3.07/v3.08/v3.09"
$oudepool = "W7Medewerker308"
$nieuwepool = "W7{0}{1}" -f ($gebruikertype, $nieuwepoolversie)

$poolparm = @{
pool_id = $nieuwepool
displayName = "W7 {0} Desktop v3.09" -f $gebruikertype
namePrefix = "VD$gebruikertag$nieuwepoolversie{n:fixed = 3}"
folderId = $gebruikertype
organizationalUnit = "OU={0},OU=Windows 7,OU=Virtual Desktops,OU=MyBusiness" -f $gebruikertype
resourcePoolPath = "/Bonhoeffer/host/Desktops/Resources/{0}" -f $gebruikertype
headroomCount = "3"  # number of spare (powered on) desktop
maximumCount = "3"   # max number of desktops
minimumCount = "3"
Disabled = $true
parentVMPath = "/Bonhoeffer/vm/Windows 7 Basis v3"
parentSnapshotPath = $snapshot
vmFolderPath = "/Bonhoeffer/vm/View W7 Desktops"
datastoreSpecs = "[Aggressive,OS,data]/Bonhoeffer/host/Desktops/LOCAL-ESX9-SSD;[Aggressive,OS,data]/Bonhoeffer/host/Desktops/LOCAL-ESX8-SSD;[Aggressive,OS,data]/Bonhoeffer/host/Desktops/LOCAL-ESX7-SSD;[Aggressive,OS,data]/Bonhoeffer/host/Desktops/LOCAL-ESX6-SSD;[Aggressive,OS,data]/Bonhoeffer/host/Desktops/LOCAL-ESX5-SSD;[Aggressive,OS,data]/Bonhoeffer/host/Desktops/LOCAL-ESX4-SSD"
### onveranderde parameters
allowProtocolOverride = $true
autoLogoffTime = 30
customizationSpec = "BW7-Capture-customization-specs" 
deletePolicy = "Default"
flashQuality = "NO_CONTROL"
flashThrottling = "DISABLED"
isUserResetAllowed = $true
persistence = "NonPersistent"
powerPolicy = "AlwaysOn"
DefaultProtocol = "PCOIP"
isProvisioningEnabled = $true
SuspendProvisioningOnError = $true
refreshPolicyType = "Never"
}
Write-Host
Write-host "Pool_id: $nieuwepool"
Write-host "displayName: $($poolparm.displayName)"
Write-host "namePrefix: $($poolparm.namePrefix)"
Write-host "folderId: $($poolparm.folderId)"
Write-host "organizationalUnit: $($poolparm.organizationalUnit)"
Write-host "resourcePoolPath: $($poolparm.resourcePoolPath)"
Write-host "Pool_id: $($poolparm.pool_id)"


Write-Host "Pool aanmaken..."
Get-ComposerDomain | Add-AutomaticLinkedClonePool @poolparm

Write-Host "Gebruikers rechten geven"
Add-PoolEntitlement -pool_id $poolparm.pool_id -sid (get-user -name "DL View Limited Test users").sid
Add-PoolEntitlement -pool_id $poolparm.pool_id -sid (get-user -name $gebruikergroep).sid

Write-Host "Pool vergroten"
Update-AutomaticLinkedClonePool -pool_id $poolparm.pool_id -minimumCount 30 -maximumCount 30 -headroomCount 30
 
Write-Host "Pool inschakelen"
Update-AutomaticLinkedClonePool -pool_id $poolparm.pool_id -Disabled:$false

Write-Host "Verwijder oude pool" 
Remove-Pool -pool_id $oudepool -TerminateSession:$true -DeleteFromDisk:$true

# in geval van fouten opnieuw provisioning inschakelen
# Update-AutomaticLinkedClonePool -pool_id $poolparms.pool_id `
#   -IsProvisioningEnabled:$true -SuspendProvisioningOnError:$false


Hee, het werkt!
Oh ja, om dit script succesvol uit te voeren op een server met VMware View, heb ik in mijn profilescript C:\windows\system23\WindowsPowerShell\profile.ps1 de volgende regel opgenomen:

. "C:\Program Files\VMware\VMware View\Server\extras\PowerShell\add-snapin.ps1"
zodat het script in staat is om de VMware View snapin te laden.

Geen opmerkingen:

Een reactie posten