LoginSignup
5
2

More than 1 year has passed since last update.

Azure VMに対してスクリプトを投げる方法まとめ

Posted at

システムの自動化文脈でPowerShellスクリプトやShellスクリプトをAzure上のVMにRDPやSSHせず投げたいことがあると思います。その際に取れる手段を簡単にまとめてみます。

Azure Cloud Shell上にスクリプトを配置して実行

Azureにログインすると上部にTerminalのアイコンが出てきます。
image.png
Azure Cloud Shellを利用開始すると自動的に作業領域としてのストレージアカウントが作成されます。Azure Cloud ShellはAzureCLIなどのライブラリのインストールが不要であり、デフォルトでAzureにログインしているため、リソースへのアクセスも問題なくすぐに作業を始めることができます。

PowerShell/Shellスクリプトを保存しておけば繰り返し実行することが可能です。しかし、作業場所としてのストレージアカウントはログインユーザごとに作成されるため、共通のスクリプトを実行したい場合にはスクリプトファイルの置き場を用意する必要があります。

カスタムスクリプト拡張機能

カスタムスクリプト拡張機能はVMにスクリプトファイルをダウンロードして実行する拡張機能です。拡張機能をインストールすると指定したスクリプトファイルが一度だけ実行されます。繰り返し実行する場合にはスクリプトの中でその設定(cronなど)をする必要があります。

image.png

AzurePortalからこの機能を利用する場合にはストレージアカウントに保存されたPowerShellスクリプトの実行のみ可能です。

Azure VMの「実行コマンド」

特定のVMに対してSSHやRDPすることなく拡張機能のインストールなどのスクリプトを流したい場合、「実行コマンド」→「RunPowerShellScript」から一連のスクリプトを流すことができます。(Linuxの場合は「RunShellScript」のメニューを選択します。)
image.png

また「実行コマンド」の機能はローカルのPowerShellからAzruePowerShellモジュールを通して下記のように実行することができます。実行時のパラメータとして-ScriptPathを指定できます。ここでは、実行環境に対してローカルなパスを指定します。VSCodeなどでファイルを編集している場合はそのファイルに対するPC上のパスを指定すればOKです。VSCodeでは編集と実行(編集したスクリプトファイルをVMに投げること)が同時にできて相性が良いので個人的にはお勧めです。

AzurePowerShell
PS C:\> Connect-AzAccount
PS C:\> Invoke-AzVMRunCommand -ResourceGroupName '<myResourceGroup>' -Name '<myVMName>' -CommandId 'RunPowerShellScript' -ScriptPath '<pathToScript>' -Parameter @{"arg1" = "var1";"arg2" = "var2"}

VMに当てるスクリプトの中でコマンド実行時のカレントディレクトリを調べるためにpwdを実行すると以下が出力されます。

[stdout]
/var/lib/waagent/run-command/download/3

検証用にtouchコマンドを実行する場合はここを覗きに行ってください。しかし、個々のエージェントに割り当てられた領域には一般ユーザではPermisアクセスできません。

$ AdminUser@vm01:/$ cd var/lib/waagent/run-command/download
-bash: cd: var/lib/waagent/run-command/download: Permission denied

下記のように管理者権限でアクセスする必要があります。

$ sudo su

Azure Automation Runbook

Azure Automation Runbookはあらかじめ作成しておいたスクリプトをLog Analyticsのアラートルール等やスケジュールをトリガにしてジョブとして実行する機能になります。PowerShellやPythonが利用可能です。

image.png
image.png

作成したRunbookをコマンドから手動で実行することも可能です。

PS C:\>Start-AzAutomationRunbook -AutomationAccountName "<Automation Account名>" -Name "<Runbook名>" -ResourceGroupName "<リソースグループ名>"

おわりに

以上、簡単にVMに対してスクリプトを投げる機能をまとめてみました。対象ホストのリストを用意しておくことでそのスクリプトをそれぞれのホストに当てるループを(別のスクリプトの中で)組めば、それを実行するだけでかなりの作業を自動化できます。

インフラエンジニアって感じですね(笑)

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2