Skip to the main content.

ScriptRunner Blog

Citrix PVS-Maschinen mit PowerShell erstellen

Inhaltsverzeichnis

Post Featured Image

Ich habe bereits in einem anderen Beitrag beschrieben, wie man neue Citrix MCS (Machine Creation Services) Maschinen erstellt, wofür man lediglich Citrix Studio Cmdlets braucht. Für PVS dagegen müssen wir die PowerShell-Cmdlets für den verwendeten Hypervisor verwenden, was in diesem Beitrag VMware vSphere sein wird, Citrix PVS-Cmdlets, um das Gerät zu PVS hinzuzufügen, und dann Studio-Cmdlets, um die neuen Maschinen zu einem Maschinenkatalog und damit zu einer Bereitstellungsgruppe hinzuzufügen.

Zu diesem Zweck benötigen wir eine Maschine, idealerweise keinen PVS-Server oder Delivery Controller, auf der VMware PowerCLI, Citrix Studio und die PVS-Konsole installiert sind, da wir so alle benötigten Cmdlets erhalten.

Mit PowerShell 3.0 und höher können Sie stattdessen implizites Remoting verwenden, um Module von einem Remotecomputer zu importieren, vorausgesetzt, die Remoteverwaltung ist eingerichtet, sodass sie nicht lokal installiert werden müssen.

Beachten Sie, dass wir dies für die Studio-Cmdlets für unseren Anwendungsfall hier nicht tun können, da wir Zugriff auf das PowerShell-Laufwerk XDHyp: benötigen, das vom Citrix.Host-Snapin/-Modul erstellt wird, und PS-Laufwerke leider nicht mit implizitem Remoting funktionieren.

 
 

Virtuelle Maschinen erstellen

Anders als bei MCS, wo die Studio-Cmdlets die neuen VMs erstellen, müssen wir bei PVS die neuen VMs selbst mit den Hypervisor-Cmdlets erstellen. Dieser Artikel geht nicht auf Mechanismen zum Auffinden unbenutzter Maschinennamen ein, deren Existenz bzw. Nichtvorhandensein im Hypervisor, PVS, Studio und Active Directory überprüft werden muss. Prinzipiell ist es jedoch möglich und kommt beim automatischen Hinzufügen und Entfernen von Maschinen zum Tragen.

In vSphere habe ich zuvor eine Vorlage für meine PVS-Maschinen (Server 2019) erstellt, die die erforderliche CPU, den Arbeitsspeicher und die NICs zugewiesen hat und eine 40-GB-Festplatte für die Ereignisprotokolle konfiguriert hat, damit sie persistent sind, sowie für den RAM-Cache-Überlauf und die Auslagerungsdatei. Das New-VM-Cmdlet benötigt ein Handle auf diese Vorlage, also holen wir es zuerst so:

Import-Module -Name VMware.VimAutomation.Core -Verbose:$false
Connect-VIServer -Server yourvcenter
$template = Get-Template -Name $templateName

Wobei $templateName der Name oder das Muster für eine eindeutige vSphere-Vorlage ist. In einem Skript würden wir überprüfen, dass $template nicht null und auch kein Array ist, da letzteres bedeutet, dass wir keine einzelne, eindeutige Vorlage haben, sodass der New-VM-Aufruf fehlschlägt.

Damit New-VM erfolgreich ist, müssen wir zumindest einen Ressourcenpool (abgerufen über Get-ResourcePool) und einen Speicherort (abgerufen über Get-Folder) angeben. In dem vollständigen Skript, das ich zum Erstellen neuer PVS-Geräte geschrieben habe, kann ein bestehendes PVS-Gerät angegeben werden, dessen Ressourcenpool und Speicherort für diese Parameter in New-VM verwendet werden.

$newVM = New-VM -Template $template -Name $newMachine
-Description $descripticon -ResourcePool $resourcePool
-Location $folder

