🐷

ローカルPCのDockerコンテナでZabbixを動かしてAzure仮想マシンを監視する

2023/01/30に公開

はじめに

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をコンテナで立ち上げる

こちらで一式がメンテナンスされています。

https://github.com/zabbix/zabbix-docker

とりあえず一式を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」に変更

img

これで、エージェントの状態もアクティブになります。

img

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」を選択します
  • テンプレートグループ: 適当に。私は元のテンプレートと同じグループに入れました。
  • 説明: 適当に

img

「マクロ」タブでは以下を設定します。

  • {$AZURE.APP_ID} : アプリケーションID(appId)
  • {$AZURE.PASSWORD} : パスワード(password)
  • {$AZURE.TENANT_ID} : テナントID(tenant)
  • {$AZURE.SUBSCRIPTION_ID} : サブスクリプションID

img

無事追加されましたね。

img

対象の仮想マシンの監視対象設定

Azure仮想マシンとしては今回は特に実稼働していないUbuntuサーバを1つ対象にしてみます。

こちらです。

img

Azureポータルからは左メニューの「プロパティ」を開くことで、「リソースID」が確認できますのでこちらを控えておきます。

img

ふたたびZabbix管理画面にて、「設定⇒作成」にて「ホストの作成」をクリックします。

「ホスト」タブでは以下を設定します。

  • ホスト名: 適当に。Azure側の仮想マシン名と同じにすると良いかと。
  • テンプレート: 先ほど作ったテンプレート(今回はMy Azure Subscription)を選択します
  • ホストグループ: 適当に

img

「マクロ」タブでは以下を設定します。

  • {$AZURE.RESOURCE_ID} : 先に確認した仮想マシンのリソースID

img

「継承したマクロとホストマクロ」タブを見ると、ちゃんと元のテンプレートで定義した{$AZURE.APP_ID}などが入っていますね。

img

監視項目の微調整

ダッシュボードを見ると、いきなり障害が発生していますね。

「Azure virtual machine by HTTP」テンプレートが使っているスクリプトでエラーが発生しているようです。

img

エラー詳細を見ても見づらいな。ただし、Azure基盤から想定しているjsonデータが返却されてきていないようですね。

img

最新データの情報を見ると、以下についてエラーが発生していました。

  • 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

img

Available memoryに関しては、Azureポータルのメトリックで確認すると「Preview」表記もあって、そのせいなのかなと考えますが、他は解せない感じ。

img

とりあえず今回は、テンプレートの「アイテム」から上記5つを無効化することで逃げました。

時間があれば、ZabbixにIssueを投げておきます。

img

ようやく、他のメトリックは収集できているようで、平和になりました。

img

グラフもそれっぽく表示されていますね。

img

仮想マシンの停止と起動

Azureポータル上から仮想マシンを停止したところ、ちゃんとダッシュボードに通知が表示されました。

img

更にしばらくしてから仮想マシンを再度立ち上げたところ、自動復旧とみなして障害ステータスが「解決済」に変わりましたね。

img

良い感じです。

おわりに

今回取得したメトリック監視や、アラート通知の仕組みなどは全てAzure Monitorの機能で同等のことが行えます。

それでも色々な事情でZabbixを使わなければいけないケースがあると考えます(悲しいですが)。

Zabbix 6.2にアップデートする必要はありますが、標準機能だけでAure仮想マシンの監視が行えるようになったのは良いことだと考えます。

他にもAzure Database for MySQL/PostgreSQLは両方ともSingle/Flexible serverに対応しているようです。

こちらも時間があれば今後動作を確認したいと考えます。

Discussion