Linux 仮想マシンで Azure カスタム スクリプト拡張機能 v2 を使用する

カスタム スクリプト拡張機能バージョン 2 は、スクリプトをダウンロードし、Azure Virtual Machines (VM) 上で実行します。 この拡張機能は、デプロイ後の構成、ソフトウェアのインストール、その他の構成タスクや管理タスクに役立ちます。 スクリプトは、Azure Storage や他のアクセス可能なインターネットの場所からダウンロードできます。または、実行時に拡張機能に提供することもできます。

カスタム スクリプト拡張機能は Azure Resource Manager テンプレートと統合します。 また、Azure CLI、PowerShell、または Azure Virtual Machines REST API を使って実行することもできます。

この記事では、Azure CLI からカスタム スクリプト拡張機能を使う方法と、Azure Resource Manager テンプレートを使って拡張機能を実行する方法について説明します。 また、Linux システムでのトラブルシューティング手順も示します。

次の 2 つの Linux カスタム スクリプト拡張機能があります。

  • バージョン 1: Microsoft.OSTCExtensions.CustomScriptForLinux
  • バージョン 2: Microsoft.Azure.Extensions.CustomScript

バージョン 2 を使用するには、新規および既存のデプロイを切り替えてください。 この新しいバージョンは、一時的な置き換えです。 移行は、名前とバージョンを変更するだけで簡単に行うことができます。 拡張機能の構成を変更する必要はありません。

前提条件

オペレーティング システム

Linux 用のカスタム スクリプト拡張機能は、サポートされているオペレーティング システムで動作します。 詳細については、「Azure で動作保証済みの Linux ディストリビューション」を参照してください。

スクリプトの場所

Azure Blob Storage の資格情報を使用して Azure Blob Storage にアクセスできるように拡張機能を設定できます。 スクリプトは、そのエンドポイント (GitHub や社内ファイル サーバーなど) に VM をルーティングできる限り、任意の場所に保存できます。

インターネット接続

GitHub または Azure Storage などからスクリプトを外部でダウンロードする必要がある場合は、ファイアウォールやネットワーク セキュリティ グループ (NSG) のポートを追加で開く必要があります。 たとえば、スクリプトが Azure Storage にある場合、Storage の Azure NSG サービス タグを使用することでアクセスを許可できます。

スクリプトがローカル サーバーにある場合でも、追加のファイアウォールまたは NSG ポートを開く必要があります。

ヒントとテクニック

  • この拡張機能のエラーで最も多い原因は、スクリプトの構文エラーです。 スクリプトがエラーを出さずに実行されるかどうかテストします。 エラーを見つけやすくするために、スクリプトにログを記録するように付け加えます。
  • 誤って複数回実行された場合でもシステムに変更が加えられないよう、べき等のスクリプトを作成してください。
  • スクリプトの実行時に、ユーザー入力を必要としないように作成してください。
  • スクリプトは、実行されるまでに 90 分かかることがあります。 これを超えると、拡張機能のプロビジョニングに失敗します。
  • スクリプト内で再起動を行わないでください。 この操作を行うと、インストールされている他の拡張機能に問題が発生し、再起動後に拡張機能が続行されません。
  • アプリケーションをインストールしてスクリプトを実行する前に再起動を引き起こすスクリプトがある場合は、Cron ジョブを使用するか、DSC、Chef、または Puppet 拡張機能などのツールを使用して、再起動をスケジュールします。
  • VM エージェントの停止または更新の原因となるスクリプトを実行しないでください。 実行すると拡張機能が遷移状態になり、タイムアウトにつながることがあります。
  • 拡張機能はスクリプトを 1 回だけ実行します。 起動するたびにスクリプトを実行する場合、cloud-init イメージと、Scripts Per Boot モジュールを使用できます。 または、systemd サービス ユニットを作成するためにスクリプトを使用することができます。
  • VM に適用できる拡張機能のバージョンは 1 つだけです。 2 つ目のカスタム スクリプトを実行するために、既存の拡張機能を新しい構成で更新できます。 または、カスタム スクリプト拡張機能を削除し、更新されたスクリプトを使用してそれを再適用できます。
  • スクリプトを実行する時期をスケジュールする場合は、拡張機能を使用して Cron ジョブを作成します。
  • スクリプトが実行されているとき、Azure portal または CLI には拡張機能の状態が「移行中」とだけ表示されます。 実行中のスクリプトのステータスをより高い頻度で更新するには、独自のソリューションを作成する必要があります。
  • カスタム スクリプト拡張機能は、ネイティブではプロキシ サーバーをサポートしません。 ただし、Curl など、スクリプト内のプロキシ サーバーをサポートするファイル転送ツールを使用できます。
  • スクリプトまたはコマンドで使用している既定以外のディレクトリの場所に注意し、 この状況を処理するロジックを用意してください。

