とほほのZabbix入門

目次

Zabbixとは

Zabbix関連用語

Zabbixサーバ
監視を行うサーバ。
Zabbixエージェント
監視される側にインストールされるプログラム。
Zabbixエージェント2
Zabbixエージェントの次世代版。Go言語で開発されており、Zabbixエージェントに対していくつかの強化ポイントがありますが、いくつか未サポートの機能もあります。
Zabbixプロキシ
ZabbixサーバとZabbixエージェントの中間に位置し、Zabbixサーバの命令に従いZabbixエージェントを監視し、また、複数のZabbixエージェントから収集したデータをまとめてZabbixサーバに転送する機能を持ちます。
パッシブチェック
Zabbixエージェントが受信側となり、Zabbixサーバからの要求にZabbixエージェントが応える方式です。
アクティブチェック
Zabbixエージェントが送信側となり、ZabbixエージェントからZabbixサーバに対して通知を行う方式です。
ホスト
監視対象。例えば、192.168.0.4 のホストなどのIPアドレスを持つホスト。
アイテム
監視項目。例えば、死活状況、CPU負荷状況、メモリ状況など。
トリガ
監視項目の値によってアラートを発生させる条件。例えば、CPU負荷が90%を超えると高レベルのアラートを上げるなど。

バージョン

過去の主なバージョン履歴は下記の通りです。

Zabbix 1.0      2004年
Zabbix 1.1      2006年
Zabbix 1.4      2007年
Zabbix 1.6      2008年
Zabbix 1.8      2009年
Zabbix 2.0 LTS  2012年
Zabbix 3.0 LTS  2016年
Zabbix 4.0 LTS  2018年10月1日
Zabbix 5.0 LTS  2020年5月12日
Zabbix 6.0 LTS  2022年2月15日

サポート終了予定日は下記を参照してください。

インストール

インストールは下記の手順に従います。例として Rocky Linux 8 上のコンテナに Zabbix Server 6.0 をインストールする手順を示します。

Podman をインストールします。

# dnf -y install podman podman-docker
# touch /etc/containers/nodocker

下記の環境変数を使用します。

NET_NAME=zabbix_net
NET_ADDR=192.168.0.0/24
DB_ADDR=192.168.0.2
DB_IMAGE=docker.io/mysql
DB_SERVER=zabbix_db
DB_NAME=zabbix
DB_USER=zabbix
DB_PASS=zabbix123
DB_ROOT_PASS=root123
DB_VERSION=8.0.32
ZABBIX_SERVER=zabbix_server
ZABBIX_ADDR=192.168.0.3
ZABBIX_PORT=80
AGENT_NAME=zabbix_agent
AGENT_ADDR=192.168.0.4

Dockerネットワークを作成します。

# docker network create --subnet ${NET_ADDR} ${NET_NAME}

DBコンテナを起動します。

# docker run -d --name ${DB_SERVER} -h ${DB_SERVER} --net ${NET_NAME} --ip ${DB_ADDR} \
  -e MYSQL_ROOT_PASSWORD=${DB_ROOT_PASS} ${DB_IMAGE}:${DB_VERSION}

DBに接続できることを確認します。接続できるようになるまで数分かかることもあります。

# docker exec -it ${DB_SERVER} mysql -u root -p${DB_ROOT_PASS}
....
mysql> quit

Zabbixサーバコンテナを起動します。

# docker run -d --name ${ZABBIX_SERVER} -h ${ZABBIX_SERVER} \
  --net ${NET_NAME} --ip ${ZABBIX_ADDR} -p ${ZABBIX_PORT}:80 docker.io/rockylinux/rockylinux:8 /sbin/init

Zabbixサーバにログインします。

# docker exec -it ${ZABBIX_SERVER} /bin/bash

ログイン後は上記の環境変数を再度設定してください。

DB_ADDR=192.168.0.2
DB_ROOT_PASS=root123
DB_USER=zabbix
DB_PASS=zabbix123
DB_NAME=zabbix
ZABBIX_SERVER=zabbix_server
ZABBIX_ADDR=192.168.0.3

必要なものをインストールします。

# rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-4.el8.noarch.rpm
# dnf clean all
# dnf -y install glibc-langpack-en glibc-langpack-ja mysql \
  zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent

