Zabbix 入門　メモ (環境構築編)

# はじめに

OSSのサーバー監視ソフトウェア　Zabbixの学習をしました。
本記事では数種類の方法でZabbixの環境構築を行い、各方法の環境構築の手順、考察を書こうと思います。

## 目標や方法など
- 目標：Zabbixは3.4系をインストールして環境構築を行う
- 方法：今回は3種類の方法でで環境構築を行います
    - docker(複数コンテナを各実行させる)
    - docker-composeにて同時に実行
    - vagrant(CentOS7上で作成)上で実行

# 1. docker(複数コンテナを各実行させる)

Zabbixでは公式のdockerコンテナ(以下が公式のマニュアルになります。)があり、そちらを使用して環境構築を進めたいと思います。
https://www.zabbix.com/documentation/3.4/manual/installation/containers

## 1-1. docker で空のMySQLサーバーインスタンスを作成
```
$ docker run --name mysql-server -t \
      -e MYSQL_DATABASE = "zabbix" \
      -e MYSQL_USER = "zabbix" \
      -e MYSQL_PASSWORD = "zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD = "root_pwd" \
      -d mysql：5.7 \
      --character-set-server = utf8 --collat​​ion-server = utf8_bin
```

## 1-2. Zabbix Javaゲートウェイインスタンスを起動
```
$ docker run --name zabbix-java-gateway -t \
      -d zabbix/zabbix-java-gateway:latest
```

## 1-3. Zabbixサーバインスタンスを起動し、インスタンスを作成したMySQLサーバインスタンスにリンクさせる

```
$ docker run --name zabbix-server-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
      --link mysql-server:mysql \
      --link zabbix-java-gateway:zabbix-java-gateway \
      -p 10051:10051 \
      -d zabbix/zabbix-server-mysql:latest
```

## 1-4. Zabbixウェブインタフェースを起動し、MySQLサーバーインスタンスとZabbixサーバインスタンスをリンクさせる
```
docker run --name zabbix-web-nginx-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      --link mysql-server:mysql \
      --link zabbix-server-mysql:zabbix-server \
      -p 80:80 \
      -d zabbix/zabbix-web-nginx-mysql:latest
```

## 1-5. Zabbix起動(確認)
1-1. 〜 1-4　まで行い、コンテナが実行されていると`http://<<dockerのIPアドレス>>`にアクセスすると以下の画像のようなZabbixのログインページへ表示できると思います。
<img width="641" alt="zabbix_login-docker.png" src="https://qiita-image-store.s3.amazonaws.com/0/226348/a06af48c-d165-330e-f42a-6d7ba4bf5a74.png">

## 1-6.　環境構築の時間、考察
- 時間は1-1. 〜 1-5. の作業でおよそ10分程度でした
- 公式のコンテナ、手順を利用したことで気持ち的に安心して環境構築できました
- 複数のコンテナをそれぞれ実行しなければならないという負担がありました

#2. docker-composeにて複数のコンテナを同時実行する。
以下のリポジトリからクローンすることでcomposeを入手できるのでこちらを使用して複数コンテナを同時実行させることもできます。　
https://github.com/zabbix/zabbix-docker
しかし今回は自分でcomposeを作成して同時実行できるようにしたいと思います。

## 2-1. ファイル　作成
今回はベースOSをalpine,DBをMySQLでコンテナを作成したいと思います。

```:.env
OS=alpine
VERSION=3.4-latest
DB_NAME=zabbix
DB_USER=zabbix
DB_USER_PASSWORD=zabbix_pwd
DB_ROOT_PASSWORD=root_pwd
HTTP_PORT=80
TIME_ZONE=Asia/Tokyo


# 0 - basic information about starting and stopping of Zabbix processes;
# 1 - critical information
# 2 - error information
# 3 - warnings
# 4 - for debugging (produces lots of information)
# 5 - extended debugging (produces even more information)
LOG_LEVEL=3
```