Der Code läuft synchron, d. h. er antwortet erst, wenn die VM-Erstellung abgeschlossen ist. Da die Vorlage eine meist leere Thin-Provisioned-Platte verwendet, sollte die Erstellung nicht lange dauern.

Er könnte über den Parameter -RunAsync auch asynchron ausgeführt werden, aber das würde den Rahmen dieses Artikels sprengen, da wir sicherstellen müssen, dass er abgeschlossen ist, bevor wir mit den nächsten Schritten fortfahren. Stellen Sie sicher, dass $newVM nicht null ist, was bedeuten würde, dass die Erstellung fehlgeschlagen ist, bevor Sie fortfahren.

Maschinen zu PVS hinzufügen

Um die neu erstellte VM zu PVS hinzuzufügen, benötigen wir die MAC-Adresse für die NIC, die von einem PVS-Server booten wird. Wir machen das so:

$NICs = Get-NetworkAdapter -VM $newVM

Beachten Sie, dass wir überprüfen müssen, dass nur eine NIC zurückgegeben wird – mein vollständiges Skript hat einen optionalen Parameter eines Netzwerknamens, nach dem wir die NICs filtern können, falls nötig. Beachten Sie auch, dass VMware MAC-Adressen mit einem : Trennzeichen zurückliefert, PVS aber ein  Trennzeichen benötigt, was mit -replace leicht zu beheben ist.

Die MAC-Adresse ist nur eine der Informationen, die wir als Parameter übergeben müssen. Ich verwende oft eine Technik namens „splatting“, um Argumente an Cmdlets/Funktionen zu übergeben. Diese ermöglicht es, Parameter in einer Hashtabelle zu erstellen und dann die Hashtabelle anstelle von oder zusätzlich zu regulären Argumenten zu übergeben. Eine Beispiel-Hashtabelle, die an New-PVSDevice übergeben wird, könnte lauten:


Tab. 1: Sample hashtable
Name Value
SiteName Wakefield
DeviceMac 00-50-56-bd-57-4e
Description Citrix PVS machine
CollectionName XenApps
DeviceName GLXA19PVS021

Die dann wie folgt übergeben wird:

Set-PvsConnection -Server yourpvsserver
$newPVSDevice = New-PvsDevice @pvs
$newPVSDevice = New-PvsDevice @pvsdeviceParameters

Wobei die Hash-Tabelle $pvsdeviceParameters heißt und zu beachten ist, dass Benutzername, Domänenname und Passwort bei Bedarf an Set-PVSConnection übergeben werden können (z. B. wenn der Benutzer, der das Script ausführt, keine ausreichenden PVS-Rechte hat. Seien Sie aber vorsichtig bei der Speicherung/Übergabe von Klartextpasswörtern).

Angenommen, der Aufruf war erfolgreich, dann haben wir jetzt ein neues PVS-Gerät, dem allerdings noch kein PVS-Boot-Datenträger zugewiesen ist. Dies tun wir mit Add-PvsDiskLocatorToDevice und fügen es dann dem Active Directory hinzu, indem wir Add-PvsDeviceToDomain aufrufen, das die Argumente DeviceName und OrganizationUnit entgegennimmt, wobei letzteres die OU in einer durch Schrägstrich begrenzten Form erfordert, z. B. „Sites/Wakefield/Computers/RDS/PVS“.

Nach erfolgreichem Abschluss dieser Schritte sollte das Gerät in der PVS-Konsole in der ausgewählten Site und Collection erscheinen (die bereits existieren oder über New-PvsSite bzw. New-PvsCollection neu angelegt worden sein können).

Maschinen zu einem Katalog hinzufügen

Dies ist der mühsamste Schritt im Prozess, denn um die Maschine zu Studio hinzuzufügen, müssen wir die Hosted Machine ID für die neu hinzugefügte VM kennen, die wir über die Hypervisor-Verbindung durch das XDHyp: PS-Laufwerk erhalten. Dies wird mit dem Get-ChildItem Cmdlet erreicht, das Sie wahrscheinlich schon über einen seiner Aliase – „dir“ oder „ls“ – verwendet haben. (siehe Abbildung 1).

