↩️

Azure Arc を利用してオンプレサーバでリモートからスクリプトを実行する

2024/01/20に公開

はじめに

Azure Arc を利用すると、オンプレ サーバで各種 Azure 管理機能が利用できます。今回は Azure Arc にオンボーディングしたオンプレ サーバでリモートからスクリプトを実行する方法を検証します。

スクリプトを実行する方法

Azure サービスでリモートでスクリプトを実行する方法はいくつかあります。
https://learn.microsoft.com/ja-jp/azure/virtual-machines/windows/run-scripts-in-vm

このうち、Azure Arc 経由で利用できるのは Azure Automation の Hybrid Runbook Worker とカスタム スクリプト拡張機能です。
Hybrid Runbook Worker は指定したグループ内のマシンのうち、いずれか 1 台でスクリプトを実行し、そこからオンプレ内の各サーバにコマンド実行を指示するような用途で使用します。そのため、実行指示は 1 回で終わるものの、オンプレサーバ間でリモート アクセスを許可する必要があります。
カスタム スクリプト拡張機能は各マシンで指定したパスのスクリプトを実行します。こちらは各マシンで実行指示する必要があるものの、Azure - マシン間で完結するメリットがあります。今回はこちらのカスタム スクリプト拡張機能を利用します。

Azure ポータル経由で実行

カスタム スクリプト拡張機能の説明はこちらです。ただしこちらは Azure VM 前提のため、Azure Arc 経由でのオンプレ サーバ用に読み替えます。
https://learn.microsoft.com/ja-jp/azure/virtual-machines/extensions/custom-script-windows

まずスクリプトを配置します。今回はストレージ アカウントから読み込む構成とするため、以下のように配置し、後ほど ARM テンプレート経由で実行できるように SAS を取得します。


次に Azure ポータルからカスタム スクリプト拡張機能をインストールします。
Azure Arc マシンのページから対象のマシンを選択し、[拡張機能] > [+追加] > [Custom Script Extension for Windows - Azure Arc] をクリックします。


[参照] からストレージ アカウント内のスクリプトを指定します。




[確認と作成] をクリックし、実行します。


実行後、カスタム スクリプト拡張機能を確認すると、実行結果が表示されます。スクリプト実行後の出力についても状態メッセージ欄に表示されます。

なお、カスタム スクリプト拡張機能を再度利用したい場合はアンインストールせず、再度インストール手順を実行すれば OK です。

ARM テンプレートで実行

上記の Azure ポータルの場合、1 台ずつ操作が必要となるため、次は ARM テンプレートを利用して Azure PowerShell から実行できるようにします。
以下のようにマシン名をパラメータとした ARM テンプレートを作成します。

template.json
{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "arcSvName": {
            "type": "string",
            "metadata": {
                "description": "The name of the VM."
            }
        }
    },
    "resources": [
        {
            "type": "Microsoft.HybridCompute/machines/extensions",
            "apiVersion": "2021-05-20",
            "name": "[concat(parameters('arcSvName'), '/CustomScriptExtension')]",
            "location": "japaneast",
            "properties": {
                "publisher": "Microsoft.Compute",
                "type": "CustomScriptExtension",
                "autoUpgradeMinorVersion": true,
                "protectedSettings": {
                    "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File script.ps1 ",
                    "fileUris": [
                        "https://storagexxxxx.blob.core.windows.net/script/script.ps1?sp=r&st=2023-11-29T07:22:45Z&se=2023-12-28T15:22:45Z&spr=https&sv=2022-11-02&sr=b&sig=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
                    ]
                }
            }
        }
    ],
    "outputs": {
        "message": {
          "type": "string",
          "value": "[reference(resourceId('Microsoft.HybridCompute/machines/extensions', parameters('arcSvName'), 'CustomScriptExtension')).instanceView.status.message]"
        }
    }
}

"commandToExecute" の script.ps1 を実行するスクリプト名、 "fileUris" をスクリプトの SAS に置き換えます。

次に以下のような PowerShell で ARM テンプレートを実行します。

# 定義されたパラメータとしてマシン名を指定
$arcSvName = "xxxxxx"

# ARM テンプレートのパスを指定
$templateFile = "C:\tmp\ExecCustomScriptExtensionToArcSv\template.json"

# リソースグループと場所を指定
$resourceGroupName = "rg-xxxxx"

# ログイン
Connect-AzAccount -Subscription "xxxxxxxxxxxxxxxxxxxxxxxxx"

# テンプレートを使ってデプロイ
$response = New-AzResourceGroupDeployment -Name ExecCustomScriptExtensionToArcSv -ResourceGroupName $resourceGroupName -TemplateFile $templateFile -TemplateParameterObject @{ arcSvName = $arcSvName }

# デプロイ結果のメッセージを表示
$response.Outputs.message.value

実行すると以下のようにメッセージ出力が表示されます。


また、以下のクエリを用いると Azure Resource Graph からも出力メッセージが確認可能です。

resources
| where type =~ "Microsoft.HybridCompute/machines/extensions"
| where name =~ "CustomScriptExtension"
| extend OutputMessage = properties.instanceView.status.message
| parse id with * "machines/" ResourceName "/extensions/" *
| project ResourceName, OutputMessage

まとめ

今回はカスタム スクリプト拡張機能を使用してリモートからオンプレ サーバでスクリプトを実行する方法を検証しました。ARM テンプレート + PowerShell を使用すれば、一度に複数マシンで実行することも可能になります。
理想としてはグループ ポリシーのように一つの設定で対象マシンすべてで実行されるのが望ましいのですが、現状 Azure ではそのような機能は備わっていないため、今回のような方法が現時点での選択肢かと思います。

Microsoft (有志)

Discussion