Citrix

Automatisering av VDA-migrering mellom kataloger i XenDesktop

Bakgrunn

Kunder som bruker Citrix XenDesktop med dedikert katalog kan ønske å flytte skrivebordene til en annen katalog av ulike årsaker, som for eksempel å endre datalageret bak den eller ganske enkelt endre katalogen fra Un-managed til Power Managed. 

Å gjøre dette manuelt ville være tungvint ettersom du må fjerne maskinene fra deres leveringsgrupper, kataloger, miste de tilordnede brukerne, og deretter legge dem til på nytt i den nye katalogen og konfigurere dem på nytt. 

I dette scenariet kan løsningen som tilbys automatisere alle disse handlingene med Powershell slik at hele prosessen kan ta minutter i stedet for dager.

Problem

De eksisterende katalogene ble ikke strømstyrt, noe som ikke var praktisk når brukere ønsket å starte sine egne maskiner på nytt og gjorde administrasjonen vanskeligere for systemadministratorer. Så det var behov for nye Power Managed-kataloger uten å endre de eksisterende brukertilordningene eller leveringsgruppene. 

Miljø 

CVAD 7+ eller nyere 

VMware vSphere som en virtualiseringshypervisor 

Krav

  • Administratortilgang til Citrix DDC og Powershell
  • XenDesktop SDK (Installert som standard på Desktop Delivery Controller) eller kan finnes på CVAD media ISO under Drive:\x64\Citrix Desktop Delivery Controller
  • VMware PowerCLI-modul som bruker Powershell
  • Opprett din(e) nye katalog(er) (kun med én maskin) og gi den et nytt navn/konfigurasjon, f.eks. Power Managed osv.. Bruk deretter følgende kommando for å ta tak i  

Til scriptet!

Ved å bruke din favorittredigerer (VSCode, PoSH ISE, etc) åpner du Powershell som Admin 

Forutsatt at du har installert SDK-ene ovenfor på maskinen du kjører koden fra, legg til alle snap-in-modulene til PoSH-økten din

Add-PSSnapin * -ErrorAction SilentlyContinue

Angi variablene dine for Hypervisor Connection ID og New Catalog ID – de er nødvendige for at skriptet skal fungere

I Studio, gå til Hosting og finn tilkoblingsnavnet som kobler maskinene dine til Hypervisor, og skriv deretter navnet inn i følgende kommando:

Add-PSSnapin * -ErrorAction SilentlyContinue

Angi variablene dine for Hypervisor Connection ID og New Catalog ID – de er nødvendige for at skriptet skal fungere

I Studio, gå til Hosting og finn tilkoblingsnavnet som kobler maskinene dine til Hypervisor, og skriv deretter navnet inn i følgende kommando:

$HypervisorConnectionUid = (Get-BrokerHypervisorConnection -Name <Replace with connection Name>).Uid 

Ta også tak i navnet på den(e) nye katalogen(e) du nettopp opprettet og mat den inn i følgende kommando:

$CatalogUID = (Get-BrokerCatalog -Name "Replace with new Catalog Name").Uid

Hvis du har mer enn én geografisk plassering og ønsker å skille katalogene dine deretter, kan du hente UIDen til hver katalog du oppretter – i mitt tilfelle trengte jeg å lage 2 kataloger, en for hver datasenterside 

$CatalogUID_C = (Get-BrokerCatalog -Name "Replace with new Catalog Name").Uid
$CatalogUID_Z = (Get-BrokerCatalog -Name "Replace with new Catalog Name").Uid

Koble til Vmware hvis det ikke allerede er koblet til:

Connect-VIServer -Server <vCenter_FQDN> -User <username>

For å iscenesette migreringen, kan en tag opprettes og tildeles maskinene som er klare til å migreres. I Studio oppretter du en ny tag, f.eks. Migrate_MC, og tildeler etter behov til maskiner.

Deretter vil skriptet ta en tilfeldig Delivery Controller (eller Cloud Connector) og velge den som principle AdminAddress – i følgende funksjon, erstatt med DDC eller CC tilsvarende:

Function Get-a-XAbroker {    
    
    Add-PSSnapin * -ErrorAction SilentlyContinue     
    #List of XML brokers
    $DDCs = "DDC1","DDC2","DDC3","DDC4"
        foreach ($controller in $DDCs | Sort-Object {Get-Random})   {
            $Error.Clear()
            Get-BrokerController -AdminAddress $controller | Out-Null
                if ($Error.Count -eq 0) { break }
                } 
                if ($error.Count -gt 0) {continue}; 
            $SelectedDDC = $controller        
            return $SelectedDDC
}

$adminaddress = Get-a-XAbroker

Deretter tar vi tak i listen over maskiner som har blitt merket av deg med «Migrate_MC»-taggen (for å indikere at de er klare for migrering) 