Screenshot: PowerShell ISE

Abb. 1: Ausgabe von Get-ChildItem

Beachten Sie, dass wir -AdminAddress übergeben, um das Cmdlet anzuweisen, nur auf einem bestimmten Delivery Controller zu laufen, wie wir es für alle Studio-Cmdlets tun. Idealerweise sollte dies über Splatting geschehen.

Außerdem wird -Verbose:$false übergeben, damit das Cmdlet keine ausführliche Ausgabe erzeugt, selbst wenn das enthaltende Script mit -verbose oder der integrierten Variablen $verbosePreference auf „Continue“ aufgerufen wurde.

Jetzt können wir New-BrokerMachine mit der Uid des Maschinenkatalogs aufrufen, in den die Maschine aufgenommen werden soll (über Get-BrokerCatalog -Name), sowie mit dem Namen der neuen Maschine selbst, der ID der gehosteten Maschine aus Get-ChildItem oben und der Uid der Hypervisor-Verbindung, die wir ebenfalls aus Get-ChildItem erhalten:

Screenshot: PowerShell ISE

Abb. 2: Ausgabe von Get-ChildItem mit den zuvor genannten Parametern

Wenn dies erfolgreich war, ist die Maschine in Studio im ausgewählten Maschinenkatalog sichtbar, obwohl sie noch zu einer Liefergruppe hinzugefügt werden muss, was der letzte Schritt ist.

Maschinen zu einer Liefergruppe hinzufügen

Das Cmdlet zum Hinzufügen von Maschinen aus einem Katalog zu einer Bereitstellungsgruppe heißt Add-BrokerMachinesToDesktopGroup, aber seine Parameter enthalten nicht den/die Namen der hinzuzufügenden Maschinen – stattdessen teilen wir ihm den Quell-Maschinenkatalog, die Zielbereitstellungsgruppe und die Anzahl der Maschinen aus dem Katalog mit, die wir hinzufügen möchten, so wie Sie es eigentlich manuell über die Benutzeroberfläche in Studio tun würden.

Add-BrokerMachinesToDesktopGroup gibt die Anzahl der zur Auslieferungsgruppe hinzugefügten Maschinen zurück, sodass wir überprüfen, ob sie mit der Anzahl übereinstimmt, die wir über das -Count ARgument angefordert haben.

Die Auslieferungsgruppe in Studio sollte nun diese neu hinzugefügten Maschinen anzeigen, oder Sie können sie mit Get-BrokerMachine -DesktopGroupName abrufen:

Screenshot: PowerShell ISE

Fig. 3: Output from running Get-BrokerMachine -DesktopGroupName

Beispiel-Script: Neue PVS Maschinen erstellen

Damit Sie Ihr neu erworbenes Wissen direkt in die Tat umsetzen können, habe ich ein Beispiel-Script erstellt, das Sie von ScriptRunner’s GitHub herunterladen können.

Es ermöglicht Ihnen, neue Citrix PVS-Geräte aus einer VMware vSphere-Vorlage zu erstellen und sie optional zu einem Citrix-Maschinenkatalog und einer Bereitstellungsgruppe sowie optional zu einem veröffentlichten Desktop hinzuzufügen.

Das Script ist übrigens PowerShell Get-Help kompatibel. Wenn Sie weitere Fragen oder Feedback zu dem Script haben, können Sie uns gerne kontaktieren.

Script auf GitHub herunterladen

 

citrixactionpack-1ActionPack for Citrix

Getting started with PowerShell task automation is now even faster and easier with our new ScriptRunner ActionPack for Citrix!

200 ready-to-use PowerShell scripts are now freely available on the ScriptRunner GitHub repository.

Download for free from GitHub >

 

Zusammenhängende Posts

2 min read

VMUG Webcast: VMware Management meistern mit PowerCLI

5 min read

PowerShell mit Get-Help meistern

Über den Autor: