Docker上にZabbixをたててUbuntuを監視する

## この記事の対象読者

- Zabbixサーバをたてて、Linuxのホストを監視してみたい人
- 仕事でZabbixを使っているけど、家でも触りたい人

自宅でサーバを立てるのは大変なので、Dockerを使ってサクっと試しましょう。

### この記事では

前提として、Docker環境がつかえることです。

DockerにZabbixサーバをたてます。
公式に詳しいマニュアルが載っているので、サクッとサーバをたてることができます。

つづけて、同じくDocker内にUbuntuサーバをたてます。
そのサーバにZabbixエージェントをインストールして、実際に監視してみます。

## Zabbixサーバを構築する

[Zabbix Dockerコンテナの利用例2](https://www.zabbix.com/documentation/6.0/jp/manual/installation/containers#%E4%BE%8B)に沿ってZabbixサーバ群を構築する。

```bash
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
```

いくつかのコンテナが協同することで、Zabbixの機能が提供される。
[こちらのQiita記事](https://qiita.com/myama0827/items/31f34d2ad8c92fb818c0#%E7%92%B0%E5%A2%83)に分かりやすい図がある。


### 作成されたコンテナを確認する

Dockerデスクトップアプリの画面キャプチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/434f3588-7e06-7eab-9d26-9a666d7e7b3e.png)

４つのコンテナが起動している

コンテナ名|役割|localhostに空いているポート|Dockerネットワーク内のIPアドレス
-|-|-|-
zabbix-server-pgsql|Zabbixエージェントからの通信を受け付ける|Zabbix監視受信用(tcp10051)|172.20.240.2
postgres-server|DBサーバ。とくに意識する必要はない。|なし|***
zabbix-web-nginx-pgsql|WEBサーバ。ここにログインして監視対象の状態を確認する。|HTTP(tcp80), HTTPS(tcp443)|***
zabbix-snmptraps|SNMPトラップ通信を受け付ける。Zabbixエージェントソフトをインストールできない通信機器やNASからの通信を受け付ける。|SNMPトラップ受信用(udp162)|***

IPアドレスについては、`docker network inspect zabbix-net`を打つとわかる。

:::note warn
Dockerのコンテナは起動するごとにIPアドレスが自動的に割り当てされるので
たとえばDockerを動かしているパソコンを再起動した場合などは
IPアドレスの割りあてが変わるためZabbixエージェント側の設定にも影響があることに注意する！！
:::

Windowsであれば`Test-NetConnection localhost -Port 10051`でコンテナと疎通確認できる。
WEBサーバであれば`localhost:80`にアクセスしてログイン画面が表示されるはず。
ログインしたらまずは設定画面から日本語設定にすべし。

【ログインした画面】 ※日本語設定済み

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/3fb1d181-f1cf-4a19-f0c5-9f4aaa8f1c53.png)

## Ubuntu Linuxホストを作成する

`ubuntu-1`というホストを作成する。（コンテナ名であって、ホスト名ではない）

```bash
# コンテナをつくる
docker run --name ubuntu-1 -it --network=zabbix-net -d ubuntu
# コンテナの中に入る
docker container exec -it ubuntu-1 bash
```

インストーラを選定するために、OSのバージョンを確認しておく。
2024/9時点で最新のUbuntuコンテナイメージは24.04バージョンらしい。

```bash
root@7830d9ef2faa:/# cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
```

`docker network inspect zabbix-net`で調べると、"ubuntu-1"のIPアドレスは"IPv4Address": "172.20.240.5/16"であることが分かった。

### Ubuntu にZabbixエージェントをインストールする

