VMware PowerCLIを使用したアプリケーション配布
〇今回のBlogの内容
vExperts Advent Calendar 2022 の12/22分の投稿です。
■VMware PowerCLIを使用したアプリケーション配布
VMware PowerCLIを使用したアプリケーション配布をご紹介します。
MSのConfiguration Managerなど有償ツールがなくとも、簡単にvSphere上のVMにアプリケーションを配布できます。
PowerCLIを使うメリットとしては、次です。
・コマンドライン、スクリプトで大量のVMを操作できる(GUIだと大量のVM管理は時間がかかる)
(ネットワーク経由の配布より短時間で確実に実行)
・隔離されたネットワーク環境でのパッチ適用
デメリットは、少しコマンドやスクリプトの知識が必要なぐらいです。
大規模環境のVMへの変更やデプロイ、VMotionなどもPowerCLIのほうが楽だったりします。
(今回はWindows10でやっていますが、Windows ServerやLinuxなどでも似たようなことは出来ます。)
■VMware PowerCLIのざっくり説明
前述のとおりコマンドラインで、VMの管理ができます。vCenter、ESXi自体の管理も可能です。
基本的には、vCenterに接続して使いますが、ESXiに直接接続して使うこともできます。
実際はもっといろんなことができるので詳しく知りたい方はこの辺を読んでみてください。
Online Documentation - PowerCLI User's Guide - VMware {code}
■実行の流れ
次のような流れでアプリケーションを配布できます。今回はMSパッチをタスクスケジュールも組み合わせて実行します。
①vCenterに接続
②VMにISOをマウント
③MSパッチ適用(タスクスケジュール)
■事前準備
事前準備としてこの辺が必要です。記事が長くなるので参考URLを見てください。
・接続元PCにPowerCLIをインストール
・MSパッチのダウンロード
・スクリプト作成
・ISO作成
〇接続元PCにPowerCLIをインストール
〇MSパッチのダウンロード
https://www.catalog.update.microsoft.com/Search.aspx?q
適用したいKBを検索してダウンロードします。
〇スクリプト準備
スクリプトは主に2種類です。
超シンプルなので、適当に書き換えてください。
スクリプト1: qu_install.bat (MSパッチ適用)
スクリプト2: sctasks202212181530.bat(タスクスケジュール設定)
・スクリプト1: qu_install.bat の中身
--
"D:\kb5020030x64.msu" /quiet /norestart
--
・スクリプト2: sctasks202212181530.bat の中身
--
schtasks /create /tn quinstall /tr "d:\qu_install.bat" /ru system /rl highest /F /sc once /st 15:30 /sd 2022/12/18
--
スクリプト2補足:”quinstall”というタスク名で”2022/12/18 15:30”に”d:\qu_install.bat”を開始する設定になっています。私の環境では負荷分散のため開始時間30分ずつずらした"sctasks202212181600.bat"、"sctasks202212181630.bat"も作っています。(開始時間をランダムにして分散もおすすめ)
〇ISO作成してVMFSへアップロード
MSパッチとスクリプトを固めてISOにして対象VMからアクセスできるVMFSへアップロードします。
〇対象VMの設定
・VMwareToolsのインストール(お決まりなので割愛)
今回、タスクスケジュールをログオフ中でも実行したいため、system権限を使用します。事前に対象VMのUACを無効化しますが、セキュリティ的には良くないので、評価環境など問題ないところで試してください。
※UAC無効化、有効化は、事前のマスタVMへの作りこみや少し手順を工夫すると、セキュリティ的な問題を回避するやり方がいくつかあります。今回は手順が複雑になるのでシンプルに無効化して説明します。
UAC無効化HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
\CurrentVersion\policies\system\EnableLUA
データ: 0 = UAC無効
参考
■実際の手順
①vCenterに接続
②VMにISOをマウント
③MSパッチ適用(タスクスケジュール)
①vCenterへ接続
Powershellを起動し、Connect-VIServer でvCenterへ接続します。
Connect-VIServer -Server <vCenterのIPアドレス or FQDN> -User Administrator@vsphere.local -Password <パスワード>
②VMにISOをマウント
対象となるVMにMSパッチとスクリプトを入れたISOをマウントします。
Get-VM -Name <VM名> | Get-CDDrive| Set-CDDrive -Connected $true -IsoPath ' <ISOへのパス>' -Confirm:$false
実行例.
--
Get-VM -Name Win10_1 | Get-CDDrive| Set-CDDrive -Connected $true -IsoPath ' [datastore1] ISO/kb5020030x64_sc.iso' -Confirm:$false
Get-VM -Name Win10_2 | Get-CDDrive| Set-CDDrive -Connected $true -IsoPath ' [datastore1] ISO/kb5020030x64_sc.iso' -Confirm:$false
Get-VM -Name Win10_3 | Get-CDDrive| Set-CDDrive -Connected $true -IsoPath ' [datastore1] ISO/kb5020030x64_sc.iso' -Confirm:$false
--
③MSパッチ適用(タスクスケジュール)
ここでは、Invoke-VMScriptを使用したタスクスケジュールの登録を行います。
・変数設定
--
$sctasks1 = "d:\sctasks202212181530.bat”
$sctasks2 = "d:\sctasks202212181600.bat”
$sctasks3 = "d:\sctasks202212181630.bat”
--
・Invoke-VMScript実行例(Win10_1、Win10_2、Win10_3へ実行)
--
Invoke-VMScript -VM Win10_1 -GuestUser "<VM上の管理者アカウント>" -GuestPassword "<対象アカウントのパスワード>" -ScriptText $sctasks1
Invoke-VMScript -VM Win10_2 -GuestUser "<VM上の管理者アカウント>" -GuestPassword "<対象アカウントのパスワード>" -ScriptText $sctasks2
Invoke-VMScript -VM Win10_3 -GuestUser "<VM上の管理者アカウント>" -GuestPassword "<対象アカウントのパスワード>" -ScriptText $sctasks3
--
正しく、タスクスケジュールが設定できると次のように”成功”と戻ってきます。
実際にVMに入るとこんな感じでタスクスケジュールが作成されます。
指定の時間にタスクスケジュールが開始しインストールが始まるのを待ちましょう。
■実行結果確認
実行結果もPowerCLIで確認できます。
次の手順ではSysteminfoの実行結果を手元の端末にコピーします。
--
$systeminfo_win10_1 = "systeminfo > c:\d\Hotfix_win10_1.txt"
Invoke-VMScript -VM Win10_1 -GuestUser "<VM上の管理者アカウント>" -GuestPassword "<対象アカウントのパスワード>" -ScriptText $systeminfo_win10_1
Copy-VMGuestFile -GuestToLocal -VM win10_1 -GuestUser "<VM上の管理者アカウント>"-GuestPassword "<対象アカウントのパスワード>" -Source "c:\d\Hotfix_win10_1.txt" -Destination "E:\log\"
--
・PowerCLiを実行した端末のE:\log\ にこんな感じでファイルをもってこれます。
今回のKB5020030が適用されたことが確認できました。
■おまけ
登録したタスクスケジュール(今回だとquinstall)は時間を待たずとも実行することもできます。
実行例
--
$runtasks = "schtasks /Run /TN quinstall"
Invoke-VMScript -VM Win10_1 -GuestUser "<VM上の管理者アカウント>" -GuestPassword "<対象アカウントのパスワード>" -ScriptText $runtasks
--