システムの自動化文脈でPowerShellスクリプトやShellスクリプトをAzure上のVMにRDPやSSHせず投げたいことがあると思います。その際に取れる手段を簡単にまとめてみます。
Azure Cloud Shell上にスクリプトを配置して実行
Azureにログインすると上部にTerminalのアイコンが出てきます。
Azure Cloud Shellを利用開始すると自動的に作業領域としてのストレージアカウントが作成されます。Azure Cloud ShellはAzureCLIなどのライブラリのインストールが不要であり、デフォルトでAzureにログインしているため、リソースへのアクセスも問題なくすぐに作業を始めることができます。
PowerShell/Shellスクリプトを保存しておけば繰り返し実行することが可能です。しかし、作業場所としてのストレージアカウントはログインユーザごとに作成されるため、共通のスクリプトを実行したい場合にはスクリプトファイルの置き場を用意する必要があります。
カスタムスクリプト拡張機能
カスタムスクリプト拡張機能はVMにスクリプトファイルをダウンロードして実行する拡張機能です。拡張機能をインストールすると指定したスクリプトファイルが一度だけ実行されます。繰り返し実行する場合にはスクリプトの中でその設定(cronなど)をする必要があります。
AzurePortalからこの機能を利用する場合にはストレージアカウントに保存されたPowerShellスクリプトの実行のみ可能です。
Azure VMの「実行コマンド」
特定のVMに対してSSHやRDPすることなく拡張機能のインストールなどのスクリプトを流したい場合、「実行コマンド」→「RunPowerShellScript」から一連のスクリプトを流すことができます。(Linuxの場合は「RunShellScript」のメニューを選択します。)
また「実行コマンド」の機能はローカルのPowerShellからAzruePowerShellモジュールを通して下記のように実行することができます。実行時のパラメータとして-ScriptPath
を指定できます。ここでは、実行環境に対してローカルなパスを指定します。VSCodeなどでファイルを編集している場合はそのファイルに対するPC上のパスを指定すればOKです。VSCodeでは編集と実行(編集したスクリプトファイルをVMに投げること)が同時にできて相性が良いので個人的にはお勧めです。
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が利用可能です。
作成したRunbookをコマンドから手動で実行することも可能です。
PS C:\>Start-AzAutomationRunbook -AutomationAccountName "<Automation Account名>" -Name "<Runbook名>" -ResourceGroupName "<リソースグループ名>"
おわりに
以上、簡単にVMに対してスクリプトを投げる機能をまとめてみました。対象ホストのリストを用意しておくことでそのスクリプトをそれぞれのホストに当てるループを(別のスクリプトの中で)組めば、それを実行するだけでかなりの作業を自動化できます。
インフラエンジニアって感じですね(笑)