Azure 拡張機能

スポンサーリンク

Microsoft Azureの拡張機能は、デプロイ後の構成管理と自動化を実現する小さなアプリケーションです。実装可能な事は非常に多岐にわたり全てを紹介するのは非常に難しいですが、このページでは最もイメージが湧きやすく、最も容易なnginxのインストールを例に挙げて説明します。

前提

公式ドキュメント

参考になる公式ドキュメントを以下に示します。

事前設定

以下、リソースグループを作成します。

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
タイトルとURLをコピーしました