Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

PowerShellでVMware上のWindows VMテンプレートを自動更新する方法

VMwareで新しい仮想マシンを展開する際には、通常「VMテンプレート」が使用されます。VMwareのVMテンプレートとは、必要な設定、インストール済みソフトウェア、セキュリティ更新プログラムがあらかじめ適用された、参照用の仮想マシンのコピーです。テンプレートから展開される仮想マシンの品質を維持するためには、管理者が定期的にテンプレートを最新の状態に保つことが重要です。具体的には、以下のようなメンテナンスが挙げられます。

  • Windowsセキュリティ更新プログラムの適用(少なくとも月1回)
  • システムおよびアプリケーションのアップデート
  • ウイルス対策ソフトの定義ファイル更新

VMware VMテンプレート更新の基本的な流れ

VMware上のVMテンプレートを手動で更新する場合、一般的には次の3段階の手順を実行します。

  1. コンテンツライブラリ内のテンプレートを仮想マシンに変換する。
  2. 仮想マシンを起動し、管理者がログオンしてWSUS経由で承認済みのWindows更新プログラムを適用したり、必要なソフトウェアを更新したりする。
  3. 更新完了後、仮想マシンを再起動し、シャットダウンしてから再びテンプレートに変換し直す。

この一連の作業を毎月手動で行うのは大きな負担です。本記事では、PowerShellとPowerCLIを活用してこれらの作業を自動化し、手動操作なしでVMwareの仮想マシンテンプレートにWindows更新プログラムを適用する方法を紹介します。

事前に必要な環境

スタンドアロンのWindowsイメージや配布メディアに対して使われるオフライン更新の統合手法は、VMwareの仮想マシンにはそのまま適用できません。代わりに、PowerCLIを使って稼働中のゲストOS内部に直接更新プログラムをインストールします。

この方法では、仮想マシンテンプレート側に以下が準備されていることを前提とします。

  • VMware Toolsがインストール済みであること
  • PowerShell 4.0以降がインストールされていること
  • PSWindowsUpdateモジュールがインストールされていること
  • スクリプト実行ポリシーにより、ゲストOS内でPowerShellスクリプトの実行が許可されていること

テンプレート更新を自動化するPowerCLIスクリプト

以下のPowerCLIスクリプトを使用すると、VMwareテンプレートの仮想マシンへの変換から、WSUS経由のセキュリティ更新適用、テンプレートへの復元までを一括して自動実行できます。

# PowerCLIモジュールのインポート
Import-Module VMware.VimAutomation.Core -ErrorAction SilentlyContinue
# vCenterへ接続
Connect-VIServer de-vcenter1
$TemplateVMName = "Win2016StdTemplate"
# テンプレートを仮想マシンへ変換
Set-Template -Template $TemplateVMName -ToVM -Confirm:$false -RunAsync
# 60秒待機
Start-Sleep -s 60
# 仮想マシンを起動
Start-VM -VM $TemplateVMName | Get-VMQuestion | Set-VMQuestion -DefaultOption -Confirm:$false
Start-Sleep -s 120
# 暗号化されたファイルから管理者資格情報を取得(パスワードをスクリプト内に平文で保存しないため)
$adminname = "administrator"
$Pwd = Get-Content C:\Scripts\VMWare\vm_admin_passfile.txt | ConvertTo-SecureString
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $adminname, $Pwd
# VMware Tools経由でゲストOS内の利用可能なすべての更新プログラムをインストール(ログはC:\temp\Update.logに保存)
Invoke-VMScript -ScriptType PowerShell -ScriptText "Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -AutoReboot" -VM $TemplateVMName -GuestCredential $Cred | Out-File -FilePath C:\temp\Update.log -Append
Start-Sleep -s 1800
# VMware Toolsのバージョンを更新
Update-Tools -VM $TemplateVMName -NoReboot
# DISMでWinSxSコンポーネントストアをクリーンアップし、イメージを最適化
Invoke-VMScript -ScriptType PowerShell -ScriptText "Dism.exe /Online /Cleanup-Image /StartComponentCleanup /ResetBase" -VM $TemplateVMName -GuestCredential $Cred
Start-Sleep -s 1800
# 仮想マシンを強制再起動
Restart-VMGuest -VM $TemplateVMName -Confirm:$false
# 仮想マシンをシャットダウンしてテンプレートに戻す
Shutdown-VMGuest -VM $TemplateVMName -Confirm:$false -RunAsync
Start-Sleep -s 180
Set-VM -VM $TemplateVMName -ToTemplate -Confirm:$false

このスクリプトでは、対象の仮想マシンがDHCPサーバーからIPアドレスを取得できる仮想ネットワーク上に配置されていることを前提としています。また、仮想マシン内のWSUS設定はGPOではなく、レジストリで直接構成されているものとします。

PowerShellでVMware上のWindows VMテンプレートを自動更新する方法

タスクスケジューラで月次自動化する

このPowerShellスクリプトをタスクスケジューラに登録すれば、毎月「Patch Tuesday(米国時間第2火曜日)」の数日後に、テンプレートへの更新プログラム適用を自動的に実行できます。こうしておけば、VMwareテンプレートから新しい仮想マシンを展開する際に、常に最新のMicrosoftセキュリティ更新プログラムが適用された状態であることを保証でき、運用負荷も大幅に軽減されます。

  1. Windows 10でPowerShellを使ってインストール済みプログラムの一覧を作成する方法

    Windows 10のPCを長く使っていると、知らないうちに多くのプログラムがインストールされており、すべてを覚えておくのは意外と難しいものです。Windows PowerShellを使えば、コンピューターにインストールされているプログラムの一覧を簡単に生成でき、さまざまな場面で活用できます。たとえば、新しいPCをセットアップするときに「必要なソフトウェアのインストール漏れがないか」を確認したいときなどに便利です。本記事では、Windows 10でPowerShellを使ってインストール済みプログラムを確認する手順をわかりやすく解説します。PowerShellでインストール済みプログラムの一覧

  2. Windows 10の右クリックメニューで「PowerShell」を「コマンドプロンプト」に戻す方法

    Windows 10のCreators Update(クリエーターズアップデート)を適用した後、フォルダ上でShiftキーを押しながら右クリックすると、以前あった「コマンドウィンドウをここで開く」という項目が「PowerShellウィンドウをここで開く」に置き換わっていることに気づいた方も多いのではないでしょうか。PowerShellの存在自体を知らないユーザーにとっては、いきなりこの機能を使えと言われても戸惑うばかりです。 また、スタートメニューのコマンドプロンプトもPowerShellに置き換えられましたが、こちらはWindowsの設定から元に戻すことが可能です。しかし残念ながら、右クリッ