JavaScriptを有効にしてください

Automation Hybrid Runbook Worker V2 を試し隊

 ·   4 分で読めます  ·   Kento

今回は、Azure Automation の Hybrid Runbook Worker v2 を試してみました

Hybrid Runbook Worker

Azure Automation には PowerShell や Python など (Runbook と呼ばれる単位で管理) を実行する機能があります
通常は Azure のコンピューティング リソースを使って処理を実行します
そのため、サーバー内で PowerShell などのスクリプトを実行することができません
Hybrid Runbook Worker は、Runbook をサーバー内で実行できるようにするものです

従来の V1 は Log Analytics エージェントを使った仕組みで提供されていました
V2 では拡張機能ベースでの提供に変更されているため、Log Analytics エージェントは不要です

この機能を使って、Azure VM と Azure Arc enabled-Server (対応サーバー) にトースト通知を出してみました

ざっくり手順

  1. Hybrid Runbook Worker の作成
  2. Runbook の作成
  3. Runbook の実行

1. Hybrid Runbook Worker の作成

Azure Portal から Automation Account > ハイブリッド Worker グループ > [+ ハイブリッド Worker グループの作成] を選択します

portal01
Hybrid Runbook Worker の作成01:

適当な名前を付けて、マシンを追加し、作成します

portal02
Hybrid Runbook Worker の作成02:
portal03
Hybrid Runbook Worker の作成03:

ハイブリッド Worker グループというのは Runbook を実行するサーバーをグループ化したものです
以下の公開情報にある通り、このグループは負荷分散が目的です
今回は「各マシンにトースト通知を送信したい」です
同一グループにしてしまうと「負荷分散した結果、どれか1台だけでトースト通知を出す」ことになります
そのため、マシンごとにハイブリッド Worker グループを作成します

複数の Hybrid Runbook Worker を使用するハイブリッド worker グループは、複数の worker にジョブを割り当てることで、高可用性と負荷分散を実現するように設計されています。

Azure Automation Hybrid Runbook Worker の概要 | Microsoft Learn

↓ 同一グループで実行する場合のイメージ

graph LR
A[Automation Account] --> B((Hybrid Runbook Worker Group))
B -- いずれかで実行 --> C(Hybrid Runbook Worker 1)
B -- いずれかで実行 --> D(Hybrid Runbook Worker 2)
B -- いずれかで実行 --> E(Hybrid Runbook Worker 3)

↓ 各マシンで実行したい場合の構成

graph LR
A[Automation Account] --> B((Hybrid Runbook Worker Group1))
B -- いずれかで実行(1つだけなので確定) --> C(Hybrid Runbook Worker 1)
A --> D((Hybrid Runbook Worker Group2))
D -- いずれかで実行(1つだけなので確定) --> E(Hybrid Runbook Worker 2)

ということで、Azure VM 1台と Azure Arc enabled-Server 1台の Worker グループをそれぞれ作成しました

portal04
Hybrid Runbook Worker の作成04:
portal05
Hybrid Runbook Worker の作成05:
portal06
Hybrid Runbook Worker の作成06:

Automation Hybrid Runbook Worker V2 は拡張機能ベースなので、Azure VM, Azure Arc enabled-Server ともに拡張機能がインストールされています

portal07
Hybrid Runbook Worker の作成07:
portal08
Hybrid Runbook Worker の作成08:

2. Runbook の作成

プッシュ通知を送る Runbook (PowerShell スクリプト) を用意します
以下の構成で Runbook を 2 つ用意しました

graph TD;
    A[トースト通知トリガー用 Runbook on Azure 基盤] --> B[トースト通知の共通 Runbook  on Hybrid Runbook Worker Group1];
    A --> C[トースト通知の共通 Runbook on Hybrid Runbook Worker Group2];
    B --> E[Hybrid Runbook Worker 1 でトースト通知];
    C --> F[Hybrid Runbook Worker 2 でトースト通知];

トースト通知トリガー用 Runbook は以下の PowerShell です

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context

# Set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext

Write-Output "connect Azure"

# 通知を行うサーバーのグループを配列で定義
$workers = "AzureVM01", "ArcServer01"

# 通知内容
$jobParameters = @{"Title" = "トースト通知"; "Message" = "Hybrid Runbook から実行"; "detail" = "詳細は管理者に聞いて"}

# 通知を行う Hybrid Runbook Worker をサーバーの台数だけ繰り返し実行 
foreach ($item in $workers) {
    Start-AzAutomationRunbook -AutomationAccountName "runbook-auto" -Name "notification" -ResourceGroupName "test" -Parameters $jobParameters -RunOn $item
    Write-Output "トースト通知を $item に実行しました"
}

トースト通知用 Runbook は以下の PowerShell です

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Param(
    [Parameter(Mandatory=$true)][String] $title,
    [Parameter(Mandatory=$true)][String] $message,
    [Parameter(Mandatory=$true)][String] $detail
)

[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
[Windows.UI.Notifications.ToastNotification, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null

$app_id = '{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\WindowsPowerShell\v1.0\powershell.exe'
$content = @"
<?xml version="1.0" encoding="utf-8"?>
<toast>
<visual>
    <binding template="ToastGeneric">
        <text>$($title)</text>
        <text>$($message)</text>
        <text>$($detail)</text>
    </binding>
</visual>
</toast>
"@
$xml = New-Object Windows.Data.Xml.Dom.XmlDocument
$xml.LoadXml($content)
$toast = New-Object Windows.UI.Notifications.ToastNotification $xml
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($app_id).Show($toast)

トースト通知についてはこちらを参照させていただきました
私PowerShellだけどあなたにトーストを届けたい(プログレスバー付) #Windows - Qiita

Runbook 内で Hybrid Runbook Worker として実行するため Start-AzAutomationRunbook を -RunOn 付きで実行しています
そのため Automation Account のマネージド ID には Automation オペレーター ロールをつけています

portal09
マネージド ID:

3. Runbook の実行

それでは実行してみます
様子を GIF 画像で置いておきます
trigger runbook を実行
→ その中で notification runbook が2回実行
→ Azure VM と Azure Arc enabled-Server でトースト通知が表示

portal09
トースト通知のテスト:

まとめ

Automation の Hybrid Runbook Worker を初めて触りました
拡張機能だけで実行できるので、導入は簡単でした
Azure VM と Azure Arc enabled-Server の違いを特に意識することなく操作ができています

参考

共有

Kento
著者
Kento
2020年に新卒で IT 企業に入社. インフラエンジニア(主にクラウド)として活動中