MySQLサーバを初期化します。server.sql.gz の読込には時間がかかります。

# cat <<EOF | mysql -h ${DB_ADDR} -uroot -p${DB_ROOT_PASS}
create database ${DB_NAME} character set utf8mb4 collate utf8mb4_bin;
create user ${DB_USER}@'${ZABBIX_ADDR}' identified with mysql_native_password by '${DB_PASS}';
grant all privileges on ${DB_NAME}.* to ${DB_USER}@'${ZABBIX_ADDR}';
set global log_bin_trust_function_creators = 1;
EOF
# zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -h ${DB_ADDR} -u${DB_USER} -p${DB_PASS} ${DB_NAME}
# echo "set global log_bin_trust_function_creators = 0" | mysql -h ${DB_ADDR} -uroot -p${DB_ROOT_PASS} ${DB_NAME}

/etc/nginx/nginx.conf ファイルを編集し、デフォルトサーバをコメントアウトして無効化します。

#     server {
#         listen       80 default_server;
#         listen       [::]:80 default_server;
#         server_name  _;
#         root         /usr/share/nginx/html;
#         # Load configuration files for the default server block.
#         include /etc/nginx/default.d/*.conf;
#         location / {
#         }
#         error_page 404 /404.html;
#             location = /40x.html {
#         }
#         error_page 500 502 503 504 /50x.html;
#             location = /50x.html {
#         }
#     }

/etc/nginx/conf.d/zabbix.conf を編集します。server_name にはブラウザからアクセスする際の http://server_name/ に指定するサーバ名を設定してください。

