DockerでのZabbix 5.0の環境構築メモ

# 前提
- ubuntu 20.04 LTSで作業(20.04固有の作業はないはず)
- docker-ce、docker-composeはインストール済
- 公式コンテナ利用
- IPMIを使えるようにする
- 起動環境自体をプライベートリポジトリ等で管理するために、workディレクトリ下に環境を作成する。

# 目標
- zabbixをdocker-composeで起動して、自分自身の死活監視まで正常動作させる。
- ログ上の主要なエラーは潰しておく。

# 手順
## gitから環境を取得してdocker-compose.yaml等を作成する。

gitから公式リポジトリを取得する

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

workディレクトリを作成してコピーする。
今回はalpine、mysql版を使用

```
mkdir zabbix
cp -p zabbix-docker/docker-compose_v3_alpine_mysql_latest.yaml zabbix/docker-compose.yaml
cp -p zabbix-docker/.[eM]* zabbix/.
cd zabbix
```

※必要に応じて認証情報等は書き換える。

## agentの名前解決エラー対策
```text
cannot send list of active checks to "172.16.239.6": host [91f5d0ca0498] not found
```
agentの名前解決ができないのが原因らしいので下記を設定する。
- zabbix-agentのhostname指定
- zabbix起動後のserver設定でagentのホスト名を設定（こちらは後で行う）

```diff:docker-compose.yaml
 zabbix-agent:
  image: zabbix/zabbix-agent:alpine-5.0-latest
+  hostname: 'zabbix-agent'  # 追加
  ports:
   - "10050:10050"
```

## proxyの名前解決エラー対策

```text
cannot parse proxy data from active proxy at "172.16.238.6": proxy "zabbix-proxy-sqlite3" not found
cannot parse proxy data from active proxy at "172.16.238.5": proxy "zabbix-proxy-mysql" not found
```

proxyの名前解決ができないのが原因なので、下記を設定する。

- zabbix-proxy-mysqlとzabbix-proxy-sqlite3のIPアドレスを固定する（動的割当だと管理画面で設定できないので）
- 念のためhostnameも設定（たぶん不要）
- zabbix起動後のプロキシ設定で上記２つを設定（こちらは後で行う）

```diff:docker-compose.yaml
(略）

 zabbix-proxy-sqlite3:
  image: zabbix/zabbix-proxy-sqlite3:alpine-5.0-latest
+  hostname: 'zabbix-proxy-sqlite3' # 追加
  ports:
   - "10061:10051"

(略）

   zbx_net_frontend:
+    ipv4_address: 172.16.238.200 #追加

(略）

zabbix-proxy-mysql:
  image: zabbix/zabbix-proxy-mysql:alpine-5.0-latest
+  hostname: 'zabbix-proxy-mysql' # 追加
  ports:
   - "10071:10051"

(略）

   zbx_net_frontend:
+    ipv4_address: 172.16.238.201 #追加

(略）

```

zbx_net_frontendで指定されたIPアドレス範囲で、バッティングしないよう後半のアドレスを指定する。
（この例では200、201を設定している）

## IPMIの利用設定を行う
公式のzabbix-serverコンテナでは、docker_entrypoint.shでzabbix_server.confを書き換えてからzabbix_serverを起動している。
そのため、zabbix_server.confの修正は.env_srvを書き換えることで反映させるようになっている。

```diff:.env_srv
# ZBX_DBTLSCIPHER13= # Available since 5.0.0
# ZBX_DEBUGLEVEL=3
# ZBX_STARTPOLLERS=5
- # ZBX_IPMIPOLLERS=0
+ ZBX_IPMIPOLLERS=5
# ZBX_STARTPREPROCESSORS=3 # Available since 3.4.0
```
IPMI pollerの多重度はとりあえず5にしているが、いくつが適切かは今のところ理解してない…。


## 起動する
```
$ docker-compose up -d
WARNING: Some services (zabbix-agent, zabbix-java-gateway, zabbix-proxy-mysql, zabbix-proxy-sqlite3, zabbix-server, zabbix-snmptraps, zabbix-web-apache-mysql, zabbix-web-nginx-mysql) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.
WARNING: The Docker Engine you're using is running in swarm mode.

Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.

To deploy your application across the swarm, use `docker stack deploy`.

Creating network "zabbix_zbx_net_backend" with driver "bridge"
Creating network "zabbix_zbx_net_frontend" with driver "bridge"
Creating network "zabbix_default" with the default driver
Creating zabbix_mysql-server_1        ... done
Creating zabbix_zabbix-java-gateway_1 ... done
Creating zabbix_zabbix-snmptraps_1    ... done
Creating zabbix_db_data_mysql_1       ... done
Creating zabbix_zabbix-server_1       ... done
Creating zabbix_zabbix-proxy-mysql_1      ... done
Creating zabbix_zabbix-agent_1            ... done
Creating zabbix_zabbix-web-nginx-mysql_1  ... done
Creating zabbix_zabbix-proxy-sqlite3_1    ... done
Creating zabbix_zabbix-web-apache-mysql_1 ... done
```

