Microsoft Azureの拡張機能は、デプロイ後の構成管理と自動化を実現する小さなアプリケーションです。実装可能な事は非常に多岐にわたり全てを紹介するのは非常に難しいですが、このページでは最もイメージが湧きやすく、最も容易なnginxのインストールを例に挙げて説明します。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
- Azure 仮想マシンの拡張機能とその機能
- Linux 用の仮想マシンの拡張機能とその機能
- チュートリアル:Azure CLI を使用した仮想マシン スケール セットへのアプリケーションのインストール
事前設定
以下、リソースグループを作成します。
az group create --name MyResourceGroup --location japaneast
動作確認用の仮想マシンを作成します。説明の都合上、Debian系のディストリビューションをお使いください。
az vm create \ --resource-group MyResourceGroup \ --name linux020 \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys
拡張機能
拡張機能の実行
拡張機能は様々な自動化を実現できますが、最も簡単なスクリプト実行の例を示します。まずは、簡単なnginxインストールのスクリプトを作成します。
#!/bin/bash apt-get update -y && apt-get upgrade -y apt-get install -y nginx echo "Hello World from host" $HOSTNAME "!" | sudo tee -a /var/www/html/index.html
このスクリプトをHTTPSで公開します。もし、HTTPSサーバを構築するのが手間のようならば、Microsoftが学習用に提供するGitHubを利用すると良いでしょう。上記スクリプトは以下のURLで公開されています。
https://raw.githubusercontent.com/Azure-Samples/compute-automation-configurations/master/automate_nginx.sh
このスクリプトを実行コマンドを定義した、JSONファイルを以下のようなファイル名で保存します。
cat << EOF > customConfig.json { "fileUris": ["https://raw.githubusercontent.com/Azure-Samples/compute-automation-configurations/master/automate_nginx.sh"], "commandToExecute": "./automate_nginx.sh" } EOF
az vm extension setコマンドを使用すると拡張機能が実行されます。
az vm extension set \ --publisher Microsoft.Azure.Extensions \ --version 2.0 \ --name CustomScript \ --resource-group MyResourceGroup \ --vm-name linux010 \ --settings @customConfig.json
拡張機能の動作確認
拡張スクリプトが実行され、nginxが起動している事を確認します。
root@linux010:~# ps aux | grep nginx root 14401 0.0 0.1 141124 1552 ? Ss 06:45 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; www-data 14404 0.0 0.6 143796 6232 ? S 06:45 0:00 nginx: worker process root 14783 0.0 0.1 14860 1044 pts/0 S+ 06:53 0:00 grep --color=auto nginx root@linux020:~# systemctl status nginx.service ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2022-03-19 06:45:00 UTC; 8min ago Docs: man:nginx(8) Main PID: 14401 (nginx) Tasks: 2 (limit: 1051) CGroup: /system.slice/nginx.service ├─14401 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; └─14404 nginx: worker process Mar 19 06:45:00 linux020 systemd[1]: Starting A high performance web server and a reverse proxy server... Mar 19 06:45:00 linux020 systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument Mar 19 06:45:00 linux020 systemd[1]: Started A high performance web server and a reverse proxy server.
この拡張機能はAzure Linux VM Agent(waagnt)によって実行されます。waagntの動作ログは/var/log/waagent.logに記録されています。Microsoft.Azure.Extensions.CustomScriptの実行結果がsuccessである事が分かります。
root@linux020:~# tail -f /var/log/waagent.log <omitted> time=2022-03-19T06:43:58Z version=v2.1.6/git@fc181d8-dirty operation=enable seq=0 file=0 event="download complete" output=/var/lib/waagent/custom-script/download/0 time=2022-03-19T06:43:58Z version=v2.1.6/git@fc181d8-dirty operation=enable seq=0 event="executing command" output=/var/lib/waagent/custom-script/download/0 time=2022-03-19T06:43:58Z version=v2.1.6/git@fc181d8-dirty operation=enable seq=0 event="executing public commandToExecute" output=/var/lib/waagent/custom-script/download/0 [stderr] Running scope as unit: enable_eacaf6c7-1dfc-4703-bc75-b5d76600d520.scope 2022-03-19T06:44:00.403325Z INFO ExtHandler ExtHandler ProcessExtensionsInGoalState completed [Incarnation: 2; 4339 ms; Activity Id: 8718b542-9bb0-4cab-8b0c-e5cfe63a6b02; Correlation Id: f64d69ad-e8ce-49ec-9a36-1dc7173997fc; GS Creation Time: 2022-03-19T06:43:48.693130Z] 2022-03-19T06:44:00.417490Z INFO ExtHandler ExtHandler Extension status: [('Microsoft.Azure.Extensions.CustomScript', 'transitioning')] 2022-03-19T06:45:06.637761Z INFO ExtHandler ExtHandler Extension status: [('Microsoft.Azure.Extensions.CustomScript', 'success')] <omitted>
実行されたスクリプトや標準出力・エラー出力は以下ディレクトリに格納されています。
root@linux020:~# apt install -y tree <omitted> root@linux020:~# tree /var/lib/waagent/custom-script/download/ /var/lib/waagent/custom-script/download/ └── 0 ├── automate_nginx.sh ├── stderr └── stdout 1 directory, 3 files root@linux020:~# cat /var/lib/waagent/custom-script/download/0/stdout Hit:1 http://azure.archive.ubuntu.com/ubuntu bionic InRelease Get:2 http://azure.archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB] Get:3 http://azure.archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB] Get:4 http://azure.archive.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB] Get:5 http://azure.archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [8570 kB] Get:6 http://azure.archive.ubuntu.com/ubuntu bionic/universe Translation-en [4941 kB] <omitted>
補足
ファイルを作成せずに実行
スクリプト化する時にファイル作成を嫌う人も居るでしょう。そのような場合は、settingsにJSONの文字列を使う事もできます。
az vm extension set \ --publisher Microsoft.Azure.Extensions \ --version 2.0 \ --name CustomScript \ --resource-group MyResourceGroup \ --vm-name linux010 \ --settings '{"fileUris": ["https://raw.githubusercontent.com/me/project/hello.sh"],"commandToExecute": "./hello.sh"}'
若干強引ですが、標準入力を使っても良いかもしれません。
az vm extension set \ --publisher Microsoft.Azure.Extensions \ --version 2.0 \ --name CustomScript \ --resource-group MyResourceGroup \ --vm-name linux010 \ --settings @/dev/stdin << EOF { "fileUris": ["https://raw.githubusercontent.com/Azure-Samples/compute-automation-configurations/master/automate_nginx.sh"], "commandToExecute": "./automate_nginx.sh" } EOF
仮想マシンスケールセットに対する設定
仮想マシンスケールセットに対して拡張機能を使うならば、以下のようにaz vmss extension setコマンドを使用します。
az vmss extension set \ --publisher Microsoft.Azure.Extensions \ --version 2.0 \ --name CustomScript \ --resource-group MyResourceGroup \ --vmss-name MyScaleSet \ --settings @customConfig.json