Monthly Virtualization Blog

仮想化関連(特にVMUG)の記事をアップします。投稿は個人の見解であり、所属する組織を代表するものではありません。

VMware PowerCLIを使用したアプリケーション配布

〇今回のBlogの内容

vExperts Advent Calendar 2022 の12/22分の投稿です。

  

VMware PowerCLIを使用したアプリケーション配布

VMware PowerCLIを使用したアプリケーション配布をご紹介します。

         

MSのConfiguration Managerなど有償ツールがなくとも、簡単にvSphere上のVMにアプリケーションを配布できます。

 

PowerCLIを使うメリットとしては、次です。

コマンドラインスクリプトで大量のVMを操作できる(GUIだと大量のVM管理は時間がかかる)

インストーラをISOでVMに直接マウントできる

(ネットワーク経由の配布より短時間で確実に実行)

・隔離されたネットワーク環境でのパッチ適用

(NICを切断した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作成

・対象VMの設定(レジストリ変更)

 

〇接続元PCにPowerCLIをインストール

https://developer.vmware.com/docs/15315/powercli-user-s-guide/GUID-ACD2320C-D00F-4CCE-B968-B3C41A95C085.html

 

〇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のインストール(お決まりなので割愛)

レジストリ変更(UAC)

今回、タスクスケジュールをログオフ中でも実行したいため、system権限を使用します。事前に対象VMUACを無効化しますが、セキュリティ的には良くないので、評価環境など問題ないところで試してください。

UAC無効化、有効化は、事前のマスタVMへの作りこみや少し手順を工夫すると、セキュリティ的な問題を回避するやり方がいくつかあります。今回は手順が複雑になるのでシンプルに無効化して説明します。

 

UAC無効化HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
\CurrentVersion\policies\system\EnableLUA

データ: 0 = UAC無効

 

参考

https://learn.microsoft.com/ja-jp/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings

 

■実際の手順

①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

--