拡張機能のスキーマ

カスタム スクリプト拡張機能の構成では、スクリプトの場所や、実行するコマンドなどを指定します。 この情報は、構成ファイルに格納したり、コマンド ラインで指定したり、Azure Resource Manager テンプレートで指定したりできます。

機微なデータは、保護された構成に格納できます。この構成は暗号化され、ターゲットの仮想マシンでのみ復号化されます。 保護された構成は、実行コマンドにパスワードなどの機密情報が含まれている場合に便利です。 次に例を示します。

{
  "name": "config-app",
  "type": "Extensions",
  "location": "[resourceGroup().location]",
  "apiVersion": "2019-03-01",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "skipDos2Unix":false,
      "timestamp":123456789          
    },
    "protectedSettings": {
       "commandToExecute": "<command-to-execute>",
       "script": "<base64-script-to-execute>",
       "storageAccountName": "<storage-account-name>",
       "storageAccountKey": "<storage-account-key>",
       "fileUris": ["https://.."],
       "managedIdentity" : "<managed-identity-identifier>"
    }
  }
}

Note

managedIdentity プロパティは、storageAccountName または storageAccountKey プロパティと組み合わせて使用しないでください

プロパティ値

名前 値または例 データ型
apiVersion 2019-03-01 日付
publisher Microsoft.Azure.Extensions string
type CustomScript string
typeHandlerVersion 2.1 INT
fileUris https://github.com/MyProject/Archive/MyPythonScript.py array
commandToExecute python MyPythonScript.py \<my-param1> string
script IyEvYmluL3NoCmVjaG8gIlVwZGF0aW5nIHBhY2thZ2VzIC4uLiIKYXB0IHVwZGF0ZQphcHQgdXBncmFkZSAteQo= string
skipDos2Unix false Boolean
timestamp 123456789 32-bit integer
storageAccountName examplestorageacct string
storageAccountKey TmJK/1N3AbAZ3q/+hOXoi/l73zOqsaxXDhqa9Y83/v5UpXQp2DQIBuv2Tifp60cE/OaHsJZmQZ7teQfczQj8hg== string
managedIdentity { } または { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" } または { "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" } JSON オブジェクト

プロパティ値の詳細

プロパティ 省略可能または必須 詳細
apiVersion 適用できません 最新の API バージョンを確認するには、リソース エクスプローラーを使用するか、Azure CLI のコマンド az provider list -o json を使用します。
fileUris 省略可能 ダウンロードするファイルの URL。
commandToExecute script が設定されない場合は必須 実行するエントリ ポイント スクリプト。 コマンドにパスワードなどの機密情報が含まれている場合は、script の代わりにこのプロパティを使用します。
script commandToExecute が設定されない場合は必須 /bin/sh によって実行される、Base64 でエンコードされた (必要に応じて gzip された) スクリプト。
skipDos2Unix 省略可能 スクリプトベースのファイルの URL またはスクリプトの dos2unix 変換をスキップする場合は、この値を false に設定します。
timestamp 省略可能 この値は、スクリプトの再実行をトリガーするためにのみ変更します。 任意の整数値を使用できますが、前の値とは異なる必要があります。
storageAccountName 省略可能 ストレージ アカウントの名前。 ストレージの資格情報を指定する場合は、すべての fileUris 値が Azure BLOB の URL である必要があります。
storageAccountKey 省略可能 ストレージ アカウントのアクセス キー。
managedIdentity 省略可能 以下のファイルをダウンロードするためのマネージド ID

clientId (省略可能、文字列): マネージド ID のクライアント ID。

objectId (省略可能、文字列): マネージド ID のオブジェクト ID。

パブリックまたは保護された設定のいずれかで、次の値を設定できます。 拡張機能は、パブリックおよび保護された設定の両方でこれらの値が設定されている構成を拒否します。

  • commandToExecute
  • script
  • fileUris

デバッグにはパブリック設定を使用することが便利な場合もありますが、保護された設定を使用することを強くお勧めします。

パブリック設定は、スクリプトが実行される仮想マシンにクリア テキストで送信されます。 保護された設定は、Azure と仮想マシンのみが認識するキーを使用して暗号化されます。 設定は、送信先の仮想マシンに保存されます。 つまり、設定が暗号化された場合は、暗号化された設定が仮想マシンに保存されます。 暗号化された値の暗号化を解除するために使用される証明書は、仮想マシンに格納されます。 証明書は、(必要に応じて) 実行時に設定の暗号化を解除するためにも使用されます。

プロパティ: skipDos2Unix

既定値は false で、dos2unix 変換が実行されます

前のバージョンのカスタム スクリプト拡張機能、Microsoft.OSTCExtensions.CustomScriptForLinux では、\r\n\n に変換することによって DOS ファイルが UNIX ファイルに自動的に変換されました。 この変換は引き続き存在し、既定ではオンに設定されています。 この変換は、fileUris からダウンロードされたすべてのファイル、または次の条件のいずれかに基づくスクリプト設定に適用されます。

  • 拡張子は .sh、.txt、.py または .pl です。 スクリプト設定は、/bin/sh を使用したスクリプト実行と見なされるので、常にこの条件と一致します。 スクリプト設定は、仮想マシンに script.sh として保存されます。
  • ファイルは #! で始まります。

次のように skipDos2Unixtrue に設定すると、dos2unix 変換をスキップできます。

{
  "fileUris": ["<url>"],
  "commandToExecute": "<command-to-execute>",
  "skipDos2Unix": true
}

プロパティ: script

カスタム スクリプト拡張機能によって、ユーザー定義スクリプトの実行がサポートされます。 スクリプト設定は、commandToExecutefileUris を 1 つの設定に結合します。 Azure Storage または GitHub gist からダウンロードするファイルを設定する代わりに、設定としてスクリプトをエンコードできます。 スクリプトを使用して、commandToExecutefileUris を置換できます。

いくつかの要件を次に示します。

  • スクリプトは、Base64 エンコードをする必要があります
  • スクリプトは必要に応じて GZip 圧縮できます。
  • スクリプトの設定は、パブリックまたは保護された設定で使用できます。
  • スクリプト パラメーターのデータの最大サイズは、256 KB です。 スクリプトがこのサイズを超えた場合、スクリプトは実行されません。

たとえば、ファイル /script.sh/ に次のスクリプトが保存されているとします。

#!/bin/sh
echo "Updating packages ..."
apt update
apt upgrade -y

次のコマンドの出力を取得して、正しいカスタム スクリプト拡張機能のスクリプト設定を作成します。

cat script.sh | base64 -w0
{
  "script": "IyEvYmluL3NoCmVjaG8gIlVwZGF0aW5nIHBhY2thZ2VzIC4uLiIKYXB0IHVwZGF0ZQphcHQgdXBncmFkZSAteQo="
}

ほとんどの場合、gzip 圧縮してさらにスクリプトのサイズを削減することもできます。 カスタム スクリプト拡張機能は、gzip 圧縮の使用を自動的に検出します。

cat script | gzip -9 | base64 -w 0

カスタム スクリプト拡張機能では、次のアルゴリズムを使用してスクリプトを実行します。

  1. スクリプトの値の長さが 256 KB を超えないことをアサートします。
  2. スクリプトの値を base64 にデコードします。
  3. base64 にデコードされた値の GunZip 圧縮を試行します。
  4. デコード (および必要に応じて圧縮解除) された値をディスクに書き込みます (/var/lib/waagent/custom-script/#/script.sh)。
  5. _/bin/sh -c /var/lib/waagent/custom-script/#/script.sh を使用してスクリプトを実行します。

プロパティ: managedIdentity

Note

このプロパティは、保護された設定でのみ指定する必要があります

カスタム スクリプト拡張機能 (バージョン 2.1 以降) では、fileUris 設定で指定された URL からファイルをダウンロードするためのマネージド ID がサポートされています。 これにより、ユーザーが Shared Access Signature (SAS) トークンやストレージ アカウント キーなどのシークレットを渡さなくとも、カスタム スクリプト拡張機能で Azure Storage プライベート BLOB またはコンテナーにアクセスできるようになります。

この機能を使用するには、ユーザーはカスタム スクリプト拡張機能が実行される仮想マシンまたは仮想マシン スケール セットに、システム割り当て ID またはユーザー割り当て ID を追加する必要があります。 その後、ユーザーは Azure Storage コンテナーまたは BLOB へのアクセスをマネージド ID に許可する必要があります。

ターゲット仮想マシンまたは仮想マシン スケール セットでシステム割り当て ID を使用するには、managedidentity を空の JSON オブジェクトに設定します。

例:

{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.sh"],
  "commandToExecute": "sh script1.sh",
  "managedIdentity" : {}
}

ターゲット仮想マシンまたは仮想マシン スケール セットでユーザー割り当て ID を使用するには、managedidentity を、マネージド ID のクライアント ID またはオブジェクト ID で構成します。

例:

{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.sh"],
  "commandToExecute": "sh script1.sh",
  "managedIdentity" : { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" }
}
{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.sh"],
  "commandToExecute": "sh script1.sh",
  "managedIdentity" : { "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" }
}

Note

managedIdentity プロパティは、storageAccountName または storageAccountKey プロパティと組み合わせて使用しないでください

テンプレートのデプロイ

Azure VM 拡張機能は、Azure Resource Manager テンプレートを使用してデプロイできます。 前のセクションで詳しく説明した JSON スキーマを Azure Resource Manager テンプレートで使用すると、テンプレートのデプロイ時にカスタム スクリプト拡張機能を実行できます。 カスタム スクリプト拡張機能を含むサンプル テンプレートは、GitHub で入手できます。

{
  "name": "config-app",
  "type": "extensions",
  "location": "[resourceGroup().location]",
  "apiVersion": "2019-03-01",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      },
    "protectedSettings": {
      "commandToExecute": "sh hello.sh <param2>",
      "fileUris": ["https://github.com/MyProject/Archive/hello.sh"
      ]  
    }
  }
}

Note

これらのプロパティ名では大文字と小文字が区別されます。 展開の問題を回避するには、次のような名前を使います。

Azure CLI

Azure CLI を使ってカスタム スクリプト拡張機能を実行するときは、1 つまたは複数の構成ファイルを作成します。 少なくとも、commandToExecute が必要です。

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --protected-settings ./script-config.json

必要に応じて、コマンドで JSON 形式の文字列として設定を指定できます。 そのようにすると、実行中に構成を指定することができ、個別の構成ファイルが不要になります。

az vm extension set \
  --resource-group exttest \
  --vm-name exttest \
  --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --protected-settings '{"fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"],"commandToExecute": "./config-music.sh"}'

例: スクリプト ファイルのあるパブリック構成

{
  "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"],
  "commandToExecute": "./config-music.sh"
}