$ListOfMachines = Get-brokermachine -AdminAddress $adminaddress -MaxRecordCount 5000 -Tag "Migrate_MC"  

Nå skjer magien! Vi går inn i listen over maskiner og gjør følgende for hver maskin:

  • Ta tak i den tilordnede brukeren, gjeldende Delivery Group navn, gjeldende katalog og maskinnavnet uten domene
  • Få hostedmachineID og VMHost fra Vmware
  • Fjern maskinen fra gjeldende leveringsgruppe
  • Fjern maskinen fra gjeldende maskinkatalog
  • I tilfelle du har mer enn å være vert for geografiske lokasjoner, kan det være lurt å ha en egen katalog for hver og derfor vil du sørge for at Maskin A som er vert på vert B går til katalog C mens Maskin X som er vert på vert Y går til katalog Z osv. . 
  • Legg til maskinen på nytt i den gamle leveringsgruppen
  • Legg til brukeren(e) på maskinen på nytt
<#
 .Synopsis
    Script to migrate Citrix XenDesktop VDAs Between Catalogs on the fly with Powershell
 .DESCRIPTION
    The script gather several variables and pass them to the logic to complete the work        
 .NOTES
    ===========================================================================
     Created on:   	17/09/2021
     Created by:   	Amir Joseph Sayes - Twitter @amirjsa
     Organization: 	Ninaronline.co.uk	 
 #>

#Add snapins
Add-PSSnapin * -ErrorAction SilentlyContinue  

#Variables
$HypervisorConnectionUid = (Get-BrokerHypervisorConnection -Name <Replace with connection Name>).Uid 
$CatalogUID_C = (Get-BrokerCatalog -Name "Replace with new Catalog Name").Uid
$CatalogUID_Z = (Get-BrokerCatalog -Name "Replace with new Catalog Name").Uid

Connect-VIServer -Server <vCenter_FQDN> -User <username>



Function Get-a-XAbroker {    
    
    Add-PSSnapin * -ErrorAction SilentlyContinue     
    #List of XML brokers
    $DDCs = "DDC1","DDC2","DDC3","DDC4"
        foreach ($controller in $DDCs | Sort-Object {Get-Random})   {
            $Error.Clear()
            Get-BrokerController -AdminAddress $controller | Out-Null
                if ($Error.Count -eq 0) { break }
                } 
                if ($error.Count -gt 0) {continue}; 
            $SelectedDDC = $controller        
            return $SelectedDDC
}

$adminaddress = Get-a-XAbroker

$ListOfMachines = Get-brokermachine -AdminAddress $adminaddress -MaxRecordCount 5000 -Tag "Migrate_MC"  


$ListOfMachines |% { 

    #Grab the currently assigned user, the current delivery group name, current catalog and the machine name without domain 
    $AssignedUser = @($($_.AssociatedUserNames))
    $CurrentDeliveryGroupName = $($_.DesktopGroupName)
    $currentCatalogUID = $($_.CatalogUid)
    $HostedMachineName = ($_.machinename -split "\\")[1] 
    $machinename = $_.machinename

    ###Get the hostedmachineID and the VMHost from Vmware
    $HostedmachineID = (Get-View -id (get-vm $HostedMachineName).id).config.uuid
    $VMHost = (get-vm $HostedMachineName).VMHost

    ######Remove the machine from the current delivery group 
    Remove-BrokerMachine $_.MachineName -DesktopGroup $CurrentDeliveryGroupName -ErrorAction SilentlyContinue -Force


    #####Remove the machine from the current machine catalog 
    Remove-BrokerMachine -MachineName $_.MachineName -ErrorAction SilentlyContinue -Force

        #In case you have more than hosting geographical locations, 
        #you may want to have a separate catalog for each and hence want to make 
        #sure that Machine A hosted on Host B goes to Catalog C while Machine X hosted on host Y goes to catalog Z etc.. 
        if ($VMHost -like "*HostC*") {            
            New-BrokerMachine -CatalogUid $CatalogUID_C -MachineName $_.MachineName  -HypervisorConnectionUid $HypervisorConnectionUid -HostedMachineId $HostedmachineID
        }
        else {            
            New-BrokerMachine -CatalogUid $CatalogUID_Z -MachineName $_.MachineName  -HypervisorConnectionUid $HypervisorConnectionUid -HostedMachineId $HostedmachineID
        }



    #Re-add the machine to the old Delivery Group 
    Add-BrokerMachine -MachineName $_.MachineName -DesktopGroup $CurrentDeliveryGroupName  

    #Re-add the user(s) to the machine 
    $AssignedUser | % {
    New-BrokerUser -Name $($_) | Add-BrokerUser -PrivateDesktop $machinename 
    }

}

Similar Posts