Azure VMでカスタムスクリプト拡張機能でスクリプトを実行する方法

あなたのチームがWindows Azure仮想マシン(VM)のプロビジョニングと構成をより多く行うにつれて、いつかは同じことを繰り返すことに疲れるでしょう。自動化が必要です!この記事では、ステップバイステップでAzureのカスタムスクリプト拡張を使用してVM上でスクリプトを実行する方法を説明します。

もしチームがWindows環境であるならば、サーバーの構成を自動化するための最良のツールの一つはPowerShellです。Azure PowerShellモジュールを使用することで、組織はオンプレミスのタスクだけでなく、一度に1つではなくAzure VM上でコマンドを一括実行するためにPowerShellの力を活用することができます。

Microsoftが提供している機能の一つは、Azureカスタムスクリプト拡張です。カスタムスクリプト拡張は、VMエージェントが実行するAzure仮想マシン拡張機能であり、Azure APIを使用してVM上で任意のPowerShellコードを実行するものです。

この方法でコマンドを実行することにはいくつかの利点があります。WindowsでAzureカスタム拡張を使用してコマンドを実行すると、

  • PowerShellリモート接続に対してネットワークポートを開かずにセキュリティを向上させることができます。
  • VMの起動時に簡単にPowerShellコードを実行することができます。
  • プロビジョニングのプロセスの一部としてAzureストレージからVMにリソースを自動的に転送することができます。
  • さまざまなAzureストレージアカウントに格納されたPowerShellスクリプトを実行する簡単な方法は次のとおりです。

Windows用のAzureカスタムスクリプト拡張機能を有効にする方法はいくつかあります。この記事では、PowerShellを使用してカスタムスクリプト拡張機能を有効にする方法に焦点を当てますが、Azure Resource Manager(ARM)テンプレートを使用して拡張機能を有効にすることもできます。

単純な例として、サブスクリプション内のAzure VMでPowerShellリモーティングを有効にする必要があるとします。これを行うには、次のコマンドを各VMでローカルで実行する必要があります。

Enable-PSRemoting -Force

これを行うために、カスタムスクリプト拡張機能を作成しましょう。

VM上のスクリプトを実行するためのAzureの使用

まず、ローカルコンピュータ上でEnable-PSRemoting.ps1という名前のPowerShellスクリプトを作成し、上記のコマンドを内部に記述します。このスクリプトはAzure VM上で実行する必要があります。これを行うために、別の小さなPowerShellスクリプトであるNew-CustomScriptExtension.ps1を作成し、それをAzureにアップロードし、それを実行するためのカスタムスクリプト拡張機能を作成します。先に進む前に、次のアイテムが必要です:

  • スクリプトを格納するAzureリソースグループとストレージアカウント名
  • Azureストレージコンテナ名
  • VM名
  • VMが属するAzureリソースグループ名

このスクリプトは2つのセクションに分けることができます。小さなPowerShellスクリプトをAzureにアップロードし、カスタムスクリプト拡張機能を作成します。それ以外のすべては、これらの2つのプロセスを結びつけるために必要です。

AzureへのPowerShellスクリプトのアップロード

最初に、Enable-PSRemoting.ps1スクリプトをリソースグループ($ResourceGroupName)内のコンテナ($ContainerName)にAzureストレージアカウント($StorageAccountName)にアップロードします。

Copying Enable-PSRemoting.ps1 to Azure
$saParams = @{ 'ResourceGroupName' = $ResourceGroupName 'Name' = $StorageAccountName } $storageContainer = Get-AzureRmStorageAccount @saParams |Get-AzureStorageContainer -Container $ContainerName $bcParams = @{ 'File' = 'C:\Enable-PSRemoting.ps1' 'BlobType' = 'Block' 'Blob' = ' Enable-PSRemoting.ps1' } $storageContainer | Set-AzureStorageBlobContent @bcParams

カスタムスクリプト拡張の実行

New-CustomScriptExtension.ps1を実行すると、このスクリプトは指定されたAzureストレージアカウントにEnable-PSRemoting.ps1スクリプトをアップロードします。

スクリプトがAzureに保存されたので、カスタムスクリプト拡張を使用してVMで実行できます:

  • 名前:$VMName
  • リソースグループ:$rgName
  • ストレージアカウント:$saName
  • ストレージコンテナ:$scName

New-CustomScriptExtension.ps1のためにテキストエディタを開き、以下の例を貼り付けます。これを実行すると、Windows用のAzureカスタムスクリプト拡張が実行され、以前にアップロードしたEnable-PSRemoting.ps1PowerShellスクリプトが実行されます。

New-CustomScriptExtension.ps1
# 設定する必要のあるVMを取得 $vm = Get-AzureRmVM -ResourceGroupName $rgName -Name $VMName # ストレージアカウントキーを取得 $key = (Get-AzureRmStorageAccountKey -Name $saName -ResourceGroupName$rgname).Key1 ## カスタムスクリプト拡張を有効にしてスクリプトを実行 $scriptParams = @{ 'ResourceGroupName' = $rgName 'VMName' = $VMName 'Name' = 'Enable-PSRemoting.ps1' 'Location' = $vm.Location 'StorageAccountName' = $saName 'StorageAccountKey' = $key 'FileName' = 'Enable-PSRemoting.ps1' 'ContainerName' = $scName 'Run' = 'Enable-PSRemoting.ps1' } Set-AzureRmVMCustomScriptExtension @scriptParams

概要

このスクリプトが完了すると、Enable-PSRemoting.ps1 が VM 上で実行され、PowerShell リモートが正常に有効化されたことを確認できます。これにより、Azure VM 上で Invoke-Command を使用することができるようになります。

Windows の Azure カスタムスクリプト拡張を活用することで、Azure VM 上で任意の種類の PowerShell スクリプトをリモートで実行することができます。

Source:
https://adamtheautomator.com/azure-run-script-on-vm/