DockerとラズパイでZabbix入門

# 今回やること

1. DockerにZabbixサーバーをたてる
1. ラズパイにZabbixエージェントを入れる
1. Zabbixサーバにエージェント（ラズパイ）を登録する

## 前提

- Windowsでやる
- WindowsにはDocker Desktopがインストールされている
- Windowsとラズパイが同一ネットワークに存在する
    - 今回は`192.168.10.0/24`ネットワーク

## 検証環境

### Zabbixサーバー

- Windows 11 Home 22H2
    - Docker version 20.10.21, build baeda1f
    - IP: 192.168.10.**101**

```bash
zabbix_server -V

zabbix_server (Zabbix) 6.2.5
Revision c6d01ae 28 November 2022, compilation time: Nov 28 2022 18:35:47
```

### Zabbixエージェント

- Raspberry Pi 3 Model B+
    - IP: 192.168.10.**107**

```bash
zabbix_agentd -V

zabbix_agentd (daemon) (Zabbix) 6.0.11
Revision 17788cd2098 28 November 2022, compilation time: Nov 28 2022 09:19:03
```

# DockerにZabbixサーバーをたてる

[Zabbixの使用例](https://www.zabbix.com/documentation/6.0/jp/manual/installation/containers#%E4%BD%BF%E7%94%A8%E4%BE%8B)を参考に、**例2 PostgreSQL データベース**を使ってインストールする

```bash:PostgreSQLデータベース版のZabbixサーバ
docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net

docker run --name postgres-server -t -e POSTGRES_USER="zabbix" -e POSTGRES_PASSWORD="zabbix_pwd" -e POSTGRES_DB="zabbix" --network=zabbix-net --restart unless-stopped -d postgres:latest

docker run --name zabbix-snmptraps -t -v /zbx_instance/snmptraps:/var/lib/zabbix/snmptraps:rw -v /var/lib/zabbix/mibs:/usr/share/snmp/mibs:ro --network=zabbix-net -p 162:1162/udp --restart unless-stopped -d zabbix/zabbix-snmptraps:alpine-6.0-latest

docker run --name zabbix-server-pgsql -t -e DB_SERVER_HOST="postgres-server" -e POSTGRES_USER="zabbix" -e POSTGRES_PASSWORD="zabbix_pwd" -e POSTGRES_DB="zabbix" -e ZBX_ENABLE_SNMP_TRAPS="true" --network=zabbix-net -p 10051:10051 --volumes-from zabbix-snmptraps --restart unless-stopped -d zabbix/zabbix-server-pgsql:alpine-6.0-latest

docker run --name zabbix-web-nginx-pgsql -t -e ZBX_SERVER_HOST="zabbix-server-pgsql" -e DB_SERVER_HOST="postgres-server" -e POSTGRES_USER="zabbix" -e POSTGRES_PASSWORD="zabbix_pwd" -e POSTGRES_DB="zabbix" --network=zabbix-net -p 443:8443 -p 80:8080 -v /etc/ssl/nginx:/etc/ssl/nginx:ro --restart unless-stopped -d zabbix/zabbix-web-nginx-pgsql:alpine-6.0-latest
```

`http://192.168.10.101:80`にアクセスして、ログイン画面が出たら成功

:::note warn
80番ポートを他のサービスが使用していると、Dockerの起動に失敗する
:::

```bash:docker ps コマンドの結果
CONTAINER ID   IMAGE                                             COMMAND                  CREATED      STATUS      PORTS                                         NAMES
7e664e4f5023   zabbix/zabbix-web-nginx-pgsql:alpine-6.2-latest   "docker-entrypoint.sh"   5 days ago   Up 2 days   0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp   zabbix-web-nginx-pgsql
7251684fec13   zabbix/zabbix-server-pgsql:alpine-6.2-latest      "/sbin/tini -- /usr/…"   5 days ago   Up 2 days   0.0.0.0:10051->10051/tcp                      zabbix-server-pgsql
74a3b475aa9f   zabbix/zabbix-snmptraps:alpine-6.2-latest         "/usr/sbin/snmptrapd…"   5 days ago   Up 2 days   0.0.0.0:162->1162/udp                         zabbix-snmptraps
ff29d26e827c   postgres:latest                                   "docker-entrypoint.s…"   5 days ago   Up 2 days   5432/tcp                                      postgres-server
```

# ラズパイにZabbixエージェントをインストールする

## インストールするパッケージを選択する

[Zabbixのダウンロードサイト](https://www.zabbix.com/download)へ。
Linuxのいろいろなディストリビューションが選択できるようになっているので
間違えないように、自身のラズパイにあった設定を選択する。

項目|値
-|-
zabbix|6.0
os_distribution|raspberry_pi_os
os_version|9
components|agent
db|（空）
ws|（空）

今回はLTSのバージョン6.0を入れた。
`os_version`は下記コマンドから調べる。
`db`（データベース）と`ws`（ウェブサーバー）は、エージェントだから不要っぽい。

```bash:ラズベリーパイのバージョンを調べる
lsb_release -a

No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.13 (stretch)
Release:        9.13
Codename:       stretch
```

### Zabbixをインストールするコマンド一覧

設定を選択し終えると、コマンドの一覧が表示されるので
上から順にコピペして入れていく

```bash
wget https://repo.zabbix.com/zabbix/6.0/raspbian/pool/main/z/zabbix-release/zabbix-release_6.0-5%2Bdebian9_all.deb
dpkg -i zabbix-release_6.0-5+debian9_all.deb
apt update
apt install zabbix-agent
systemctl restart zabbix-agent

# サービスの自動機能を有効にする
systemctl enable zabbix-agent

# 不要なファイルを削除
rm zabbix-release_6.0-5+debian9_all.deb
```

#### インストール後の確認

`systemctl status zabbix-agent`でステータスが**active(runnning)**になっていればOK

また、自動起動は下記コマンドで確認する

```bash
systemctl list-unit-files | grep zabbix

zabbix-agent.service                   enabled
```

`enabled`になっていればOK

### 設定ファイル（`zabbix_agentd.conf`）を変更する

`vi /etc/zabbix/zabbix_agentd.conf`で設定ファイルを変更する
変更するのはたった2か所。サーバーのIPアドレスと、自身のホスト名だけ変更する。

```bash:zabbix_agentd.confの変更箇所
Server=192.168.10.101
Hostname=pianget
```

:::note info
読み取り専用になってしまう場合は、`sudo vi (以下略)`として特権モードになって作業する
:::

最後に、**設定ファイルの変更を反映するために、`systemctl restart zabbix-agent`を再度実行**する

# 疎通確認

サーバー（Win11/Docker）からエージェント（ラズパイ）へ疎通確認する

Dockerの`zabbix-server-pgsql`のターミナルから`zabbix_get`でラズパイのIPを指定して
ホスト名を取得してみる

```bash:
zabbix_get -s 192.168.10.107 -p 10050 -k agent.hostname

# 成功時：エージェントのホスト名が返ってくる
pianget

# 失敗例
zabbix_get [234]: Check access restrictions in Zabbix agent configuration
```

失敗する場合はIPが正しくないか、設定が反映されていない可能性があるので
先の`zabbix_agentd.conf`の`Server=`右辺を確認・変更し、サービス再起動`systemctl restart zabbix-agent`をする

## 疎通トラブルシューティング

疎通がうまくいかない場合の確認事項

- `ping {サーバIP}`で応答が返ってくるか？
- `systemctl reboot`でラズパイ再起動

# Zabbixホストにラズパイを登録する

## ホストの追加

`http://192.168.10.101:80`にアクセスし、左側ペインの設定→ホスト→ホストの作成

下記設定の通り設定を入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/bb66c5a3-5450-7181-82ca-42463e8432ed.png)

エージェントの状態が緑になれば成功

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/2f0a6c3a-8503-ffe8-ff9d-63b349e92237.png)

# 糸冬了！！

# 参考

https://www.youtube.com/watch?v=zy9xis0IrpM

https://www.youtube.com/watch?v=dzUnSOHJB3A

https://www.youtube.com/watch?v=PnHZk0-lJLE