マネージド実行コマンドを使用して Linux VM でスクリプトを実行する

注意

この記事では、間もなくサポート終了 (EOL) 状態になる Linux ディストリビューションである CentOS について説明します。 適宜、使用と計画を検討してください。 詳細については、「CentOS のサポート終了に関するガイダンス」を参照してください。

適用対象: ✔️ Linux VM ✔️ フレキシブルなスケール セット

重要

マネージド実行コマンドは現在、Azure CLI、PowerShell、API で使用できます。 ポータル機能はまもなく利用できるようになります。

実行コマンド機能では、仮想マシン (VM) エージェントを使用して Azure Linux VM 内でスクリプトが実行されます。 これらのスクリプトは、マシンやアプリケーションの一般的な管理に使用できます。 これらを使用すれば、VM のアクセスおよびネットワークの問題を迅速に診断して修正し、VM を良好な状態に戻すことができます。

"更新された" マネージド実行コマンドでは、同じ VM エージェント チャネルを使用してスクリプトを実行し、元のアクション指向実行コマンドに対して次の拡張機能を提供します。

  • ARM デプロイ テンプレートを介して更新された実行コマンドをサポート
  • 複数のスクリプトの並列実行
  • スクリプトの順次実行
  • ユーザーが指定したスクリプトのタイムアウト
  • 実行時間が長い (時間または日単位) のスクリプトをサポート
  • 安全な方法でシークレット (パラメーター、パスワード) を渡す

前提条件

サポートされる Linux ディストリビューション

Linux ディストリビューション x64 ARM64
Alma Linux 9.x 以降 サポートされていません
CentOS 7.x - 8.x サポートされていません
Debian 10+ サポートされていません
Flatcar Linux 3374.2.x+ サポートされていません
Azure Linux 2.x サポートされていません
openSUSE 12.3+ サポートされていません
Oracle Linux 6.4+、7.x+、8.x+ サポートされていません
Red Hat Enterprise Linux 6.7+、7.x+、8.x+ サポートされていません
Rocky Linux 9.x 以降 サポートされていません
SLES 12.x+、15.x+ サポートされていません
Ubuntu 18.04+、20.04+、22.04+ サポートされていません

実行コマンドへのアクセスの制限

実行コマンドを一覧表示したり、コマンドの詳細を表示したりするには、サブスクリプション レベルの Microsoft.Compute/locations/runCommands/read アクセス許可が必要です。 組み込みの閲覧者ロール以上のレベルには、このアクセス許可があります。

コマンドの実行には、Microsoft.Compute/virtualMachines/runCommand/write アクセス許可が必要です。 仮想マシンの共同作成者ロール以上のレベルには、このアクセス許可があります。

実行コマンドを使用するには、いずれかの組み込みロールを使用するか、カスタム ロールを作成します。

Azure CLI

次の例では、az vm run-command を使用して、Azure Azure Linux VM 上でシェル スクリプトを実行します。

VM でスクリプトを実行する

このコマンドを実行すると、スクリプトが VM に配信されて実行され、キャプチャされた出力が返されます。

az vm run-command create --name "myRunCommand" --vm-name "myVM" --resource-group "myRG" --script "echo Hello World!"

VM 上にデプロイされているすべての RunCommand リソースを一覧表示する

このコマンドからは、以前にデプロイされた実行コマンドと、それらのプロパティの完全な一覧が返されます。

az vm run-command list --vm-name "myVM" --resource-group "myRG"

実行の状態と結果を取得する

このコマンドを実行すると、現在の実行の進行状況 (最新の出力、開始/終了時刻、終了コード、および実行の終了状態など) が取得されます。

az vm run-command show --name "myRunCommand" --vm-name "myVM" --resource-group "myRG" --expand instanceView

注意

instanceView の出力およびエラー フィールドは、最後の 4 KB に制限されています。 完全な出力とエラーにアクセスする場合は、Set-AzVMRunCommand または Set-AzVMssRunCommand を使用して実行コマンドを実行するときに、-outputBlobUri-errorBlobUri パラメーターを使用して、出力およびエラー データをストレージ追加 BLOB に転送するオプションがあります。

VM から RunCommand リソースを削除する

VM に以前にデプロイされた RunCommand リソースを削除します。 スクリプトの実行がまだ進行中の場合は、実行が終了されます。

az vm run-command delete --name "myRunCommand" --vm-name "myVM" --resource-group "myRG"

