ZabbixをDockerでサクッとたててみる

Zabbixのお試しという位置づけでいろいろ試してみたのでメモ。

## Docker のインストール
Ubuntu 24.04 serverがインストール済みである前提で、下記のドキュメント通りにインストールする。

https://docs.docker.com/engine/install/ubuntu/

## Zabbix ServerをDocker Composeで立ち上げる
下記のGitHub上にZabbix公式のDocker ComposeのYAMLファイルが置いてあるのでありがたく使わせてもらう。

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

なお、ドキュメントはここ。
https://www.zabbix.com/documentation/current/en/manual/installation/containers#docker-compose

```
# git clone https://github.com/zabbix/zabbix-docker.git
# cd zabbix-docker
# docker compose -f ./docker-compose_v3_ubuntu_pgsql_latest.yaml up -d
```
しばらくすると、http://localhost:80/ で立ち上がってくる。

## Zabbixの設定
アクセスするとログイン画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/d3d4dfe0-1144-5d9f-fb08-15a717d99cc2.png)
user/passは、「Admin/zabbix」である。※Adminは大文字始まりなので注意。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/4b1794e1-ea01-f245-59eb-46da24174f7d.png)
無事にログインできた。

### 日本語化
左下の User settings ＞ Profile をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/6b9592a5-787a-0cde-91b7-b2e24f26d7e4.png)

下記の通り、設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/fa8ebce1-fbb3-c0a1-a369-40ed006a4b0d.png)

|設定項目|値|
|---|---|
|Language|Japanese(ja_JP)|
|Time zone|(UTC+09:00) Asia/Tokyo|
|Refresh|10s|

※Refreshは後のテストで表示を早くしたいので、設定した。

### Dockerホストへの Zabbix Agentのインストールと設定
インストール直後は、エージェントがないよと警告が出るので、入れてあげる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/21e27e01-544f-fd64-2a30-847623a03d0e.png)

Dockerを動かしているUbutnu Server にインストールする。
Zabbix公式のとおりである。
https://www.zabbix.com/jp/download?zabbix=7.0&os_distribution=ubuntu&os_version=24.04&components=agent_2&db=&ws=

```:リポジトリ設定
# wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.0-2+ubuntu24.04_all.deb
# dpkg -i zabbix-release_7.0-2+ubuntu24.04_all.deb
# apt update
```

```:エージェントインストール
# apt install zabbix-agent2 zabbix-agent2-plugin-*
```

```:エージェントの自動起動設定と開始
# systemctl restart zabbix-agent2
# systemctl enable zabbix-agent2
```

Zabbix Serverからアクセスできるように設定ファイルに追記する。
```:/etc/zabbix/zabbix_agent2.conf
# 80行目：Zabbix サーバーを指定（というか全許可）
Server=0.0.0.0/0
```

ここで、初期設定で入っているZabbix ServerのIPアドレスが、ローカルループバックアドレスなので、Ubuntu ServerのIPアドレスに変更する。
データ収集 ＞ ホスト ＞ Zabbix Server をクリックし、インターフェースのエージェントIPアドレスを対象のものに変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/31dfb612-ad4d-373b-36e9-38f5aa7a4a9d.png)

これで、Zabbix Serverの設定は完了である。
※Firewallの設定をしている場合は、ポート10050を開ける。

## CentOS Stream 9にZabbix Agent2 をインストール
Zabbix 公式ページにてインストール手順を確認する。
https://www.zabbix.com/jp/download?zabbix=7.0&os_distribution=centos&os_version=9&components=agent_2&db=&ws=

### リポジトリ設定
下記の通り、`excludepkgs=zabbix*`を追記する。
``` /etc/yum.repos.d/epel.repo
[epel]
...
excludepkgs=zabbix*
```
### リポジトリインストール
```
# rpm -Uvh https://repo.zabbix.com/zabbix/7.0/centos/9/x86_64/zabbix-release-7.0-5.el9.noarch.rpm
# dnf clean all
```

### Zabbix Agent2をインストール
```
# dnf install zabbix-agent2 zabbix-agent2-plugin-*
```

### エージェントの自動起動設定と開始
```
# systemctl restart zabbix-agent2
# systemctl enable zabbix-agent2
```

### エージェントの設定
今回は横着して全許可。
```:/etc/zabbix/zabbix_agent2.conf
# 80行目：Zabbix サーバーを指定（というか全許可）
Server=0.0.0.0/0
```

### Firewallの設定
```
# firewall-cmd --add-port=10050/tcp
success
# firewall-cmd --runtime-to-permanent
success
```

## Zabbix にてホスト登録
データ収集 ＞ ホスト にて、左上のホストの作成をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/ece7d5a2-940b-a16b-2743-5d054790dc64.png)

下記の通り、値を入力し、追加をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/0371be67-2c16-ec2a-43c0-8d8d4902ba9e.png)

|設定項目|値|
|---|---|
|ホスト名|（設定したホスト名）|
|テンプレート|`Linux by Zabbix Agent` `ICMP Ping`|
|ホストグループ|`Linux servers`|
|インターフェース|（エージェントを選択し、IPアドレスを入力）|

