ローカルPCのDockerコンテナでZabbixを動かしてAzure仮想マシンを監視する
はじめに
Zabbix 6.2から、Azure Templateが実装されています。
https://www.zabbix.com/integrations/azure
これを使うと、Zabbix Agent無しでもAzure仮想マシン、Azure Database for MySQL/PostgreSQLの監視ができるようです。
ユースケースとしては以下になるかと考えます。
- 既存の監視環境がZabbix
- Azure仮想マシンも監視対象にしたいが、Zabbix Agentを入れることが禁止されている
Azure基盤側の仮想ホストのメトリックをZabbixが収集できるので幸せになれる人がいるかと考え執筆しました。
今回は以下の2点について記事にしています。
- ローカルDocker環境に最新Zabbix一式をさくっと立てる(検証、個人ユース向け)
- ZabbixのAzure Templateを使って仮想マシンのメトリック監視の設定をする
前半記事だけでも、後半記事だけでも参考になれば良いかなと。
Zabbixをコンテナで立ち上げる
こちらで一式がメンテナンスされています。
とりあえず一式をcloneしてきます。
mkdir -p ~/git
cd ~/git
git clone https://github.com/zabbix/zabbix-docker.git
cd zabbix-docker
env_varsディレクトリ配下のパスワード関連のファイルは適宜修正したほうが良いと考えます。
ただし今回は一時的な検証目的なので何も変更せずにさくっと立ち上げてみます。
UbuntuベースでDBにMySQLを使うlatestなイメージを立ち上げるときには「docker-compose_v3_ubuntu_mysql_latest.yaml」で良いですね。
docker compose -f docker-compose_v3_ubuntu_mysql_latest.yaml up -d
上のコマンドでMySQL、Zabbix Server、Zabbix Webは立ち上がるのですが、暫く待ってから以下のコマンドでZabbix Agentも立ち上げておきました。
docker compose -f docker-compose_v3_ubuntu_mysql_latest.yaml up zabbix-agent -d
ps結果は以下の通りです。WebベースでDocker操作のためにPortainerも入っていますが、こちらは今回の記事では対象外です。
yotan@pokopoko:~/git/zabbix-docker$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4f57d7ce2338 zabbix/zabbix-agent:ubuntu-6.2-latest "/usr/bin/tini -- /u…" 37 seconds ago Up 36 seconds zabbix-docker-zabbix-agent-1
43d304aa521e zabbix/zabbix-web-nginx-mysql:ubuntu-6.2-latest "docker-entrypoint.sh" 4 minutes ago Up 4 minutes (healthy) 0.0.0.0:80->8080/tcp, :::80->8080/tcp, 0.0.0.0:443->8443/tcp, :::443->8443/tcp zabbix-docker-zabbix-web-nginx-mysql-1
998df537c06d zabbix/zabbix-server-mysql:ubuntu-6.2-latest "/usr/bin/tini -- /u…" 4 minutes ago Up 4 minutes 0.0.0.0:10051->10051/tcp, :::10051->10051/tcp zabbix-docker-zabbix-server-1
69f7c7ab2349 mysql:8.0-oracle "docker-entrypoint.s…" 4 minutes ago Up 4 minutes zabbix-docker-mysql-server-1
031a6097bb01 portainer/portainer-ce "/portainer" 18 hours ago Up 4 hours 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 9443/tcp Portainer
TCP/80でZabbix Webがリッスンしていますので、ブラウザから普通にhttpで接続できますね。
Zabbixの設定や操作はそれほど得意でないので、あまり深追いした事は書けません。ごめんなさい。
とりあえず最低限以下の事をやるといいかと。
- 初回に「Admin/zabbix」でログイン後、Adminユーザのパスワードを変更
- Timezoneの変更(日本であればAsia/Tokyo)
- 言語の変更(日本語であればja_JP)
また、先ほど追加で入れたZabbix Agentを有効化するために以下の操作も実施します。
- 「設定⇒ホスト⇒Zabbix Server」にてエージェントの「IPアドレス:127.0.0.1」を「DNS名:zabbix-agent」に変更
これで、エージェントの状態もアクティブになります。
ZabbixのAzure Templateの準備
最初にも書いた、Zabbix公式サイトのドキュメントを読みます。
https://www.zabbix.com/integrations/azure
仮想マシンの監視設定だけであれば、以下の手順を行えば良さそうですね。
- Azureサブスクリプションに対して「閲覧者(Reader)」権限のロールを付与したアプリケーション(サービスプリンシパル)を作成
- Zabbix上のマクロ定義で以下の変数を設定する
- {$AZURE.APP_ID}
- {$AZURE.PASSWORD}
- {$AZURE.TENANT_ID}
- {$AZURE.SUBSCRIPTION_ID}
- {$AZURE.RESOURCE_ID}
他にも対象リソースをフィルタするためのルールや、タイムアウト値などもありますが、今回は割愛します。
Azureのアプリケーション(サービスプリンシパル)作成
ドキュメントの手順通りにAzure CLIで操作します。サインインするAzureアカウントには対象サブスクリプションに対して所有者権限(Owner)相当が必要です。
$ az ad sp create-for-rbac --name zabbix --role reader --scope /subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Creating 'reader' role assignment under scope '/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'
The output includes credentials that you must protect. Be sure that you do not include these credentials in your code or check the credentials into your source control. For more information, see https://aka.ms/azadsp-cli
{
"appId": "9b7f3ea4-XXXX-XXXX-XXXX-fcb803e26db5",
"displayName": "zabbix",
"password": "CYQ8Q~1FWTiaKyxbZ8l6kg2DGDquXXXXXXXXXXXX",
"tenant": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
「az ad sp create-for-rbac」はデフォルトで有効期限が1年間のシークレットを生成します。
「--years」オプションで更に長い期間のシークレットも生成できますが、あまりお勧めはしません。
Zabbix Tenplateの追加作成
監視対象の仮想マシン固有ではなく、前章で実施したAzureアカウントに関する定義のみを設定したテンプレート「My Azure Subscription」を作成します。
「設定⇒テンプレート」から「テンプレートの作成」をクリックして始めます。
「テンプレート」タブでは以下を設定します。
- テンプレート名: 適当に
- テンプレート: Azure virtual machine by HTTP」を選択します
- テンプレートグループ: 適当に。私は元のテンプレートと同じグループに入れました。
- 説明: 適当に
「マクロ」タブでは以下を設定します。
- {$AZURE.APP_ID} : アプリケーションID(appId)
- {$AZURE.PASSWORD} : パスワード(password)
- {$AZURE.TENANT_ID} : テナントID(tenant)
- {$AZURE.SUBSCRIPTION_ID} : サブスクリプションID
無事追加されましたね。
対象の仮想マシンの監視対象設定
Azure仮想マシンとしては今回は特に実稼働していないUbuntuサーバを1つ対象にしてみます。
こちらです。
Azureポータルからは左メニューの「プロパティ」を開くことで、「リソースID」が確認できますのでこちらを控えておきます。
ふたたびZabbix管理画面にて、「設定⇒作成」にて「ホストの作成」をクリックします。
「ホスト」タブでは以下を設定します。
- ホスト名: 適当に。Azure側の仮想マシン名と同じにすると良いかと。
- テンプレート: 先ほど作ったテンプレート(今回はMy Azure Subscription)を選択します
- ホストグループ: 適当に
「マクロ」タブでは以下を設定します。
- {$AZURE.RESOURCE_ID} : 先に確認した仮想マシンのリソースID
「継承したマクロとホストマクロ」タブを見ると、ちゃんと元のテンプレートで定義した{$AZURE.APP_ID}などが入っていますね。
監視項目の微調整
ダッシュボードを見ると、いきなり障害が発生していますね。
「Azure virtual machine by HTTP」テンプレートが使っているスクリプトでエラーが発生しているようです。
エラー詳細を見ても見づらいな。ただし、Azure基盤から想定しているjsonデータが返却されてきていないようですね。
最新データの情報を見ると、以下についてエラーが発生していました。
- Azure: Available memory
- Azure: VM cached bandwidth consumed percentage
- Azure: VM cached IOPS consumed percentage
- Azure: VM uncached bandwidth consumed percentage
- Azure: VM uncached IOPS consumed percentage
Available memoryに関しては、Azureポータルのメトリックで確認すると「Preview」表記もあって、そのせいなのかなと考えますが、他は解せない感じ。
とりあえず今回は、テンプレートの「アイテム」から上記5つを無効化することで逃げました。
時間があれば、ZabbixにIssueを投げておきます。
ようやく、他のメトリックは収集できているようで、平和になりました。
グラフもそれっぽく表示されていますね。
仮想マシンの停止と起動
Azureポータル上から仮想マシンを停止したところ、ちゃんとダッシュボードに通知が表示されました。
更にしばらくしてから仮想マシンを再度立ち上げたところ、自動復旧とみなして障害ステータスが「解決済」に変わりましたね。
良い感じです。
おわりに
今回取得したメトリック監視や、アラート通知の仕組みなどは全てAzure Monitorの機能で同等のことが行えます。
それでも色々な事情でZabbixを使わなければいけないケースがあると考えます(悲しいですが)。
Zabbix 6.2にアップデートする必要はありますが、標準機能だけでAure仮想マシンの監視が行えるようになったのは良いことだと考えます。
他にもAzure Database for MySQL/PostgreSQLは両方ともSingle/Flexible serverに対応しているようです。
こちらも時間があれば今後動作を確認したいと考えます。
Discussion