PowerShell

VM でスクリプトを実行する

このコマンドを実行すると、スクリプトが VM に配信されて実行され、キャプチャされた出力が返されます。

Set-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -Location "EastUS" -RunCommandName "RunCommandName" –SourceScript "echo Hello World!"

SourceScriptUri パラメーターを使用して VM でスクリプトを実行する

OutputBlobUriErrorBlobUri は省略可能なパラメーターです。

Set-AzVMRunCommand -ResourceGroupName -VMName -RunCommandName -SourceScriptUri “< SAS URI of a storage blob with read access or public URI>" -OutputBlobUri “< SAS URI of a storage append blob with read, add, create, write access>” -ErrorBlobUri “< SAS URI of a storage append blob with read, add, create, write access>”

VM 上にデプロイされているすべての RunCommand リソースを一覧表示する

このコマンドからは、以前にデプロイされた実行コマンドと、それらのプロパティの完全な一覧が返されます。

Get-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM"

実行の状態と結果を取得する

このコマンドを実行すると、現在の実行の進行状況 (最新の出力、開始/終了時刻、終了コード、および実行の終了状態など) が取得されます。

Get-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName" -Expand instanceView

SourceScriptURI (ストレージ BLOB SAS URL) を使用して VM で実行コマンドを作成または更新する

PowerShell スクリプトを含むストレージ BLOB の SAS URL を使用して、Windows VM で実行コマンドを作成または更新します。 SourceScriptUri には、ストレージ BLOB の完全な SAS URL またはパブリック URL を指定できます。

注意

SAS URL は、BLOB への読み取りアクセスを提供する必要があります。 SAS URL の有効期限は 24 時間にすることをお勧めします。 SAS URL は、BLOB のオプションを使用して Azure portal で生成するか、または New-AzStorageBlobSASToken を使用して SAS トークンを生成することができます。 New-AzStorageBlobSASToken を使用して SAS トークンを生成する場合、SAS URL は次のようになります。"ベース BLOB URL" + "?" + "New-AzStorageBlobSASToken からの SAS トークン"

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptURI>

実行コマンドの作成または更新後に VM の実行コマンド インスタンス ビューを取得する

インスタンス ビューを使用して VM の実行コマンドを取得します。 インスタンス ビューには、実行コマンドの実行状態 (Succeeded、Failed など)、終了コード、標準出力、および実行コマンドを使用してスクリプトを実行することで生成された標準エラーが含まれます。 0 以外の ExitCode は、失敗した実行を示します。

$x = Get-AzVMRunCommand -ResourceGroupName MyRG -VMName MyVM -RunCommandName MyRunCommand -Expand InstanceView
$x.InstanceView

予想される出力:

ExecutionState   : Succeeded
ExecutionMessage :
ExitCode         : 0
Output           :   
output       : uid=0(root) gid=0(root) groups=0(root)
                   HelloWorld

Error            :
StartTime        : 10/27/2022 9:10:52 PM
EndTime          : 10/27/2022 9:10:55 PM
Statuses         :

InstanceView.ExecutionState -ユーザーの実行コマンド スクリプトの状態。 スクリプトが成功したかどうかを確認するには、この状態を参照します。

ProvisioningState - 一般的な拡張機能のプロビジョニングのエンドツーエンドの状態 (拡張機能プラットフォームが実行コマンドスクリプトをトリガーできたかどうか)。

SourceScript (スクリプト テキスト) を使用して VM で実行コマンドを作成または更新する

スクリプト コンテンツを -SourceScript パラメーターに直接渡す VM で実行コマンドを作成または更新します。 複数のコマンドを区切るには、; を使います。

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand2 -Location EastUS2EUAP -SourceScript "id; echo HelloWorld"

SourceCommandId を使用して VM で実行コマンドを作成または更新する

既存の commandId を使用して、VM で実行コマンドを作成または更新します。 使用可能な commandId は、Get-AzVMRunCommandDocument を使用して取得できます。

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceCommandId ipconfig

OutputBlobUri、ErrorBlobUri を使用して VM で実行コマンドを作成または更新し、標準出力と標準エラー メッセージを出力およびエラー追加 BLOB にストリーミングする

VM で実行コマンドを作成または更新し、標準出力と標準エラー メッセージを出力およびエラー追加 BLOB にストリーミングします。

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand3 -Location EastUS2EUAP EastUS2EUAP -SourceScriptUri <SourceScriptUri> -OutputBlobUri <OutputBlobUri> -ErrorBlobUri <errorbloburi>

