donderdag 23 juni 2016

Maak een Automatic Linked Clone desktop pool aan met PowerShell (VMware PowerCLI) versie 2

Hallo Wereld,

Het script dat ik eerder publiceerde om automatisch een Linked Clone Pool van View desktops aan te maken heeft een aantal wijzigingen ondergaan waarvan ik hier verslag doe.

Traditioneel maak ik nieuwe pool per categorie gebruikers. Ik hanteer 3 categorien: Medewerkers, Studenten en Test , handig geidentificeerd met de letter MW, ST en TS.

Allereerst is er de vereiste om per pool te kunnen bepalen op welke storage deze komt. Op mijn 6 virtualisatiehosts voor desktops heb ik elk een SSD waarop de replica komen en de kladschijven voor elke VM.



Daarnaast hebben we twee domeinen zodat ik nu moet specificeren in welk domein de desktops moeten worden uitgerold.

Ook de documentatie van het script meer volgende het aanbevolen formaat, met synopsis. description en uitleg per parameter en wat deze doet, welke waarde er wordt verwacht, enz.

<#
.SYNOPSIS

    Maak een nieuwe desktoppool van automatic linked clones voor medewerkers,
    studenten, plus of test. Maakt 1 desktop in de nieuwe pool.

.DESCRIPTION

    20160622 Paul Wiegmans (p.wiegmans@bonhoeffer.nl)

    Gebruik:
    * start een elevated PowerShell "run as administrator" op server BCVIEW1
    * ga naar C:\Scripts

.PARAMETER Category

    Deze verplichte parameter duidt categorie van de desktoppool aan. 
    Dit kan één van vier aanduidingen zijn:
    "st" voor studenten
    "mw" voor medewerkers
    "pl" voor plus
    "ts" voor test

.PARAMETER PoolVersion

    Deze verplichte parameter bevat de poolversie zoals die wordt aangeduid in de PoolId
    bijvoorbeeld "403" . De Pool_id van de aan te maken desktoppool wordt hiervan afgeleid.

.PARAMETER MasterVM

    De naam van het basisimage , 
    bijvoorrbeeld "/Castricum/vm/Desktop Sources/Windows 7 Basis v4" .
    Niet verplicht, neemt bij verstek de waarde in de parameterblock. 

.PARAMETER MasterSnapshot

    Dit is de aanduiding van de snapshot zoals die wordt getoond in View Administrator Console. 
    De Snapshot wordt aangeduid als een pad van snapshotnamen, bijvoorbeeld "/01/02/03/04/05"

.PARAMETER DatastoreSpecSet

    Dit bevat een string met de namen van de ESX-hosts waarop de pool wordt aangemaakt. 
    Intern wordt dit omgezet naar een Datastore-specificatie. bijvoorbeeld "ESX5;ESX6;ESX7". 
    
.EXAMPLE

    Maak een pool voor studenten met versie 3.15

    .\Add-BCPool.ps1 -Category ts -PoolVersion 603 `
    -MasterVM "/Castricum/vm/Desktop Sources/Windows 7 Basis v6" `
    -MasterSnapshot "/01/03" 

.EXAMPLE

    Maak een pool voor studenten met versie 3.15

    .\Add-BCPool.ps1 st 315  

.NOTES
    Controleer na uitvoeren van dit script in View Administrator of de pool goed zijn gemaakt,
    zonder rood kruis. Zie je een rood kruis, dan fout oplossen en provisioning inschakelen. 

    BELANGRIJK:
        Zorg ervoor dat de default waarde van parameter $MasterSnapshot overeenstemt met 
        de naam van het snapshot van het actuele basisimage!
        
    BELANGRIJK:
        Zorg ervoor dat de default waarde van parameter $DatastoreSpecSet overeenstemt met 
        de (SSD) datastores waarop de View desktops moeten worden uitgerold! Wijzig naar behoefte.
        
    BELANGRIJK:
        Verhoog poolsize van nieuwe pools met maximaal 1 tegelijk. Nog steeds kan
        de SAN niet meer dan 1 template tegelijk kopieren. Er komt een lock op, en 
        de volgende geeft een fout, en VMware wacht niet tot het klaar is, maar gaat gelijk door.
        dus verhoog met 1 tegelijk totdat alle hosts een template op hun SSD hebben.

    Wijzigingen:
    20130819
      extra parameter: -OSVersion bevat versie van Windows: 1 cijfer is "7" of "8"
    20160218 
      toegevoegd: Try .. Catch, zodat script stopt bij de eerste onherstelbare fout.
      Verwijderd: $DesktopCount; het script maakt altijd een pool met één VM.
      Verwijderd: $RemoveOldPool en code die oude pool verwijdert.

    TO DO:
    [ ] maak pool_id en displayname OS-onafhankelijk , verwijder "Windows 7" en maak dit variable.

    eigenlijk moet ik hier try .. catch blokken in zetten. zodat bij de eerste fout
    het script afbreekt.
    20160218 uitrollen van 1 VM duurt nu 12 minuten, van begin tot inlog-klaar
    (waarvan 9 minuten voor alleen clonen van replica).

    20160622 Tijdelijk hebben Frank en ik afgesproken dat we testpools uitrollen 
    alleen op esx4 en esx5, en studenten en medewerkerpools op esx6,esx7,esx8 en esx9.
    Dit is om te zorgen dat esx4 en esx5 vrij zijn om migratie op uit te voeren,
    dingen te testen, enz.