server {
        listen          80;
        server_name     zabbix.example.com;

/etc/zabbix/zabbix_server.conf を編集します。

DBHost=192.168.0.2    # ${DB_ADDR}の値
DBName=zabbix         # ${DB_NAME}の値
DBUser=zabbix         # ${DB_USER}の値
DBPassword=zabbix123  # ${DB_PASS}の値

プロセスを起動します。

# systemctl start zabbix-server zabbix-agent nginx php-fpm
# systemctl enable zabbix-server zabbix-agent nginx php-fpm

初期設定を行うため、ブラウザから下記を行ってください。

下記のログを見ると Zabbix サーバの状況が分かります。

問題なさそうであれば、Zabbixサーバコンテナから抜けます。

# exit

Zabbixエージェントコンテナを起動します

# Zabbixエージェントコンテナを起動
# docker run -d -it --name ${AGENT_NAME} -h ${AGENT_NAME} \
  --net ${NET_NAME} --ip ${AGENT_ADDR} docker.io/rockylinux/rockylinux:8 /sbin/init

# Zabbixエージェント用コンテナにログイン
# docker exec -it ${AGENT_NAME} /bin/bash

# Zabbixエージェントをインストール
# rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-4.el8.noarch.rpm
# dnf clean all
# dnf -y install zabbix-agent

# コンフィグファイル修正
# sed -i 's/^Server=.*/Server=192.168.0.3/' /etc/zabbix/zabbix_agentd.conf
# sed -i 's/^ServerActive=.*/ServerActive=192.168.0.3/' /etc/zabbix/zabbix_agentd.conf

# Zabbixエージェント起動
# systemctl restart zabbix-agent
# systemctl enable zabbix-agent
# exit

クイックスタート

ホストを登録する

まずは監視対象のホストを登録します。Zabbix画面の [設定]-[ホスト]-[ホストの作成] から下記を指定して [追加] します。

アイテムを追加する

host-4 に最もシンプルな icmpping アイテムを追加してみます。[設定]-[ホスト] で対象ホスト host-4 の横の [アイテム]-[アイテムの作成] から下記を指定して [適用] します。

[監視データ]-[最新データ] でホスト host-4 を選択ししばらくすると、最新の値として 1 が表示されます。icmpping は ping で死活監視を行い、監視対象が生きていれば 1、ダウンしていれば 0 を記録します。

利用可能なアイテムタイプは下記を参照してください。

トリガーを追加する

[設定]-[ホスト] で対象ホスト host-4 の横の [トリガー]-[トリガーの作成] から下記を指定して [追加] します。

host-4 を停止すると icmpping の結果が 0 となります。上記の条件式は、最近3回分の結果の最大値が0である(つまりすべて0である)ことをチェックしています。この条件が満たされると重度の障害となり、[監視データ]-[ダッシュボード] や [監視データ]-[障害] にアラートが表示されます。利用可能なトリガー関数は下記を参照してください。

ホストグループを追加する

ホストグループは、複数のホストをグルーピングするものです。ホストグループを追加するには [設定]-[ホストグループ]-[ホストグループの作成] から下記を指定して [追加] します。

ホストをホストグループに追加するには、[設定]-[ホスト] でホストをクリックし、[グループ] にホストグループを追加します。

テンプレートを追加する

テンプレートはアイテムやトリガーを含みます。ホストにテンプレートを適用することで、あらかじめ用意しておいたアイテムやトリガーをホストに対して適用することができます。テンプレートを追加するには、[設定]-[テンプレート]-[テンプレートの作成] から下記を指定して [追加] します。

テンプレートに対して、アイテムやトリガーを作成することができます。

テンプレートをホストに適用するには、[設定]-[ホスト] から対象ホストをクリックし、[テンプレート] にテンプレートを追加します。

主な監視項目

Ping

ICMP-ECHO(Ping)を用いて死活監視を行います。Zabbixエージェントがインストールされていなくても監視できます。アイテムには icmpping を指定します。生きていれば 1、ダウンしていれば 0 が記録されます。トリガーには 1回でも応答が無ければアラートとする場合は、 last(/ホスト名/icmpping)=0 を、直近3回連続して応答が無い時にエラーとする場合は、max(/ホスト名/icmpping,#3)=0 を指定します。

エージェントPing

ICMP-ECHO(Ping) ではなく、Zabbix エージェントに対して接続可能か否かで死活監視します。アイテムには agent.ping を指定します。icmpping では、生きていれば 1、ダウンしていれば 0 でしたが、agent.ping は生きていれば 1、死んでいればデータなしとなるため、トリガーの条件式は last(...)=0 ではなく、nodata(/ホスト名/agent.ping,5m)=1 の様に設定します。

CPU使用率

CPUの使用率を監視するにはアイテムに system.cpu.util を指定します。直近5分間のCPU使用率がいずれも80%を上回った場合にアラートを発生させる場合、トリガーには min(/ホスト名/system.cpu.util,5m)>80 を指定します。

メモリ使用率

メモリ使用率を監視する手段は対象OSによって微妙に異なります。既存のテンプレートを参考にするのがよさそうです。例えば、Windows memory by Zabbix agent というテンプレートでは、アイテムに last(//vm.memory.size[used]) / last(//vm.memory.size[total]) * 100 という式から計算される vm.memory.util という名前のキーを定義し、トリガーに min(/ターゲット/vm.memory.util,5m)>{$MEMORY.UTIL.MAX} を指定しています。また、Linux memory by Zabbix agent というテンプレートでは、メモリの空き率 vm.memory.size[pavailable] の値を 100 から引いた値を vm.memory.utilization という依存アイテムとして定義し、トリガーに min(/ターゲット/vm.memory.utilization,5m)>{$MEMORY.UTIL.MAX} を指定しています。他にもスワップの頻度などを監視しています。

MIB監視

アイテムでタイプに SNMPv* agent、キーには任意の識別名、SNMP OID に .1.3.6.1.2.1.25.1.1.0 などのOID、SNMPコミュニティに public などのSNMPコミュニティ名を指定します。トリガーはMIB値の型(整数や文字列など)によって適切に指定してください。

Web監視

Web監視するには、[設定]-[ホスト] で対象ホストの [Web]-[Webシナリオの作成] から Web監視シナリオを作成します。[ステップ] タブの [追加] から Web監視の対象とする URL を入力してください。

ツール

Zabbix get

Zabbixサーバから、Zabbixエージェントに対してコマンドラインから要求を行うツールです。

# dnf -y install zabbix-get
# zabbix_get -s 192.168.0.4 -p 10050 -k "agent.ping"

Zabbix sender

Zabbixエージェントから、Zabbixサーバーに対して通知を送信するツールです。

# dnf -y install zabbix-sender
# zabbix_sender -z 192.168.0.3 -s "Sender Test" -k db.connections -o 43

プロキシ

概要

Zabbix Proxy は Zabbix Server と Zabbix Agent の中間に位置し、Server から設定情報を受け取り Agent に設定したり、Agent からの情報をキャッシュして Server に一括転送したりします。Server と Agent が直接通信できない場合に Server と Proxy、Proxy と Agent 間の通信さえ確保すれば監視できること、Server の負荷を Proxy に分散できること、通信負荷を減らせることなどのメリットがあります。

Zabbix Proxy から見て、Proxy が Server に接続して設定情報を読み取りに行く アクティブモード と、Server が Proxy に接続して設定情報を受け取る パッシブモード があります。

インストール

# rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-1.el8.noarch.rpm
# dnf clean all
# dnf -y install mariadb zabbix-proxy-mysql zabbix-sql-scripts
# cat <<EOF | docker exec -i zabbix-db mysql -h 192.168.0.2 -u root -proot123
create database zabbix_proxy character set utf8mb4 collate utf8mb4_bin;
create user zabbix_proxy@'%' identified by 'zabbix_proxy123';
grant all privileges on zabbix_proxy.* to zabbix_proxy@'%';
EOF
# cat /usr/share/doc/zabbix-sql-scripts/mysql/proxy.sql | \
  mysql -h 192.168.0.2 -u zabbix_proxy -pzabbix123 zabbix_proxy
# vi /etc/zabbix/zabbix_proxy.conf

コンフィグファイルには下記を設定します。取得周期はお試し用に短い時間(60秒)を指定していますが、本番環境では負荷に応じた適切な値に設定してください。

ProxyMode=0			# プロキシモード(0:アクティブ、1:パッシブ)
Server=192.168.0.3		# Zabbixサーバのアドレス
Hostname=proxy-6		# プロキシ名
DBHost=192.168.0.2		# DBサーバのアドレス
DBName=zabbix_proxy		# DBのデータベース名
DBUser=zabbix_proxy		# DBユーザ名
DBPassword=zabbix123		# DBパスワード
ConfigFrequency=60		# アクティブモードの際の設定情報取得周期

準備ができたらプロキシを起動します。

# systemctl start zabbix-proxy
# systemctl enable zabbix-proxy

問題がある場合はログにエラーメッセージが出力されます。

# tail -f /var/log/zabbix/zabbix_proxy.log

サーバ側の設定

Web画面の [管理]-[プロキシ]-[プロキシの作成] からプロキシを登録します。アクティブ、パッシブの選択はプロキシの設定に合わせてください。また、プロキシ名はプロキシ側のコンフィグファイルの Hostname で指定した名前に合わせてください。

また、[設定]-[ホスト] でホストを作成する際に、上記で作成したプロキシを指定してください。

エージェント側の設定

エージェント側は、/etc/zabbix/zabbix_agentd.conf の Server の値を Zabbix Server ではなく Zabbix Proxy のアドレスを指定してください。

依存アイテム

監視のための通信負荷を減らすこと、また、整合性の観点から同時に取得すべきデータをまとめて取得することを目的として依存アイテムがサポートされています。マスターとなるアイテムを一度だけ取得し、その値を複数の依存アイテムに分解することで、一度に複数の値を取得することが可能となります。まず、マスターとなるアイテムをひとつアイテムに追加します。もうひとつアイテムを作成する際に、[タイプ] に 依存アイテム を選択し、[キー] には自由なキー名を命名し、[マスターアイテム] にマスターとなるアイテムを指定します。また、[保存前処理] でマスターアイテムの値から依存アイテムの値を取り出す処理を設定します。例えば、JSON から "name" の値を取り出すには JSON Path $.name を指定します。

サーバ・エージェント間のプロトコル

サーバ・エージェント間は比較的簡単なプロトコルで実装されています。要求側も応答側も、4バイトの固定値("ZBXD")と、1バイトのバージョン番号、8バイトのデータ長、データから構成されます。データ部は "agent.ping" のような文字列でやりとりされます。

Header:  0x5a 0x42 0x58 0x44 ... "ZBXD"
Version: 0x01 ... Version 1
Length:  8バイト(BIGエンディアン)のデータ長
Data:    文字列

メモ

CentOS 7 に Zabbix Server 4.0 をインストールする際に /usr/share/doc/zabbix-server-mysql*/create.sql.gz ファイルが無い場合、/etc/yum.conf の nodocs を削除するとよいようです。

tsflags=nodocs    # 修正前
tsflags=          # 修正後