Azure CLI コマンド:

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --settings ./script-config.json

例: スクリプト ファイルのないパブリック構成

{
  "commandToExecute": "apt-get -y update && apt-get install -y apache2"
}

Azure CLI コマンド:

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --settings ./script-config.json

例: パブリックおよび保護された構成ファイル

スクリプト ファイルの URI を指定するには、パブリック構成ファイルを使います。 実行するコマンドを指定するには、保護された構成ファイルを使います。

パブリック構成ファイル:

{
  "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"]
}

保護された構成ファイル:

{
  "commandToExecute": "./config-music.sh <param1>"
}

Azure CLI コマンド:

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM \ 
  --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --settings ./script-config.json \
  --protected-settings ./protected-config.json

仮想マシン スケール セット

Azure portal からカスタム スクリプト拡張機能をデプロイする場合、ストレージ アカウント内のスクリプトにアクセスするために SAS トークンの有効期限を制御することはできません。 その結果、初期デプロイは機能しますが、ストレージ アカウントの SAS トークンの有効期限が切れると、カスタム スクリプト拡張機能がストレージ アカウントにアクセスできなくなるため、後続のスケーリング操作は失敗します。

仮想マシン スケール セットにカスタム スクリプト拡張機能をデプロイする場合は、PowerShellAzure CLI、または Azure Resource Manager テンプレートを使用することをお勧めします。 この方法で、マネージド ID を使用するか、必要に応じてストレージ アカウント内のスクリプトにアクセスするための SAS トークンの有効期限を直接制御するかを選択できます。

