Share via


カスタム スクリプト拡張 (CustomScript Extension) を使用した Linux VM のカスタマイズ タスクの自動化

このポストは、8 月 20 日に投稿した Automate Linux VM Customization Tasks Using CustomScript Extension の翻訳です。

こちらの Azure ブログ記事をご覧になった皆様は、既に Windows VM 用カスタム スクリプト拡張 (CustomScript Extension) についてご存知かと思いますが、このたびこの拡張機能が Linux VM でもご利用いただけるようになりました。

また、cloud-init についても以前の記事でご紹介しましたが、これはプロビジョニング時にスクリプトやメタデータを Azure Linux VM に挿入する機能です。カスタム スクリプト拡張では、さらに強力な VM カスタマイズ機能が利用でき、プロビジョニング中とプロビジョニング完了後のどちらのタイミングでもスクリプトを実行できます。また Azure でサポートされているすべての Linux VM でも使用できます。

カスタム スクリプトでできること

Azure で Linux VM を作成した後、通常は VM にワークロード (Web サーバーやデータベースなど) をデプロイします。この場合、作業を一連のスクリプトで実行することが理想的です。

  • カスタム スクリプト拡張では、指定した場所から指定したパラメーターを使用してスクリプトを自動的にダウンロードし、実行できます。
  • カスタム スクリプト拡張は、Linux でサポートされているあらゆるスクリプト言語 (Python や Linux シェル スクリプトなど) で記述されたスクリプトをサポートしています。ただし、対応するスクリプト インタープリターが VM にインストールされている必要があります。
  • カスタム スクリプト拡張では、VM のプロビジョニング中でもプロビジョニング完了後の任意のタイミングでもインストールや構成を実施できます。
  • カスタム スクリプト拡張のデプロイメントは、Azure PowerShell コマンドレットから行えます。クロスプラットフォーム スクリプトによるデプロイメントと Azure ポータルからのデプロイメントも、今後数週間以内にサポートされる予定です。詳細については後日改めてお伝えいたします。

前提条件

  • Microsoft Azure Linux Agent (バージョン 2.0.5 以降) がインストールされていること。
  • 実行するスクリプトの準備が完了して Azure Storage の BLOB、または GitHub にアップロードされていること。このとき、スクリプト インタープリターが VM にインストールされていることを確認します。
  • Azure PowerShell コマンドレットから拡張機能をデプロイする場合は Azure PowerShell がインストールされていること (こちらのページからダウンロードできます)。

カスタム スクリプト拡張のデプロイメント

拡張機能のデプロイメントには、Azure PowerShell、クロスプラットフォーム スクリプト、および Azure ポータルを使用できます。この記事では、Azure PowerShell を使用して拡張機能をデプロイする場合についてご説明します。

まず、Azure PowerShell がインストールされていることを確認します。拡張機能をデプロイしスクリプトを実行する方法は 2 つあり、スクリプトが格納されている場所によって異なります。

Azure Storage の BLOB に格納されているスクリプトを実行する場合

  1. スクリプトを作成して BLOB にアップロードします。
  2. プロビジョニング中またはプロビジョニング完了後に、VM に拡張機能を追加します。
  3. スクリプトをアップロードした BLOB の場所とオプションのパラメーターを入力します。
  4. VM 内で拡張機能によってスクリプトがダウンロードされます。
  5. 拡張機能によってスクリプトが起動されます。このとき、ユーザーが指定したパラメーターが使用されます。
 # Azure BLOB に格納されている Linux シェル スクリプトを実行するサンプル スクリプト
# VM 名、Azure ストレージ アカウント名、およびキーを入力する
$VmName = 'MyVM'  
$vm = Get-AzureVM $VmName
$PrivateConfiguration = '{"storageAccountName": "MyAccount","storageAccountKey":"Mykey"}' 
# スクリプトが格納されている Azure BLOB の場所と、実行するコマンドを指定する
$PublicConfiguration = '{"fileUris":["https://MyAccount.blob.core.windows.net/vhds/MyShellScript.sh"], "commandToExecute": "sh MyShellScript.sh" }' 

# 拡張機能を VM にデプロイする
$ExtensionName = 'CustomScriptForLinux'  
$Publisher = 'Microsoft.OSTCExtensions'  
$Version = '1.0' 
Set-AzureVMExtension -ExtensionName $ExtensionName -VM  $vm -Publisher $Publisher -Version $Version -PrivateConfiguration $PrivateConfiguration -PublicConfiguration $PublicConfiguration  | Update-AzureVM

GitHub に格納されているスクリプトを実行する場合

  1. スクリプトを作成して GitHub にアップロードします。
  2. プロビジョニング中またはプロビジョニング完了後に、VM に拡張機能を追加します。
  3. スクリプトをアップロードした GitHub の場所とオプションのパラメーターを入力します。
  4. VM 内で拡張機能によりスクリプトがダウンロードされます。
  5. 拡張機能によりスクリプトが起動されます。このとき、ユーザーが指定したパラメーターが使用されます。
 # GitHub に格納されている Python スクリプトを実行するサンプル スクリプト
# VM 名を入力する
$VmName = 'MyVM'  
$vm = Get-AzureVM $VmName
#Specify the Location of the script and the command to execute
$PublicConfiguration = '{"fileUris":["https://github.com/MyProject/Archive/MyPythonScript.py"], "commandToExecute": "python MyPythonScript.py" }' 

# スクリプトが格納されている場所と、実行するコマンドを指定する
$ExtensionName = 'CustomScriptForLinux'  
$Publisher = 'Microsoft.OSTCExtensions'  
$Version = '1.0' 
Set-AzureVMExtension -ExtensionName $ExtensionName -VM  $vm -Publisher $Publisher -Version $Version -PublicConfiguration $PublicConfiguration  | Update-AzureVM

結果のクエリ

  • カスタム スクリプト拡張は、ユーザーが作成したスクリプトをデプロイ完了直後から実行します。
  • 実行結果は Azure PowerShell コマンドレットの Get-AzureVM または Get-Deployment で取得できます。また、ステータスはクロスプラットフォーム スクリプトおよび Azure ポータルから確認できます (近日中に導入予定)。
  • カスタム スクリプト拡張のログ ファイルは /var/log/azure/Microsoft.OSTCExtensions.CustomScriptForLinux/1.0/extension.log に格納されます。ユーザーが作成したスクリプトの通常の出力も、このログ ファイルに記録されます。

補足

  • 複数のスクリプトを使用する場合は、依存スクリプトを呼び出すエントリ ポイントのスクリプトを作成し、次にエントリ ポイントのスクリプトや依存スクリプト、その他の依存関係にあるバイナリを、Azure Storage の BLOB または GitHub にアップロードします。
  • この拡張機能は、VM 作成後に 1 回のみ実行するタスクを想定しています。同じ構成で拡張機能を再度呼び出しても、指定したスクリプトは実行されません。カスタム スクリプト拡張を複数回実行する必要がある場合は、次のような構成変更を行います。
  1. スクリプト名を変更する。
  2. 次のコードのように、[PublicConfiguration] パラメーターとしてタイムスタンプを追加する。
 # カスタム スクリプト拡張を実行するたびに構成が確実に変更されるように、現在のタイムスタンプを生成し構成に追加する
$TimeStamp = (Get-Date).Ticks
$PublicConfiguration = '{"fileUris":[“MyAccount.blob.core.windows.net/vhds/MyShellScript.sh”], "commandToExecute": "sh MyShellScript.sh", “timestamp”: “' + $TimeStamp + '“}'