かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.119 実行中じゃないVMも自動更新したい|Azure Update Managerでサーバー更新管理(8)

 

 

vol.119 実行中じゃないVMも自動更新したい|Azure Update Managerでサーバー更新管理(8)

2025年07月07日配信
2025年07月07日更新
執筆者:山内 和朗

 前回(vol.118)は、Azure Update Managerのメンテナンス構成のイベント(メンテナンスイベント)オプションと、Azure AutomationのハイブリッドWorkerを、Webhookを使用して連携させ、事前/事後のカスタム管理タスクを更新対象のマシン側で実行する方法を紹介しました。事前/事後に実行したい管理タスクとしては、前回紹介したように、更新対象の仮想マシン(VM)のオン/オフ制御もあります。それはVMのゲストOS側ではなく、VMをホストしている環境から実行する必要があります。

 

普段は割り当て解除状態のAzure VMを自動更新するには

 

 この連載シリーズではこれまで、Azure Update Managerのメンテナンス構成を使用した更新の自動運用に関しては、常時稼働を前提としたマシンを対象にしてきました。そのため、オンプレミスのHyper-V VMを連続稼働させ、その検証をしてきました。更新対象がAzure VMの場合も、パッチオーケストレーションとして「カスタマーマネージドスケジュール(Customer Managed Schedules)」を選択し、メンテナンス構成を作成して添付すれば、全く同じように運用できます(画面1)。

 

 画面1 Azure VMでメンテナンス構成を使用する場合は、パッチオーケストレーションとして「カスタマーマネージドスケジュール(Customer Managed Schedules)」を(または「Azureマネージド-安全なデプロイ」)を選択する
画面1 Azure VMでメンテナンス構成を使用する場合は、パッチオーケストレーションとして「カスタマーマネージドスケジュール(Customer Managed Schedules)」を(または「Azureマネージド-安全なデプロイ」)を選択する

 私はAzure VMを検証用に利用しているため、使用していないときはコンピューティング料金が発生しない割り当て解除状態にしています。毎月、Windows Updateのために数時間オン/オフして利用しています。しかし、前回前々回に説明したAzure AutomationのRunbookを使用すれば、Azure VMの起動、更新プログラムのインストール(および再起動)、そしてAzure VMをシャットダウンして割り当て解除できることに気付きました。前回はハイブリッドWorkerを使用しましたが、Azureのリソースなので、Runbookの実行場所としてAzure(既定)を指定すればよいのです。

 Azure VMのオン/オフを制御するために、次の2つのPowerShell Runbook(ランタイムバージョンはAzure推奨の7.2)を作成しました。スクリプトの内容を詳しく説明することはしませんが、Runbook startazvmは、パラメーターとしてリソースグループとVM名を指定して、Azureで実行することで、指定したVMを起動します(画面2、画面3)。Runbook stopazvmは、同じようにパラメーターを指定することで、指定したVMを停止し、割り当て解除状態にします(画面4)。どちらのRunbookも、VMの現在の状態を取得し、必要がなければ(既に実行中、既に割り当て解除状態)、何もしません。分かりやすくするためにコードをシンプルにしていますが、完全に実行状態になるまで待機して終了(事前イベントの要件は20分以内)するコードを追加すると良いと思います。

 

PowerShell Runbook startazvmプレーンテキストで表示)

#Parameters
param(
    [Parameter(Mandatory=$true)]
    [string] $ResourceGroupName,

    [Parameter(Mandatory=$true)]
    [string] $VMName
)

#Azure Authentication
try {
    $AzureConnection = (Connect-AzAccount -Identity).context
}
catch {
    Write-Output "There is no system-assigned user identity. Aborting." 
    exit
}

#Get status of Azure VM
$vm = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -Status
$powerState = $vm.Statuses | Where-Object { $_.Code -like "PowerState/*" } | Select-Object -ExpandProperty DisplayStatus

#Start Azure VM
if ($powerState -eq "VM stopped" -or $powerState -eq "VM deallocated") {
    Write-Output "Starting VM '$VMName'..."
    Start-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName
}
else {
    Write-Output "VM '$VMName' is already running or in transition. No action taken."
}

 

PowerShell Runbook stoptazvmプレーンテキストで表示)

#Parameters
param(
    [Parameter(Mandatory=$true)]
    [string] $ResourceGroupName,

    [Parameter(Mandatory=$true)]
    [string] $VMName
)

#Azure Authentication
try {
    $AzureConnection = (Connect-AzAccount -Identity).context
}
catch {
    Write-Output "There is no system-assigned user identity. Aborting." 
    exit
}

#Get status of Azure VM
$vm = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -Status
$powerState = $vm.Statuses | Where-Object { $_.Code -like "PowerState/*" } | Select-Object -ExpandProperty DisplayStatus

#Shutdown & dealocate Azure VM
if ($powerState -eq "VM running") {
    Write-Output "Stopping and deallocating VM '$VMName'..."
    Stop-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -Force
}
elseif ($powerState -eq "VM deallocated" -or $powerState -eq "VM stopped") {
    Write-Output "VM '$VMName' is already deallocated."
}
else {
    Write-Output "VM '$VMName' is in unexpected state: $powerState. No action taken."
}

 