トラブルシューティング

カスタム スクリプト拡張機能を実行すると、スクリプトが次の例のようなディレクトリに作成されるかダウンロードされます。 コマンドの出力も、このディレクトリの stdout および stderr ファイルに保存されます。

/var/lib/waagent/custom-script/download/0/

トラブルシューティングする場合は、まず次のように Linux エージェント ログをチェックして、拡張機能が実行されたことを確認します。

/var/log/waagent.log 

拡張機能が実行されたことを確認します。 これは次のように表示されます。

2018/04/26 17:47:22.110231 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] [Enable] current handler state is: notinstalled
2018/04/26 17:47:22.306407 INFO Event: name=Microsoft.Azure.Extensions.customScript, op=Download, message=Download succeeded, duration=167
2018/04/26 17:47:22.339958 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Initialize extension directory
2018/04/26 17:47:22.368293 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Update settings file: 0.settings
2018/04/26 17:47:22.394482 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Install extension [bin/custom-script-shim install]
2018/04/26 17:47:23.432774 INFO Event: name=Microsoft.Azure.Extensions.customScript, op=Install, message=Launch command succeeded: bin/custom-script-shim install, duration=1007
2018/04/26 17:47:23.476151 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Enable extension [bin/custom-script-shim enable]
2018/04/26 17:47:24.516444 INFO Event: name=Microsoft.Azure.Extensions.customScript, op=Enable, message=Launch command succeeded: bin/custom-sc

