Zabbix Server を docker-compose で起動し、他ホストからの情報を取得するまで

## 背景

デザイナーという立場上、業務ではあまり本番ネットワーク環境を構築する事はなく、あくまでアイディアを確認するためのデモ環境を作ることが多かったので、今まであまりサーバーの監視という事をしてきませんでした。

ただ、`k8s` や `GitLab CE` を使うようになって、サーバーの構成が複雑になってきたり、不具合が起こった時にサーバーが重くなりすぎて、そもそもssh等でサーバーにログインできなくなる…という問題が発生してきたので、監視ツールを導入する事にしました。

### Zabbix + docker-compose

上記のような背景からあまり監視ツールには詳しくなかったのですが、会社の先輩から `Zabbix` と `MUNIN` というツールを教えてもらいました。`MUNIN` の方が簡単そうではあったのですが、`k8s` のクラスタも監視するとなると `Zabbix` の方が良さそうに思ったので、今回は `Zabbix` を採用する事にします。

幸いにして `docker-compose` の構成が公式でアップされていたので、それをベースに構築したのですが、とても簡単に構築できました。これも先人達の知恵のおかげですね！

### 環境

基本的にサーバーは全て `ubuntu 20.04` で構成しています。監視対象のクライアントは任意の数で問題ありません。

- Zabbix サーバー x 1
- 監視対象クライアント x n

## Docker と docker-compose のインストール

基本的には、公式サイトの通りに進めていきます。

### Docker

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

```bash
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
```

### docker-compose

https://docs.docker.com/compose/install/

```bash
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```

### 実行権限を与える

そのままだと実行にroot権限が必要なので、現在のユーザーでも実行できるようにしておきます。

```bash
sudo groupadd docker
sudo usermod -aG docker $(id -u -n)
```

この後、 **設定を有効にするために再度ログインします。**


## Zabbix Server

まずはサーバーを立ち上げます。`docker-compose` を使用したら簡単に起動できました。

### clone

公式の `docker-compose` 一式を `clone` してきます。

```bash
git clone https://github.com/zabbix/zabbix-docker.git
cd zabbix-docker
```

### 構成選択

任意の構成ファイルを `docker-compose.yaml` としてコピーします。ここでは、 `docker-compose_v3_alpine_pgsql_latest.yaml` を使用しました。

```bash
cp docker-compose_v3_alpine_pgsql_latest.yaml docker-compose.yaml
```

### タイムゾーン

デフォルトではタイムゾーンが日本ではないので、変更します。

```bash
nano .env_web
```

```
…
PHP_TZ=Asia/Tokyo
…
```

### iptables

通信に必要なポートを開放します。

```
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 10051 -j ACCEPT
```

### 起動

以上で設定が完了したので、起動します。

```
docker-compose up -d
```

### 初期設定

ログインします。デフォルトのままなら、ユーザー名は `Admin` (A大文字)、パスワードは `zabbix` です。

<img width="400px" alt="login" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321330/1efee84f-3ebb-1891-f9be-03dd90d0413a.png">

`設定 > ホスト > Zabbix server` と進みます。
デフォルトでは、インターフェイスの部分に `127.0.0.1` が入っていますが、それを削除し、代わりに DNS名のところに `zabbix-agent` を入力します。また、接続方法も `DNS` にします。

<img width="800px" alt="ホスト設定" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321330/252bdecc-609a-8379-195e-657cb953f67a.png">

キャプチャを撮り忘れて後から撮ったので、既にホスト数が2になってしまっていますが、これでサーバーの基本設定は完了です！

<img width="800px" alt="設定後" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321330/d09bbfbd-044a-070f-6cf8-bf8afaee6a3d.png">


## Zabbix Agent

次に監視対象のクライアントの設定をして、サーバーに表示させます。

### エージェントインストール

`apt` で提供されているので、素直にインストールします。

```bash
sudo apt-get install zabbix-agent
```

### エージェント設定

エージェントの設定を行います。

```bash
sudo nano /etc/zabbix/zabbix_agentd.conf
```

色々と設定項目がありますが、必須なのは

```
Server=<Zabbix ServerのIPアドレス>
ServerActive=<Zabbix ServerのIPアドレス>
Hostname=<任意のホスト名>
```

でした。
**ここで設定するホスト名は任意ですが、後でサーバー側で設定する際に必要になります。**

### サービス再起動

設定を反映するために再起動します。

```bash
sudo service zabbix-agent restart
```

### iptables

こちらも、通信用のポートを開けておきます。

```bash
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 10050 -j ACCEPT
```

### おまけ: Zabbix agent 設定をスクリプトで済ます

複数端末で手動設定するのは骨が折れるので、僕は以下のコマンドで実行しました。

```bash
SERVER_IP=<サーバーのIP>
HOSTNAME=<ホスト名>

sudo sed -i -e "s@127.0.0.1@$SERVER_IP@g" -e "s@Hostname=Zabbix server@Hostname=$HOSTNAME@g" -e "s@# Hostname=@Hostname=$HOSTNAME@g" /etc/zabbix/zabbix_agentd.conf

sudo service zabbix-agent restart
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 10050 -j ACCEPT
```


### Zabbix Server に登録

サーバーにログインして、`設定 > ホスト > ホストの作成` と進みます。

- ホスト名
- グループ
- インターフェース

が必須の項目になります。ホスト名は先程設定したものを使用します。

<img width="800px" alt="ホスト作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321330/e85d6b65-ae85-150d-d7d0-fd5af2a71b5a.png">

テンプレートタブに移動して、任意のものを選択します。今回は `Template OS Linux by Zabbix agent` を使用します。

<img width="600px" alt="テンプレート" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321330/9c26739f-afa2-5269-b274-768971a59d42.png">

ここまで設定したら、「追加」を押して設定完了です！


## 最後に

難しそうに感じていた監視ツールの導入ですが、意外な程すんなりと導入できました。`Zabbix Server` を `docker-compose` で起動できたのが大きいですね。
今回は導入しただけで細かい使い方は追えていませんが、人気も高く紹介記事数も多いツールとの事ですので、これから勉強していこうと思います。


## 参考

本記事は以下の記事を全面的に参考にして作成しました。

[Zabbix 5.0 を Docker Compose で起動する手順](https://qiita.com/zembutsu/items/d98099bf68399c56c236#docker-%E3%81%A8-docker-compose-%E3%82%92%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)
[普段使いのUbuntuにZabbix-agentをインストールして監視する](https://chee-s.net/%E6%99%AE%E6%AE%B5%E4%BD%BF%E3%81%84%E3%81%AEubuntu%E3%81%ABzabbix-agent%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E7%9B%A3%E8%A6%96%E3%81%99%E3%82%8B)