Note

出力およびエラー BLOB は AppendBlob 型である必要があり、SAS URL は BLOB への読み取り、追加、作成、書き込みアクセスを提供する必要があります。 SAS URL の有効期限は 24 時間にすることをお勧めします。 出力またはエラー BLOB が存在しない場合は、AppendBlob 型の BLOB が作成されます。 SAS URL は、BLOB のオプションを使用して Azure portal で生成するか、または New-AzStorageBlobSASToken を使用して SAS トークンを生成することができます。 New-AzStorageBlobSASToken を使用して SAS トークンを生成する場合、SAS URL は、次のようになります。ベース BLOB URL + "?" + New-AzStorageBlobSASToken からの SAS トークン。

VM で実行コマンドを作成または更新し、RunAsUser および RunAsPassword パラメーターを使用して別のユーザーとして実行コマンドを実行する

VM で実行コマンドを作成または更新し、RunAsUser および RunAsPassword パラメーターを使用して別のユーザーとして実行コマンドを実行する。 RunAs が正常に機能するには、VM の管理者にお問い合わせいただき、VM にユーザーが追加されていること、ユーザーが実行コマンド (ディレクトリ、ファイル、ネットワークなど) によってアクセスされたリソースにアクセスできること、また、Windows VM の場合は、VM で "セカンダリ ログオン" サービスが実行されていることをご確認ください。

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP EastUS2EUAP -SourceScriptUri <SourceScriptUri> -RunAsUser myusername -RunAsPassword mypassword

SourceScriptUri (ストレージ BLOB SAS URL) を使用して、Virtual Machine Scale Sets リソースで実行コマンドを作成または更新します。

bash スクリプトを含むストレージ BLOB の SAS URL を使用して、Virtual Machine Scale Sets リソースで実行コマンドを作成または更新します。

Set-AzVmssVMRunCommand -ResourceGroupName MyRG0 -VMScaleSetName MyVMSS -InstanceId 0 -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri>

注意

SAS URL は、BLOB への読み取りアクセスを提供する必要がある点にご注意ください。 SAS URL の有効期限は 24 時間にすることをお勧めします。 SAS URL は、BLOB のオプションを使用して Azure portal で生成するか、または New-AzStorageBlobSASToken を使用して SAS トークンを生成することができます。 New-AzStorageBlobSASToken を使用して SAS トークンを生成する場合、SAS URL は次のようになります。ベース BLOB URL + "?" + New-AzStorageBlobSASToken からの SAS トークン。

Parameter および ProtectedParameter パラメーター (スクリプト化するパブリック パラメーターと保護されたパラメーター) を使用して VM インスタンスで実行コマンドを作成または更新する

$PublicParametersArray = @([Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='publicParam1';value='publicParam1value'},
>> [Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='publicParam2';value='publicParam2value'})

$ProtectedParametersArray = @([Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='secret1';value='secret1value'},
>> [Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='secret2';value='secret2value'})

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri> -Parameter $PublicParametersArray -ProtectedParameter $ProtectedParametersArray

パスワード、キーなどの機密性の高い入力をスクリプトに渡すには、ProtectedParameter を使用します。

  • Windows: 引数がスクリプトに渡され、次のように実行されるため、Parameter と ProtectedParameter がスクリプトに渡されます myscript.ps1 -publicParam1 publicParam1value -publicParam2 publicParam2value -secret1 secret1value -secret2 secret2value
  • Linux: 名前付きパラメーターとその値は、.sh スクリプト内でアクセスできる環境構成に設定されます。 Nameless 引数の場合は、空の文字列を name 入力に渡します。 Nameless 引数はスクリプトに渡され、次のように実行されます myscript.sh publicParam1value publicParam2value secret1value secret2value

VM から RunCommand リソースを削除する

VM に以前にデプロイされた RunCommand リソースを削除します。 スクリプトの実行がまだ進行中の場合は、実行が終了されます。

Remove-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName"

REST API

新しい実行コマンドをデプロイするには、VM 上で PUT を直接実行し、実行コマンド インスタンスに一意の名前を指定します。

GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands?api-version=2019-12-01
{ 
"location": "<location>", 
"properties": { 
    "source": { 
        "script": "Write-Host Hello World!", 
        "scriptUri": "<SAS URI of a storage blob with read access or public URI>",  
        "commandId": "<Id>"  
        }, 
    "parameters": [ 
        { 
            "name": "param1",
            "value": "value1" 
            }, 
        { 
            "name": "param2", 
            "value": "value2" 
            } 
        ], 
    "protectedParameters": [ 
        { 
            "name": "secret1", 
            "value": "value1" 
            }, 
        { 
            "name": "secret2", 
            "value": "value2" 
            } 
        ], 
    "runAsUser": "userName",
    "runAsPassword": "userPassword", 
    "timeoutInSeconds": 3600, 
    "outputBlobUri": "< SAS URI of a storage append blob with read, add, create, write access>", 
    "errorBlobUri": "< SAS URI of a storage append blob with read, add, create, write access >"  
    }
}

Notes

  • 入力ソースとして、インライン スクリプト、スクリプト URI、または組み込みのスクリプト コマンド ID を指定できます。 スクリプト URI は、読み取りアクセス権を持つストレージ BLOB SAS URI またはパブリック URI のいずれかです。
  • 1 回のコマンド実行でサポートされるソース入力は 1 種類だけです。
  • 実行コマンドでは、outputBlobUri パラメーターと errorBlobUri パラメーターを使用したストレージ BLOB への出力とエラーの書き込みがサポートされています。これは、大きなスクリプト出力の格納に使用できます。 読み取り、追加、作成、書き込みアクセス権を持つストレージ追加 BLOB の SAS URI を使用します。 BLOB は AppendBlob 型である必要があります。 そうでない場合、スクリプト出力またはエラー BLOB の書き込みが失敗します。 BLOB が既に存在する場合は上書きされます。 存在しない場合は作成されます。

VM 上で実行中の、実行コマンドのインスタンスを一覧表示する

GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands?api-version=2019-12-01

特定の実行コマンドのデプロイについて出力の詳細を取得する

GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?$expand=instanceView&api-version=2019-12-01 

特定の実行コマンドのデプロイを削除する

実行コマンドのインスタンスを削除する

DELETE /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?api-version=2019-12-01 

順序付けられたシーケンスでスクリプトをデプロイする

スクリプトを順番にデプロイするには、デプロイ テンプレートを使用して、シーケンシャル スクリプト間に dependsOn リレーションシップを指定します。

{ 
    "type":"Microsoft.Compute/virtualMachines/runCommands",
    "name":"secondRunCommand",
    "apiVersion":"2019-12-01",
    "location":"[parameters('location')]",
    "dependsOn":<full resourceID of the previous other Run Command>,
    "properties":{
        "source":{
            "script":"echo Hello World!" 
        },
        "timeoutInSeconds":60
    }
}

複数の実行コマンドを順番に実行する

デプロイ テンプレートを使用して複数の RunCommand リソースをデプロイする場合、既定では、それらは VM 上で同時に実行されます。 スクリプト同士に依存関係があり、実行の優先順序が設定されている場合は、dependsOn プロパティを使用してそれらを順番に実行することができます。

この例では、firstRunCommand が実行されてから、secondRunCommand が実行されます。

{
   "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion":"1.0.0.0",
   "resources":[
      {
         "type":"Microsoft.Compute/virtualMachines/runCommands",
         "name":"[concat(parameters('vmName'),'/firstRunCommand')]",
         "apiVersion":"2019-12-01",
         "location":"[parameters('location')]",
         "dependsOn":[
            "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
         ],
         "properties":{
            "source":{
               "script":"echo First: Hello World!"
            },
            "parameters":[
               {
                  "name":"param1",
                  "value":"value1"
               },
               {
                  "name":"param2",
                  "value":"value2"
               }
            ],
            "timeoutInSeconds":20
         }
      },
      {
         "type":"Microsoft.Compute/virtualMachines/runCommands",
         "name":"[concat(parameters('vmName'),'/secondRunCommand')]",
         "apiVersion":"2019-12-01",
         "location":"[parameters('location')]",
         "dependsOn":[
            "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'),'runcommands/firstRunCommand')]"
         ],
         "properties":{
            "source":{
               "scriptUri":"http://github.com/myscript.ps1"
            },
            "timeoutInSeconds":60
         }
      }
   ]
}

次のステップ

VM においてリモートでスクリプトやコマンドを実行するその他の方法の詳細については、「Linux VM でスクリプトを実行する」を参照してください。