今回は単一サーバで動けばいいのでswarm関連のWARNINGは全部無視する。
非swarm環境で運用する場合は、各コンテナにrestart: alwaysを設定する。

ブラウザでサーバにアクセスしてzabbix画面を開く

## 自身の死活監視を有効化

こちらを参考に自身の死活監視対象サーバのDNS名にzabbix-agentを設定する。
https://qiita.com/zembutsu/items/d98099bf68399c56c236#zabbix-server-%E3%81%AE-%E5%88%A9%E7%94%A8%E4%B8%8D%E5%8F%AF-%E3%82%92%E8%A7%A3%E6%B6%88%E3%81%99%E3%82%8B

## プロキシのエラー対策の続き

- 管理-> プロキシでzabbix-prosy-mysqlを追加する。
プロキシのIPアドレスはdocker-compose.yamlに記述したものを設定する。
![zabbix-proxy-mysql-proxy-setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191441/11536596-586c-418c-f562-dfe4d9fb1e75.png)

- 同様にzabbix-prosy-sqlite3を設定する。


## ipmitoolをコンテナにインストールする
問題が起きたときの切り分けにコンテナ自体にipmitoolを入れておく。

```
mkdir zabbix-server
cd zabbix-server
```

Dockerfileを作成

```Dockerfile:Dockerfile
FROM zabbix/zabbix-server-mysql:alpine-5.0-latest

USER root
RUN apk add --no-cache ipmitool openipmi openipmi-libs
USER 1997
```
ユーザーをrootにしてipmi関連パッケージを追加するだけ。

docker-compose.yamlを該当イメージを利用するように修正

```diff:docker-compose.yaml
version: '3.5'
services:
 zabbix-server:
-   image: zabbix/zabbix-server-mysql:alpine-5.0-latest
+   image: zabbix-server:latest
+   build:
+    context: zabbix-server/.
  ports:
   - "10051:10051"
```

ビルドする

```
$ docker-compose build
WARNING: Some services (zabbix-agent, zabbix-java-gateway, zabbix-proxy-mysql, zabbix-proxy-sqlite3, zabbix-server, zabbix-snmptraps, zabbix-web-apache-mysql, zabbix-web-nginx-mysql) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.
zabbix-java-gateway uses an image, skipping
zabbix-snmptraps uses an image, skipping
mysql-server uses an image, skipping
zabbix-agent uses an image, skipping
zabbix-web-nginx-mysql uses an image, skipping
zabbix-web-apache-mysql uses an image, skipping
zabbix-proxy-mysql uses an image, skipping
zabbix-proxy-sqlite3 uses an image, skipping
db_data_mysql uses an image, skipping
Building zabbix-server
Step 1/4 : FROM zabbix/zabbix-server-mysql:alpine-5.0-latest
 ---> 2cd9aff9da96
Step 2/4 : USER root
 ---> Using cache
 ---> 1dc1875d8487
Step 3/4 : RUN apk add --no-cache ipmitool openipmi openipmi-libs
 ---> Using cache
 ---> 5ca8cb96d08e
Step 4/4 : USER 1997
 ---> Using cache
 ---> 050ee613cdff

Successfully built 050ee613cdff
Successfully tagged zabbix-server:latest
```

```docker-compose up -d```でイメージの修正を反映させる。

# ipmitool実行
ipmitoolを実行するときはdocker execで行う

```
$docker exec -it zabbix_zabbix-server_1 ipmitool -H XXX.XXX.XXX.XXX -I lanplus -U YYYYYYYY -P ZZZZZZZZ lan print
Set in Progress         : Set Complete
Auth Type Support       : MD5 
Auth Type Enable        : Callback : MD5 
                        : User     : MD5 
                        : Operator : MD5 
                        : Admin    : MD5 
                        : OEM      : MD5 
（略）
```

# 参考
https://qiita.com/zembutsu/items/d98099bf68399c56c236