#>
# VMware PowerCli extensies worden geladen in systemprofile. Anders:
#. "C:\Program Files\VMware\VMware View\Server\extras\PowerShell\add-snapin.ps1"

param(
    [Parameter(Mandatory = $True, Position = 1)]
    [ValidateSet("mw","st","pl","ts")]
    [string]$Category    # $Category is {"mw"|"st"|"pl"|"ts"}
    ,
    [Parameter(Mandatory = $True, Position = 2)]
    [ValidatePattern("[0-9][0-9][0-9]")]  # Valid format is 3 numbers !
    [string]$PoolVersion   # bijv "802"
    ,
    [Parameter(Mandatory = $False)]
    [string]$MasterVM="/Castricum/vm/Desktop Sources/Windows 7 View v8"  # Master VM
    ,
    [Parameter(Mandatory = $False)]
    [string]$MasterSnapshot="/02/10/11/13" # "/01/02/03" # Master snapshot path 
    ,
    [Parameter(Mandatory = $False)]
    [string]$OSVersion="7"    # 1 cijfer windows versie
    ,
    [Parameter(Mandatory = $False)]
    [string]$CustSpec="W7 View Desktops v8.01 - Pro Key"
    ,
    [Parameter(Mandatory = $False)]
    [string]$DatastoreSpecSet="ESX4;ESX5;ESX6;ESX7;ESX8;ESX9"   # bijvoorbeeld "ESX5;ESX6;ESX7;ESX8;ESX9"
)

$ComposerDomain = "bonhoeffercollege.local"   ## AANPASSEN wanneer nieuwe composer domein werkt
$DisplayVersion = "v{0}.{1}" -f ($PoolVersion[0], $PoolVersion.Remove(0,1))