前の出力は、次のような内容を表します。

  • Enable は、コマンドの実行が開始されたときです。
  • Download は、fileUris に指定されたスクリプト ファイルではなく、Azure からカスタム スクリプト拡張機能パッケージをダウンロードすることに関連します。

Azure スクリプト拡張機能が生成するログも、ここにあります。

/var/log/azure/custom-script/handler.log

個々の実行を確認します。 これは次のように表示されます。

time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=start
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=pre-check
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="comparing seqnum" path=mrseq
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="seqnum saved" path=mrseq
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="reading configuration"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="read configuration"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="validating json schema"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="json schema valid"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="parsing configuration json"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="parsed configuration json"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="validating configuration logically"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="validated configuration"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="creating output directory" path=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="created output directory"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 files=1
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 file=0 event="download start"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 file=0 event="download complete" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="executing command" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="executing protected commandToExecute" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="executed command" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=enabled
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=end

ここで、

  • このログを開始する enable コマンド。
  • 拡張機能に渡される設定。
  • ファイルをダウンロードする拡張機能と、その結果。
  • コマンドの実行とその結果。

また、Azure CLI を使用して commandToExecute として渡された実引数など、カスタム スクリプト拡張機能の実行状態を取得することもできます。

az vm extension list -g myResourceGroup --vm-name myVM

出力は次のテキストのようになります。

[
  {
    "autoUpgradeMinorVersion": true,
    "forceUpdateTag": null,
    "id": "/subscriptions/subscriptionid/resourceGroups/rgname/providers/Microsoft.Compute/virtualMachines/vmname/extensions/customscript",
    "resourceGroup": "rgname",
    "settings": {
      "commandToExecute": "sh script.sh > ",
      "fileUris": [
        "https://catalogartifact.azureedge.net/publicartifacts/scripts/script.sh",
        "https://catalogartifact.azureedge.net/publicartifacts/scripts/script.sh"
      ]
    },
    "tags": null,
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "typeHandlerVersion": "2.0",
    "virtualMachineExtensionType": "CustomScript"
  },
  {
    "autoUpgradeMinorVersion": true,
    "forceUpdateTag": null,
    "id": "/subscriptions/subscriptionid/resourceGroups/rgname/providers/Microsoft.Compute/virtualMachines/vmname/extensions/OmsAgentForLinux",
    "instanceView": null,
    "location": "eastus",
    "name": "OmsAgentForLinux",
    "protectedSettings": null,
    "provisioningState": "Succeeded",
    "publisher": "Microsoft.EnterpriseCloud.Monitoring",
    "resourceGroup": "rgname",
    "settings": {
      "workspaceId": "workspaceid"
    },
    "tags": null,
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "typeHandlerVersion": "1.0",
    "virtualMachineExtensionType": "OmsAgentForLinux"
  }
]

Azure CLI 構文の問題

Azure CLI は、いくつかのシェル環境で実行できますが、形式には若干の差異があります。 Azure CLI コマンドで予期しない結果が発生した場合は、「Azure CLI を正しく使用する方法」を参照してください。

次のステップ

コード、現在の問題およびバージョンについては、GitHub の custom-script-extension-linux repo を参照してください。