Microsoft Azureはaz vm run-commandコマンドを使用すると、SSHログインやRDP接続をせずにコマンドを実行する事ができます。SSHやRDPのポートをオープンしない事でセキュリティリスクを低減する目的で使ったり、ちょっとしたジョブを組む目的で使うと非常に便利な仕組みです。
このページでは、「アクション実行コマンド(az vm run-command invoke)」と「マネージド実行コマンド(az vm run-command create)」を説明します。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
事前設定
以下、リソースグループを作成します。
az group create --name MyResourceGroup --location japaneast
動作確認用の仮想マシンを作成します。
az vm create \ --resource-group MyResourceGroup \ --name linux010 \ --image procomputers:rocky-linux-8-minimal:rocky-linux-8-minimal:latest \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys
アクション実行コマンド
コマンドの実行例
コマンドを実行する例は以下の通りです。以下のように操作すればSSHログインする事なくSELinuxが有効かどうかを調べる事ができます。
az vm run-command invoke \ --resource-group MyResourceGroup \ --name linux010 \ --command-id RunShellScript \ --scripts 'getenforce'
実行結果は以下の通りです。コマンド実行時の標準出力もエラー出力も表示されます。
$ az vm run-command invoke \ --resource-group MyResourceGroup \ --name linux010 \ --command-id RunShellScript \ --scripts 'getenforce' { "value": [ { "code": "ProvisioningState/succeeded", "displayStatus": "Provisioning succeeded", "level": "Info", "message": "Enable succeeded: \n[stdout]\nPermissive\n\n[stderr]\n", "time": null } ] }
ファイルを指定した実行
コマンドを1行1行指定するのではなく、予めファイルにコマンドを羅列しておき、それを実行する事もできます。例えば、nginxのインストールと付随作業を同時に実行する操作例は以下の通りです。
cat << EOF > install_nginx.sh setenforce 0 dnf install -y nginx systemctl enable nginx.service --now systemctl disable firewalld.service --now EOF az vm run-command invoke \ --resource-group MyResourceGroup \ --name linux010 \ --command-id RunShellScript \ --scripts @install_nginx.sh
デバッグや実行履歴など
スクリプトの実行履歴は/var/lib/waagent/run-command/download/配下に記録されています。
[root@linux010 ~]# dnf install -y tree <omitted> [root@linux010 ~]# tree /var/lib/waagent/run-command/download/ /var/lib/waagent/run-command/download/ ├── 0 │ ├── script.sh │ ├── stderr │ └── stdout └── 1 ├── script.sh ├── stderr └── stdout 2 directories, 6 files
実際に実行されたコマンドや標準出力やエラー出力が記録されています。
[root@linux010 ~]# cat /var/lib/waagent/run-command/download/1/script.sh setenforce 0 dnf install -y nginx systemctl enable nginx.service --now systemctl disable firewalld.service --now [root@linux010 ~]# [root@linux010 ~]# [root@linux010 ~]# cat /var/lib/waagent/run-command/download/1/stdout OpenLogic packages for x86_64 67 kB/s | 9.7 kB 00:00 Rocky Linux 8 - AppStream 4.0 MB/s | 9.7 MB 00:02 Rocky Linux 8 - BaseOS 2.4 MB/s | 6.7 MB 00:02 Rocky Linux 8 - Extras 8.5 kB/s | 12 kB 00:01 Rocky Linux 8 - PowerTools 834 kB/s | 2.6 MB 00:03 <omitted> nginx-mod-http-perl-1:1.14.1-9.0.1.module+el8.0.0+5347+9282027e.x86_64 nginx-mod-http-xslt-filter-1:1.14.1-9.0.1.module+el8.0.0+5347+9282027e.x86_64 nginx-mod-mail-1:1.14.1-9.0.1.module+el8.0.0+5347+9282027e.x86_64 nginx-mod-stream-1:1.14.1-9.0.1.module+el8.0.0+5347+9282027e.x86_64 Complete!
コマンド一覧
今までの操作で説明を省略しましたが、command-idはRunShellScript以外も指定できます。az vm run-command listを使用すると、command-idに指定可能なパラメタ一覧を参照できます。
$ az vm run-command list \ --location japaneast [ <omitted> { "description": "Get the configuration of all network interfaces.", "id": "ifconfig", "label": "List network configuration", "osType": "Linux", "schema": "http://schema.management.azure.com/schemas/2016-11-17/runcommands.json" }, { "description": "Shows detailed information for the IP address, subnet mask and default gateway for each adapter bound to TCP/IP.", "id": "IPConfig", "label": "List IP configuration", "osType": "Windows", "schema": "http://schema.management.azure.com/schemas/2016-11-17/runcommands.json" }, { "description": "Checks registry settings and domain policy settings. Suggests policy actions if machine is part of a domain or modifies the settings to default values.", "id": "RDPSettings", "label": "Verify RDP Listener Settings", "osType": "Windows", "schema": "http://schema.management.azure.com/schemas/2016-11-17/runcommands.json" }, { "description": "Removes RunCommandLinux extension deployed to execute previous RunCommand operations.", "id": "RemoveRunCommandLinuxExtension", "label": "Removes the internal RunCommandLinux extension", "osType": "Linux", "schema": "http://schema.management.azure.com/schemas/2016-11-17/runcommands.json" }, <omitted>
例えば、ifconfigを指定するならば、以下のようになります。
$ az vm run-command invoke \ --resource-group MyResourceGroup \ --name linux010 \ --command-id ifconfig { "value": [ { "code": "ProvisioningState/succeeded", "displayStatus": "Provisioning succeeded", "level": "Info", "message": "Enable succeeded: \n[stdout]\neth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500\n inet 172.16.0.10 netmask 255.255.255.0 broadcast 172.16.0.255\n inet6 fe80::20d:3aff:fe50:2270 prefixlen 64 scopeid 0x20<link>\n ether 00:0d:3a:50:22:70 txqueuelen 1000 (Ethernet)\n RX packets 98467 bytes 138425809 (132.0 MiB)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 9439 bytes 2086066 (1.9 MiB)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n\nlo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536\n inet 127.0.0.1 netmask 255.0.0.0\n inet6 ::1 prefixlen 128 scopeid 0x10<host>\n loop txqueuelen 1000 (Local Loopback)\n RX packets 116 bytes 9478 (9.2 KiB)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 116 bytes 9478 (9.2 KiB)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n\n\n[stderr]\n", "time": null } ] }
マネージド実行コマンド
マネージド実行コマンドを使用すると、アクション実行コマンドよりも細かなコマンド実行が可能です。例えば、非同期で実行したり実行ユーザを指定したりする事ができます。
マネージド実行コマンドは「プレビュー」の扱いでサポート対象外です。「プレビュー」の取り扱いは「Microsoft Azure プレビューの追加使用条件」などを参照ください。
マネージド実行コマンドを使用するには、az vm run-command createコマンドを実行します。ヘルプを見てみると、アクション実行コマンド(az vm run-command invoke)よりも指定可能なオプションが多い事がわかります。
$ az vm run-command create -h Command az vm run-command create : The operation to create the run command. Arguments --name --run-command-name [Required] : The name of the virtual machine run command. --resource-group -g [Required] : Name of resource group. You can configure the default group using `az configure --defaults group=<name>`. --vm-name [Required] : The name of the virtual machine. --async-execution : Optional. If set to true, provisioning will complete as soon as the script starts and will not wait for script to complete. Allowed values: false, true. --command-id : Specify a commandId of predefined built-in script. --error-blob-uri : Specify the Azure storage blob where script error stream will be uploaded. --location -l : Location. Values from: `az account list-locations`. You can configure the default location using `az configure --defaults location=<location>`. --no-wait : Do not wait for the long-running operation to finish. --output-blob-uri : Specify the Azure storage blob where script output stream will be uploaded. --parameters : The parameters used by the script. Usage: --parameters arg1=XX arg2=XX. --protected-parameters : The parameters used by the script. Usage: --protected-parameters credentials=somefoo secret=somebar. --run-as-password : Password if needed for using run-as-user parameter. It will be encrypted and not logged. --run-as-user : By default script process runs under system/root user. Specify custom user to host the process. --script : Specify the script content to be executed on the VM. --script-uri : Specify the script download location. --tags : Space-separated tags: key[=value] [key[=value] ...]. Use '' to clear existing tags. --timeout-in-seconds : The timeout in seconds to execute the run command. Global Arguments --debug : Increase logging verbosity to show all debug logs. --help -h : Show this help message and exit. --only-show-errors : Only show errors, suppressing warnings. --output -o : Output format. Allowed values: json, jsonc, none, table, tsv, yaml, yamlc. Default: json. --query : JMESPath query string. See http://jmespath.org/ for more information and examples. --subscription : Name or ID of subscription. You can configure the default subscription using `az account set -s NAME_OR_ID`. --verbose : Increase logging verbosity. Use --debug for full debug logs. Examples Create a run command. az vm run-command create --resource-group "myResourceGroup" --location "West US" --async- execution false --parameters arg1=param1 arg2=value1 --run-as-password "<runAsPassword>" --run-as-user "user1" --script "Write-Host Hello World!" --timeout-in-seconds 3600 --run- command-name "myRunCommand" --vm-name "myVM" To search AI knowledge base for examples, use: az find "az vm run-command create" Please let us know how we are doing: https://aka.ms/azureclihats
例えば、以下のようにasync-executionを指定すると非同期で実行できます。
az vm run-command create \ --resource-group MyResourceGroup \ --vm-name "linux010" \ --name install \ --async-execution true \ --script "dnf install -y bind"