画面2 Azure VM開始用のRunbookのパラメーターにリソースグループ名とVM名を入力し、実行対象をAzureにして開始する

画面2 Azure VM開始用のRunbookのパラメーターにリソースグループ名とVM名を入力し、実行対象をAzureにして開始する

 

画面3 Azure VM開始用のRunbookが実行すると、指定したAzure VMが割り当て解除状態から、開始中になり、その後、実行中に切り替わる
画面3 Azure VM開始用のRunbookが実行すると、指定したAzure VMが割り当て解除状態から、開始中になり、実行中に切り替わる

 

画面4 Azure VM停止用のRunbookを実行すると、指定したAzure VMが停止され、再び割り当て解除状態になる
画面4 Azure VM停止用のRunbookを実行すると、指定したAzure VMが停止され、再び割り当て解除状態になる

 これらのRunbookにWebhookを追加して、パラメーター(リソースグループとVM名)と実行場所(Azure)を設定し、Azure Update Managerのメンテナンス構成の事前/事後イベントから呼び出せば、毎月人が介在しなくても、Azure VMのOSを最新状態に保てるようになります(画面5、画面6)。

 

画面5 Azure VMのメンテナンス構成にイベントサブスクリプションを追加し、Webhook経由で事前/事後にAzure VM開始用/停止用Runbookを呼び出すように設定する
画面5 Azure VMのメンテナンス構成にイベントサブスクリプションを追加し、Webhook経由で事前/事後にAzure VM開始用/停止用Runbookを呼び出すように設定する

 

画面6 2025年6月のBリリース(日本時間6月11日)の日に、メンテナンス構成によってスケジュールされた更新のインストール前後に自動開始/停止(割り当て解除)されたAzure VMのアクティビティログ

画面6 2025年6月のBリリース(日本時間6月11日)の日に、メンテナンス構成によってスケジュールされた更新のインストール前後に自動開始/停止(割り当て解除)されたAzure VMのアクティビティログ

 

オンプレサーバー/Azure VMでホストされているHyper-V VMはハイブリッドWorkerで

 

 Azure Update Managerで管理されているマシンが、Hyper-V上のVMの場合で、Hyper-Vを実行するマシンがハイブリッドWorkerとして利用できる場合は、同様のことをHyper-V VMにも実装することができます。先ほど、RunbookをAzureで起動したAzure VM(MyLab-HVHost)ではHyper-Vを有効化し、Hyper-V VMを作成してあるので、その環境でテストしてみました。

 

 Hyper-V VMのオン/オフを制御するために、次の2つのPowerShell Runbook(ランタイムバージョンはWindows標準の5.1)を作成しました。このRunbookのスクリプトは、Azure VM用のスクリプトと同様の処理をHyper-V用に書き換えたものです(画面7)。Azureへの接続は必要ありません。Azure PowerShellのコマンドレットを、Hyper-V PowerShellモジュールのコマンドレットに置き換えています。そして、パラメーターとしてはVMのIDを渡すようにしています。Azure VMの名前は変更されることはありませんが、Hyper-V VMの名前は自由に変更できます。変更の可能性を考慮して、VM固有のIDにしました。VMのIDは、Get-VM | Select Name, Idを実行することで確認できます。

 

PowerShell Runbook starthvvmプレーンテキストで表示)

#Parameters
param(
    [Parameter(Mandatory=$true)]
    [string] $VMId
)

#Check VMId
$ret = get-vm |Where {$_.Id -eq $VMId}
if ($ret -eq $null) {
    Write-Output "VM not found. Aborting."
}

#Get status of Hyper-V VM and start it
$VMName = $ret.Name
$ret = Get-VM -Name $VMName
if(($ret.State -eq "Off") -or ($ret.State -eq "Saved")) {
  Write-Output "Starting VM '$VMName'..."
  Start-VM -Name $VMName
} else {
  Write-Output "VM '$VMName' is already running or in transition. No action taken."
}


 

PowerShell Runbook stophvvmプレーンテキストで表示)

#Parameters
param(
    [Parameter(Mandatory=$true)]
    [string] $VMId
)

#Check VMId
$ret = get-vm |Where {$_.Id -eq $VMId}
if ($ret -eq $null) {
    Write-Output "VM not found. Aborting."
}

#Get status of Hyper-V VM and save it
$VMName = $ret.Name
$ret = Get-VM -Name $VMName
if($ret.State -eq "Running") {
   rite-Output "Stopping VM '$VMName'..."
  Stop-VM -Name $VMName -Save
} else {
  Write-Output "VM '$VMName' is already stopped. No action taken."
}

 

aun08_scr07

画面7 RunbookをハイブリッドWorkerで実行して、ハイブリッドWorkerのマシン上のHyper-V VMのオン/オフを制御する

 

Azure Update Managerでサーバ更新管理 (1)(2)(3)(4)(5)(6)(7)|(8)

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事