# ---- setting more parameters ----
if ($Category -eq "mw") {
    $UserType = "Medewerkers"  # Studenten, Medewerkers, Plus of Test
    $UserGroup = "Medewerkers"
    $UserTag = "MW" 
    $UserName = "Medewerker"
    $DatastoreSpecSet="ESX6;ESX7;ESX8;ESX9"

elseif ($Category -eq "st") {
    $UserType = "Studenten"  # Studenten, Medewerkers, Plus of Test
    $UserGroup = "Studenten"
    $UserTag = "ST" 
    $UserName = "Leerling"
    $DatastoreSpecSet="ESX6;ESX7;ESX8;ESX9"
}
elseif ($Category -eq "pl") {
    $UserType = "Plus"  # Studenten, Medewerkers, Plus of Test
    $UserGroup = "Plusgroep"
    $UserTag = "PL" 
    $Username = "Plus"
    $DatastoreSpecSet="ESX6;ESX7;ESX8;ESX9"

elseif ($Category -eq "ts") {
    $UserType = "Test"  # Studenten, Medewerkers, Plus of Test
    $UserGroup = "DL View Limited Test Users"
    $UserTag = "TS" 
    $Username = "Test"
    $DatastoreSpecSet="ESX4;ESX5"
}
else {
    Throw "Category '$Category' is not a valid PoolLabel"
}
# -------------------

$DatastoreSpecs = ($DatastoreSpecSet.split(";") | %{ "[Aggressive,OS,data]/Castricum/host/Desktops/LOCAL-{0}-SSD" -f $_ } ) -join ";" 

$poolparm = @{
### Pool-specifieke parameters
    pool_id = "W{0}{1}{2}" -f ($OSVersion, $UserTag, $PoolVersion)
    displayName = "{0} {1}.{2}" -f ($UserName, $PoolVersion[0], $PoolVersion.Remove(0,1))
    namePrefix = "VD" + $UserTag + $PoolVersion + "{n:fixed=3}"
    folderId = $UserType
    organizationalUnit = "OU={0},OU=Windows {1},OU=Virtual Desktops,OU=MyBusiness" -f ($UserType, $OSVersion)
    resourcePoolPath = "/Castricum/host/Desktops/Resources/{0}" -f $UserType
    headroomCount = "1"  # number of spare (powered on) desktop
    maximumCount = "1"   # max number of desktops
    minimumCount = "1"
    Disabled = $true
    parentVMPath = $MasterVM
    parentSnapshotPath = $MasterSnapshot
    vmFolderPath = "/Castricum/vm/View W{0} Desktops" -f ($OSVersion)
    
    # Origineel:
    # datastoreSpecs = "[Aggressive,OS,data]/Castricum/host/Desktops/LOCAL-ESX9-SSD;[Aggressive,OS,data]/Castricum/host/Desktops/LOCAL-ESX8-SSD;[Aggressive,OS,data]/Castricum/host/Desktops/LOCAL-ESX7-SSD;[Aggressive,OS,data]/Castricum/host/Desktops/LOCAL-ESX6-SSD;[Aggressive,OS,data]/Castricum/host/Desktops/LOCAL-ESX5-SSD;[Aggressive,OS,data]/Castricum/host/Desktops/LOCAL-ESX4-SSD"
    datastoreSpecs = $DatastoreSpecs
### onveranderde parameters
    allowProtocolOverride = $true
    autoLogoffTime = 30
    #customizationSpec = $Null   # gebruik QuickPrep
    #customizationSpec = "BW7-Capture-customization-specs" 
    #customizationSpec = "W7 Pro View Desktops v6.01" 
    customizationSpec = $CustSpec
    deletePolicy = "Default"
    flashQuality = "NO_CONTROL"
    flashThrottling = "DISABLED"
    isUserResetAllowed = $true
    persistence = "NonPersistent"
    powerPolicy = "AlwaysOn"
    DefaultProtocol = "PCOIP"
    isProvisioningEnabled = $true
    SuspendProvisioningOnError = $false # $true
    refreshPolicyType = "Never"
    composer_ad_id = (get-composerdomain -domain $ComposerDomain).composer_ad_id
    vc_id = (Get-ViewVC).vc_id
}

Write-Verbose ("{0} Pool aanmaken..." -f (Get-Date -format "s"))
Write-Verbose ("  Pool_id:           {0}" -f $poolparm.pool_id)
Write-Verbose ("  displayName:       {0}" -f $poolparm.displayName)
Write-Verbose ("  namePrefix:        {0}" -f $poolparm.namePrefix)
Write-Verbose ("  folderId:          {0}" -f $poolparm.folderId)
Write-Verbose ("  organizationalUnit:{0}" -f $poolparm.organizationalUnit)
Write-Verbose ("  resourcePoolPath:  {0}" -f $poolparm.resourcePoolPath)
Write-Verbose ("  DatastoreSpecSet:  {0}" -f $DatastoreSpecSet)
Write-Verbose ("  Tijd is nu:        {0}" -f (Get-Date))

Try {
    Add-AutomaticLinkedClonePool @poolparm -ea:stop
}
Catch {
    $ErrorMessage = $_.Exception.Message
    $FailedItem = $_.Exception.ItemName
    Write-Error ("[Add-BCPool] faalt! {0} : {1}" -f ($ErrorMessage, $FailedItem))
    Break
}

Write-Verbose "Rechten geven aan groepen..."
Try {
    Add-PoolEntitlement -pool_id $poolparm.pool_id `
        -sid (get-user -name "DL View Limited Test users").sid | Out-Null
    Add-PoolEntitlement -pool_id $poolparm.pool_id `
        -sid (get-user -name $UserGroup -IncludeUser $False -IncludeGroup $True).sid -ea:stop | Out-Null
}
Catch {
    $ErrorMessage = $_.Exception.Message
    $FailedItem = $_.Exception.ItemName
    Write-Error ("[Add-BCPool] faalt! {0} : {1}" -f ($ErrorMessage, $FailedItem))
    Break
}

Write-Verbose "Desktop creëren..."
Try{ 
    Update-AutomaticLinkedClonePool -pool_id $poolparm.pool_id `
        -minimumCount 1 -maximumCount 1 -headroomCount 1
}
Catch {
    $ErrorMessage = $_.Exception.Message
    $FailedItem = $_.Exception.ItemName
    Write-Error ("[Add-BCPool] faalt! {0} : {1}" -f ($ErrorMessage, $FailedItem))
    Break
}

Write-Verbose "Pool inschakelen..."
Try {
    Update-AutomaticLinkedClonePool -pool_id $poolparm.pool_id `
        -Disabled:$false -IsProvisioningEnabled:$true -ea:stop
}
Catch {
    $ErrorMessage = $_.Exception.Message
    $FailedItem = $_.Exception.ItemName
    Write-Error ("[Add-BCPool] faalt! {0} : {1}" -f ($ErrorMessage, $FailedItem))
    Break
}

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

# met de hand vergroten als volgt:
# Update-AutomaticLinkedClonePool -pool_id W7Studenten403 -minimumCount 2 -maximumCount 2 -headroomCount 2

# enable HTML Access
Set-PoolHTMLAccess $poolparm.pool_id $True

Bye bye

Geen opmerkingen:

Een reactie posten