監視データ ＞ ホスト　から、ホストが追加され、エージェントの状態がGreenになっていたらOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/3de96934-c6a0-8871-b5f8-c87d23956de2.png)

## データ収集の間隔を狭める
このあと監視テストをしたいが、待ち時間がもったいなので、デフォルトの間隔を狭める。今回はLoad AverageとICMP Ping。

### Load Averageの監視間隔
データ収集 ＞ テンプレート　から、「Linux」を検索し、「Linux by Zabbix Agent」のアイテムをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/3b2da899-c222-f6dd-0dd3-328a9234ae54.png)

「Load」検索し、「Load Average(1m avg)」をクリックして、監視間隔を`10s`にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/31428bbc-2233-bb26-d52a-5d46d2522e15.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/faf8fd09-c020-3c3b-2716-b3169d1fc448.png)

これを、「Load Average(5m avg)」「Load Average(15m avg)」にも行う。

また、トリガー設定も変更する。
「Load Average(1m avg)」の「トリガー」をクリックし、「Load average is too high」をクリックする。
下記の通り、修正する。`5m`判定を`15s`判定に変えている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/e623e19f-d532-2fbd-873a-d52cce29d44b.png)

```diff
イベント名
- Load average is too high (per CPU load over {$LOAD_AVG_PER_CPU.MAX.WARN} for 5m)
+ Load average is too high (per CPU load over {$LOAD_AVG_PER_CPU.MAX.WARN} for 15s)

条件式
- min(/Linux by Zabbix agent/system.cpu.load[all,avg1],5m)/last(/Linux by Zabbix agent/system.cpu.num)>{$LOAD_AVG_PER_CPU.MAX.WARN} and last(/Linux by Zabbix agent/system.cpu.load[all,avg5])>0 and last(/Linux by Zabbix agent/system.cpu.load[all,avg15])>0
+ min(/Linux by Zabbix agent/system.cpu.load[all,avg1],15s)/last(/Linux by Zabbix agent/system.cpu.num)>{$LOAD_AVG_PER_CPU.MAX.WARN} 
```

### ICMP Pingの監視間隔
同じように、データ収集 ＞ テンプレート ＞ `ICMP Ping`を検索 ＞ アイテム ＞ `ICMP Ping` をクリック。
監視間隔を`5s`とする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/0eb8ba82-fff5-ba90-3cf4-4a2f6bb82078.png)

## アラート発報テスト
### CPU負荷
下記コマンドをCPU個数+2個分実行する。
```
# yes > /dev/null &
# yes > /dev/null &
# yes > /dev/null &
# yes > /dev/null &
```

TOPコマンドでも確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/e14eaa10-bd77-fb7d-9a9b-3676c06ace29.png)


こんな感じで2分程度で発報される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/8bf98045-353c-f44d-5463-60327accdebc.png)

停止するときはこう。
```
# jobs
[1]   実行中               yes > /dev/null &
[2]   実行中               yes > /dev/null &
[3]-  実行中               yes > /dev/null &
[4]+  実行中               yes > /dev/null &
# kill %1 %2 %3 %4
[1]   Terminated              yes > /dev/null
[2]   Terminated              yes > /dev/null
[3]-  Terminated              yes > /dev/null
[4]+  Terminated              yes > /dev/null
```

### Ping疎通不可
NWを切断してみた。
こんな感じで、30秒程度で発報される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/0ef62ad0-ae8c-150d-817b-6182989f4d47.png)

## 障害時にPATLITEを光らせる
Ping疎通不可が出た場合に、PATLITEを光らせるようにする。
### スクリプト設定
Zabbix Serverからたたくスクリプトを設定する。
スクリプトの詳細は下記公式ドキュメントを参照。

https://www.patlite.co.jp/product/detail0000000771.html

```bash:赤を光らせる場合
curl http://192.168.17.22/api/control?led=10000
```
```bash:消灯する場合
curl http://192.168.17.22/api/control?led=00000
```

左ペインから、通知 ＞ スクリプト から「スクリプトの作成」で、下記のように作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/af1674c5-c625-ecf0-996d-8db9b410ccdd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/bc5138ec-b322-8eb3-045a-1eb3db417cb7.png)

### アクション設定
作成したスクリプトとアクションを紐づける。
通知 ＞ アクション ＞ トリガーアクション から「アクションの作成」をクリックする。

実行条件を追加で、下記の通り設定する。

|項目|値|
|---|---|
|タイプ|テンプレート|
|オペレータ|等しい|
|テンプレート|`ICMP Ping`|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/40e4bbb4-79b3-32da-3110-0db40ccf9133.png)

実行内容タブでは「実行内容」と「復旧時の実行内容」をそれぞれ下記のように追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/1c6e1fef-44b7-997c-2d08-49ebf43ccfc5.png)

そうすると、このようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/75a608ae-7a1f-c23c-1d1c-fb1c00703ecc.png)

以上で、ICMP Pingの障害発生時には、PATLITEが赤く光る。