この記事は更新から24ヶ月以上経過しているため、最新の情報を別途確認することを推奨いたします。
はじめに
本記事ではCitrix Cloud with AVD環境におけるセッションホストサーバのイメージを自動更新する方法について記載したいと思います。Citrix Cloudにおいてはマスターイメージをもとにマシンカタログを作成し、セッションホストサーバを展開する流れとなり、Citrixの管理画面にてマシンカタログのマシンイメージを更新することも可能です。しかしながら管理画面上での操作ではどうしても手動更新となってしまい運用の負荷がかかる為、なるべく運用の負荷を下げるためにイメージを自動更新する方法について検証しました。
基本方針
管理画面での操作では自動更新する方法が見当たらない為、CitrixのPowerShellを用いてPowerShellスクリプトを作成し、そのスクリプトを適当なサーバに配置しタスクスケジューラにて自動実行する方針とします。マシンカタログの更新に使用できるAzure上のリソースとしては、管理ディスク、イメージリソース、スナップショットなどが有りますが今回はマスターイメージ用Azure仮想マシンの管理ディスクを使用します。
スクリプトの処理の概要
今回のスクリプトではCitrixに対する操作は勿論のことですが、Azureのリソースを参照する都合上Azureに対する操作も発生します。そのため、Citrix環境へのログイン処理とAzure環境へのログイン処理が何れも必要となります。この点も踏まえて、スクリプトの処理の流れは概ね以下となります。
・Azure へのログイン処理
・Citrixへのログイン処理
・イメージ更新に使用する管理ディスクリソースの取得
・更新対象となるマシンカタログの取得
・イメージ更新処理の実行
前提条件
本記事においてはCitrix Cloud with AVD環境の構築が完了していることを前提とします。
事前準備
スクリプト作成前に以下の事前準備作業が必要となります。
・Azure ログイン用のサービスプリンシパルの作成
・Citrix ログイン用のAPIの作成と認証情報の保存
・スクリプト実行用サーバにCitrix SDKをインストール
・スクリプト実行用サーバにAzure PowerShell Moduleをインストール
それぞれの準備作業について見ていきます。
①Azure ログイン用のサービスプリンシパルの作成
Azure サブスクリプションが関連付けられているAzure ADにてサービスプリンシパルを作成します。今回はAzureログイン用にサービスプリンシパルを使用しますが、勿論Azureログインに関してはその他の方法で実装しても問題ございません。
・Azure Portalにログインし、Azure ADの画面を開きます。
・「アプリの登録」をクリックします。
・「新規登録」をクリックします。
・「名前」に任意の名前を入力し、「登録」をクリックします。
・後程スクリプト作成時に使用するので、「アプリケーションID」と「テナントID」を控えます。その後、「証明書とシークレット」をクリックします。
・「新しいクライアントシークレット」をクリックします。
・「説明」および「有効期限」を任意で設定し、「追加」をクリックします。
・後程スクリプト作成時に使用するので作成したクライアントシークレットの「値」を控えます。
②Citrix ログイン用のAPIの作成と認証情報の保存
・Citrixログイン用にAPIアクセスを作成します。Citrixの管理ポータルにログインし、「IDおよびアクセス管理」を開き「APIアクセス」をクリックします。
・「セキュアクライアントの名前を入力」に任意の名前を入力し、「クライアントの作成」をクリックします。
・「ダウンロード」をクリックします。
・「secureclient.csv」というファイルがダウンロードされます。後程スクリプトを作成する際に使用するので控えておきます。
③スクリプト実行用サーバにCitrix SDKをインストール
スクリプト実行用サーバにてCitrixのPowerShellコマンドレットを使用できるようにする必要が有ります。そのためCitrixのSDKをインストール必要が有ります。その手順については以下のCitrix社の公式サイトに詳しい記載が有りますのでこちらを参考に対応します。本記事では詳細な手順については割愛いたしますが、基本的にダウンロードページから「Virtual Apps and Desktops Remote PowerShell SDK」をダウンロードして実行すればインストールは完了します。
https://docs.citrix.com/ja-jp/citrix-daas/sdk-api.html
④スクリプト実行用サーバにAzure PowerShell Moduleをインストール
次にスクリプト実行用サーバでAzure のPowerShell コマンドレットを使用する為、Azure PowerShellのModuleをインストールします。この手順については詳細はマイクロソフト社の公式ページを参照することとして、本記事では詳細な手順は割愛します。
https://docs.microsoft.com/ja-jp/powershell/azure/install-az-ps?view=azps-6.6.0
スクリプト作成
事前準備が整いましたら、PowerShellスクリプトを準備します。
①Azure へのログイン処理
Azureへのログイン処理については以下のスクリプトで実現できます。
#Azureログイン情報
$clientid = “先程作成したサービスプリンシパルのアプリケーションIDを指定”
$tenantid = “Azure AD のテナントIDを指定”
$password = “先程作成したクライアントシークレットの「値」を指定”
#認証キャッシュのクリア
Clear-AzContext -Force
#認証情報の構築
$securepassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($clientid, $securepassword)
#Azure へ接続
Connect-AzAccount -ServicePrincipal -Credential $credential -Tenant $tenantid
②Citrixへのログイン処理
先程ダウンロードした「secureclient.csv」ファイルをログイン処理において使用するので、スクリプト実行用サーバの任意の場所(本手順では「C:\ScriptFiles」)に保存します。そのうえで、Citrixへのログイン処理については以下のスクリプトで実現できます。
#Citrixログイン
Set-XDCredentials -SecureClientFile C:\ScriptFiles\secureclient.csv -CustomerId <Citrixの顧客ID> -ProfileType CloudAPI –StoreAs “prod”
Get-XDAuthentication –ProfileName “prod”
Add-PSSnapin Citrix*
※Citrixの顧客IDはCitrix管理画面の「IDおよびアクセス管理」の以下箇所にて確認可能です。
③イメージ更新に使用する管理ディスクリソースの取得
イメージ更新に使用する管理ディスクリソースに関するAzureの各種パラメータを設定し、ディスクを取得します。ディスクの取得自体は「Get-AzDisk」コマンドレットを使用します。
#OSDiskを指定
$ResourceGroupName = “ディスクリソースが存在するリソースグループ名”
$LocationName = “ディスクリソースのリージョン(例:Japaneast)”
$BaseDiskName = “ディスクリソースのディスク名”
$newdisk = Get-AzDisk -ResourceGroupName $ResourceGroupName -DiskName $BaseDiskName
④更新対象となるマシンカタログの取得
Citrixの各種パラメータを設定し、更新対象となるマシンカタログを取得します。マシンカタログの取得自体は「Get-ProvScheme」コマンドレットを使用します。
#マシン更新の準備
$ResourceGroup = “Citrix管理ポータル上のリソースグループ名”
$MCName = “更新対象のマシンカタログ名”
$AzureNetworkName = “Citrix管理ポータル上のネットワーク名”
$Diskname = $newdisk.Name
$MasterImage = “XDHyp:\HostingUnits\$AzureNetworkName\image.folder\$ResourceGroup.resourcegroup\$Diskname.manageddisk”
Set-ProvSchemeMetadata -Name “ImageManagementPrep_DoImagePreparation” -ProvisioningSchemeName $MCName -Value “True”
$ProvScheme = Get-ProvScheme -ProvisioningSchemeName $MCName
※注意点としてここで指定するリソースグループ名やネットワーク名はAzureでの名称ではなくCitrixでの名称を使用するということです。万が一Azureでの名称とは異なる名称をCitrixで使用している場合は誤った名称を記載しないようにしましょう。具体的にはCitrix管理画面の「ホスト」の以下箇所にて確認することができます。
⑤イメージ更新処理の実行
以上で準備が整いましたので最後に「Publish-ProvMasterVMImage 」コマンドレットにてイメージを更新します。
#更新
Publish-ProvMasterVMImage -MasterImageVM $MasterImage -ProvisioningSchemeName $MCName
スクリプトまとめ
改めて各種パラメータには仮の値を入力したスクリプト全体を以下に記載します。
#Azureログイン情報
$clientid = “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”
$tenantid = “XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX”
$password = “XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX”
#認証キャッシュのクリア
Clear-AzContext -Force
#認証情報の構築
$securepassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($clientid, $securepassword)
#Azure へ接続
Connect-AzAccount -ServicePrincipal -Credential $credential -Tenant $tenantid
#Citrixログイン
Set-XDCredentials -SecureClientFile C:\ScriptFiles\secureclient.csv -CustomerId XXXXXXXXXXXX -ProfileType CloudAPI –StoreAs “prod”
Get-XDAuthentication –ProfileName “prod”
Add-PSSnapin Citrix*
#OSDiskを指定
$ResourceGroupName = “AVD-RG”
$LocationName = “Japaneast”
$BaseDiskName = “avdvm001-osdisk”
$newdisk = Get-AzDisk -ResourceGroupName $ResourceGroupName -DiskName $BaseDiskName
#マシン更新の準備
$ResourceGroup = “AVD-RG”
$MCName = “mc-avd-01”
$AzureNetworkName = “AVD-Vnet”
$Diskname = $newdisk.Name
$MasterImage = “XDHyp:\HostingUnits\$AzureNetworkName\image.folder\$ResourceGroup.resourcegroup\$Diskname.manageddisk”
Set-ProvSchemeMetadata -Name “ImageManagementPrep_DoImagePreparation” -ProvisioningSchemeName $MCName -Value “True”
$ProvScheme = Get-ProvScheme -ProvisioningSchemeName $MCName
#更新
Publish-ProvMasterVMImage -MasterImageVM $MasterImage -ProvisioningSchemeName $MCName
最後に
以上、Citrix Cloud with AVDにおけるイメージの自動更新方法について記載致しました。この内容がCitrix環境に管理の負荷軽減に少しでも役立てば幸いです。