```yml:docker-compose.yml
version: "3"
services:
  zabbix_db:
    image: mysql:5.7
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_USER_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
  zabbix_server:
    image: zabbix/zabbix-server-mysql:${OS}-${VERSION}
    environment:
      - DB_SERVER_HOST=zabbix_db
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_USER_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - ZBX_DEBUGLEVEL=${LOG_LEVEL}
    ports:
      - "10051:10051"
    links:
      - zabbix_db
  zabbix_web:
      image: zabbix/zabbix-web-apache-mysql:${OS}-${VERSION}
      environment:
        - ZBX_SERVER_HOST=zabbix_server
        - DB_SERVER_HOST=zabbix_db
        - MYSQL_DATABASE=${DB_NAME}
        - MYSQL_USER=${DB_USER}
        - MYSQL_PASSWORD=${DB_USER_PASSWORD}
        - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
        - PHP_TZ=${TIME_ZONE}
      ports:
        - ${HTTP_PORT}:80
      links:
        - zabbix_server
        - zabbix_db
  zabbix_agent:
    image: zabbix/zabbix-agent:${OS}-${VERSION}
    privileged: true
    environment:
      - ZBX_SERVER_HOST=zabbix_server
    expose:
      - "10050"
    links:
      - zabbix_server
```

※ 2つのファイルは同じディレクトリに配置してください。

## 2-2. compose実行
```
$ docker-compose up -d # オプション -d　をつけないとログが流れてしまいます。
```
実行途中でログをみたいときは以下のコマンドで見れるのでバックグランド上で実行させた方が良いと思います。

```
$ docker-compose logs -f
```

1-5.と同様の画像のような画面が表示されれば、成功です。

## 2-3. 環境構築の時間、考察
- 時間は2-1. 〜 2-2. の作業でおよそ15分程度でした(ファイルを一から作ったので、コードをコピペすれば実質5分程度で実行できると思います)
- 環境ファイルを作成したことで後々違うベースやDBに変更しやすく、利便性があると感じました
- 1.での複数のコンテナをそれぞれ実行しなければならないという負担が減り、ストレスがなくなった
(終了するときも`$ docker-compose down`のみで終了できるのですごい楽になりました)
- 実行後すぐにアクセスしてもDBへのアクセスに時間がかかる印象でした。(数秒程度ログイン画面に遷移せずDB接続していますみたいなことを言われていました。)
- ベースのOSは種類がありましたが、centOSをベースにしたところZaiibix内のUIの日本語化が行えませんでした。(CentOSのlocalがデフォルトで存在しないのが原因?)alpineでは変更できたので特にこの点については問題ではありませんでした。

# 3.vagrant(CentOS7上で作成)上で実行

以下の記事を参考にさせていただきvagrant上で環境構築をしました。(手順はそのままなので割愛させていただきます。)
https://qiita.com/akiko-pusu/items/c7a39a5319e663bc89a3

## 3-1. 環境構築の時間、考察
- 時間はおよそ30分程度(SELinuxを無効にし、ブラウザでの設定まで行った時間になります)
- 初期設定には時間がかかるが次回からは`vagrant ssh`で入れるため2回目以降は負担が少ないと感じました
- ZabbixのUIの設定で日本語化できますが、日本語のパッケージがうまく取得できず、以下のコマンドを実行(vagrantをrebootして解消)して解消しました。(dockerはそのまま日本語化できました)

```
$ sudo localedef -f UTF-8 -i ja_JP ja_JP #vagrant内
```

# 4. 3種類の方法の比較
3種類の比較を以下の表にまとめてみました。(自分の環境での結果や個人的な見解です)
1,2,3という風にランキング形式にしてあります。番号の若いものが評価が高いものになります。

||docker|docker-compose|vagrant|
|---|---|---|---|
|構築時間の短さ|1|2|3|
|構築の手軽さ|1|2|3|
|起動時の手軽さ|3|1|2|
|終了時の手軽さ|3|1|2|
|個人的なおすすめ|3|1|2|

# 5. まとめ
今回はZabbixを3種類の方法で環境構築してみました。個人的にはdocker-domposeを使用するのが気に入りました。
お使いの環境や使用用途によっては他の方法で構築するのも良いと思いました。

環境構築を行いましたので、今度は実際にZabbixをしようしたり、WebAPIについても学習したいと思います。

# 6. 参考サイト、記事
- Zabbix Documentation 3.4 (https://www.zabbix.com/documentation/3.4/manual/installation/containers)
- Zabbix 公式compose ソースコード　(https://github.com/zabbix/zabbix-docker)
- VagrantのCentOS7にZabbix3.4をインストールする（手順メモ）(https://qiita.com/akiko-pusu/items/c7a39a5319e663bc89a3)