[Zabbix公式の手順](https://www.zabbix.com/download?zabbix=6.0&os_distribution=ubuntu&os_version=24.04&components=agent_2&db=&ws=)に沿ってZabbixエージェントをインストールする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/fc5762b2-c32f-6bb5-a65e-d2e16f33d292.png)

コンテナイメージだと必要なコマンドが足りない場合があるので、適宜インストールする

```bash
# wgetコマンドを入手
apt install wget -y
# ついでに vim や netcat もインストールしておくと、あとで便利

# リポジトリアップデート
wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-6+ubuntu24.04_all.deb
dpkg -i zabbix-release_6.0-6+ubuntu24.04_all.deb
apt update

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

### Zabbix コンフィグファイルを書き換える

`vi /etc/zabbix/zabbix_agent2.conf`でコンフィグファイルを書き換える
書き換える箇所は３か所

- ServerActive=172.20.240.2
- Server=172.20.240.2
- Hostname=ubuntu-1

Serveは監視サーバ→ホストに対する監視用
ServerActiveはホスト→サーバに対する監視用
ホスト名は監視サーバでホストを登録したときのホスト名を合わせておく

巻末にも載せるが、[こちら](https://cloudsteady.jp/2024/03/11/77859/)の記事がわかりやすかった。

#### Zabbixサービスを起動する

インストール直後はサービスが起動していないので、手動でサービスを起動する

```bash
root@7830d9ef2faa:/# service --status-all
 [ - ]  procps
 [ - ]  zabbix-agent2
 root@7830d9ef2faa:/# service zabbix-agent2 start
 * Starting Zabbix agent zabbix_agent2                                                                           [ OK ]
root@7830d9ef2faa:/# service --status-all
 [ - ]  procps
 [ + ]  zabbix-agent2
```

### Ubuntu の監視設定

Zabbixサーバ(zabbix-server-pgsql)からの疎通確認 tcp10050

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/e4181bb3-ea08-47e5-454c-696d216e999d.png)

ホストからZabbixサーバに疎通確認 tcp10051
zabbix-server-pfsqlしか許可されていないことがわかる

```bash
root@7830d9ef2faa:/# nc -vz 172.20.240.1 10051
zabbix-web-nginx-pgsql.zabbix-net [172.20.240.1] 10051 (zabbix-trapper) : Connection refused
root@7830d9ef2faa:/# nc -vz 172.20.240.2 10051
zabbix-server-pgsql.zabbix-net [172.20.240.2] 10051 (zabbix-trapper) open
root@7830d9ef2faa:/# nc -vz 172.20.240.3 10051
zabbix-snmptraps.zabbix-net [172.20.240.3] 10051 (zabbix-trapper) : Connection refused
root@7830d9ef2faa:/# nc -vz 172.20.240.4 10051
postgres-server.zabbix-net [172.20.240.4] 10051 (zabbix-trapper) : Connection refused
```

※前述のとおり、これらのサーバのIPアドレスはコンテナの起動順序などに左右されるため変動する可能性があることに注意する！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/fc21aafb-c62e-932c-5f5f-db0f7291c1ee.png)

Linux by Zabbix agent active という点について、パッシブかアクティブかを選べるらしい。[参考](https://www.zabbix.com/documentation/2.2/jp/manual/appendix/items/activepassive)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/3640c586-bc7b-2fac-ccf3-7f1a6b71af0e.png)

アクティブにすると、「エージェントの状態」が白抜きになっている。アクティブにしない（無印）にすると、同箇所が緑色になっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/ce6d144c-9443-decb-37b5-76f201c5f9ee.png)

## 監視状況確認

Zabbixサーバにログインして、ホストの状況を確認する
ちゃんと時系列ログに値が出ているので、なんとなく監視はできていそうですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/991feafa-2bcb-b155-e387-595f7bfd8c44.png)

## おわりに

ホストの登録まで完了したので、次回はもっと詳しくZabbixでできることを確認しようとおもいます

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

### Zabbixサーバとエージェントが通信できていない

`nc`コマンドで疎通確認


Zabbixエージェントのログを確認
下記のようなエラーログが出ていたら、エージェントのコンフィグファイルの`Server=`や`ServerActive=`で指定しているサーバのIPアドレスが違う可能性が高い（あるいはファイアウォールなどによる疎通遮断）



```
2024/09/16 20:28:02.434677 failed to accept an incoming connection: connection from "172.20.240.2" rejected, allowed hosts: "172.20.240.3"

2024/09/16 20:29:22.662566 [101] cannot connect to [172.20.240.3:10051]: dial tcp :0->172.20.240.3:10051: connect: connection refused
2024/09/16 20:29:22.662604 [101] active check configuration update from host [ubuntu-1] started to fail
```

## 参考記事

https://qiita.com/myama0827/items/31f34d2ad8c92fb818c0

https://qiita.com/atanaka7/items/53701cfad8c9307e567c

https://cloudsteady.jp/2024/03/11/77859/

https://www.server-world.info/query?os=Ubuntu_22.04&p=zabbix60&f=7