VagrantのCentOS7にZabbix3.4をインストールする（手順メモ）


今回は、表題の件についてのメモとなります。
ただし、途中ではまったりする点もあるので、どのあたりを見ればいいのかといった情報を付けておきます。

同様の作業をされていて、うまくいかなくて困っている...という方は、記事の後方の『うまく行かなかった場合』がお役に立てれば何よりです。

## Vagrantの準備

### vagrantfile

利用したVagrantfileは以下の通りです。

```
# -*- mode: ruby -*-
# vi: set ft=ruby :

#
# このファイルは Vagrantfile という名前で配置します
# そのあと、vagrant up を実行すると、初回はVMが作成され、zabbixのインストールが実施されます
#
#
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"

  # private networkなので、ホストとゲスト、ゲスト同士の通信は可能
  # ssh vagrant@192.168.33.10 で接続か、Vagrantfileのあるディレクトリ直下で vagrant sshする
  config.vm.network "private_network", ip: "192.168.33.10"

  # Vagrantの内部のネットワークではなく、ホストOSと同じネットワークに接続し
  # 同じネットワーク上の他のマシンから接続できるようにするにはブリッジ接続を
  # します。
  # ブリッジ接続で起動時に毎回インタフェースを聞かれるのを省略し、固定のIPを
  # 割り当てて起動させる場合はこちらの例のようにします
  #（DHCPでなく例として en0で192.168.2.157の割り当てを明示)
  # config.vm.network :public_network, ip: "192.168.2.157", bridge: "en0: Wi-Fi (AirPort)" # config.vm.network "public_network"

  config.vm.provider "virtualbox" do |vb|
    # vb.gui = true
    vb.memory = "2048"
  end
  # 仮想マシンを初回起動、プロビジョニングする際の処理
  # 常時で定義した$scrip の内容を実行する
  config.vm.provision "shell", inline: $script
end

#
# mariaDBとZabbixが起動されるが、SELinuxが有効なため公式CentOS7そのままだと起動に失敗する
# 追加設定が必要なので、プロビジョニングの段階ではパッケージ追加とMariaDBの起動のみ
#
$script = <<SCRIPT
sudo yum -y update
rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-1.el7.centos.noarch.rpm
sudo yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese mariadb-server zabbix-agent zabbix-get vim
sudo systemctl start mariadb
SCRIPT
```


### VMの作成

作業用のディレクトリに、Vagrantfileを配置します。
それから、vagrant up を実行します。
初回には、まずCentOSの基本のイメージがなければ、Vagrantのサイトから適切なイメージを取得します。
その上で、設定に従って仮想マシンを用意していきます。

```
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos/7'...

--- [ 中略 ] ---

==> default:   vim-filesystem.x86_64 2:7.4.160-2.el7
==> default:   vlgothic-p-fonts.noarch 0:20130607-2.el7
==> default:   zabbix-web.noarch 0:3.4.4-2.el7
==> default: Complete!

```

### sshの設定

直下にVagrantfileが配置された作業用のディレクトリでは、vagrant ssh と入力すれば作成した仮想マシンの中にsshでログインできます。
この作業用ディレクトリには、 .vagrant/ という名前のディレクトリが作成されます。

ここに、仮想マシンの情報やsshでの鍵接続用のファイルが配置されています。

```
$ tree -L 4 .vagrant/
.vagrant/
└── machines
    └── default
        └── virtualbox
            ├── action_provision
            ├── action_set_name
            ├── creator_uid
            ├── id
            ├── index_uuid
            ├── private_key
            ├── synced_folders
            └── vagrant_cwd

3 directories, 8 files
```
vagrant sshで接続でもいいのですが、いったん仮想マシンを立ち上げたら、別のディレクトリからsshすることは普通にあります。
便利に接続できるように、ssh-configを使って、仮想マシンへの接続に必要な情報を ~/.ssh/config に書き込みます。

```
# centos7 という名前で接続できるようにする
$ vagrant ssh-config --host centos7 >> ~/.ssh/config

# 設定後は、vagrant ssh でなく ssh centos7 で接続可能
$ ssh centos7
Last login: Fri Nov 10 17:06:22 2017 from 10.0.2.2

# もしくは、以下の通り。(IPはVagrantfileで割り当てたアドレス)

$ ssh vagrant@192.168.33.10

```

## 仮想マシンの中での作業

基本の仮想マシンができたら、ここから先は仮想マシンの中に入っての作業になります。

### zabbixのパッケージ追加

※ zabbixのパッケージ追加は、Vagrantfileで初回に追加しているので、省略可能。

sshでCentOS7 にログインしたら、続いてzabbixを起動する作業をします。
作業はrootではなく、vagrantユーザを想定しています。
このため、コマンドには sudo を付けています。

rootで作業する場合は、sudo は外してください（付いていても実行可能です）

インストールに関しては、公式サイトの手順を参考にします。

- Zabbix Documentation 3.4 / installation / Red Hat Enterprise Linux/CentOS
  - https://www.zabbix.com/documentation/3.4/manual/installation/install_from_packages/rhel_centos

パッケージの追加に関しては、Vagrantfileのプロビジョニング（仮想マシン初回作成）時に実施しています。
もしデフォルトのCentOS7の場合は、以下の処理をします。
(この例ではMariaDBを使います)

```
$ sudo rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
sudo yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese mariadb-server zabbix-agent zabbix-get vim
sudo systemctl start mariadb
```

### zabbix用のデータベースの作成

zabbixの稼働には、専用のデータベース（スキーマ：テーブル）が必要になります。
こちらは、MariaDBがyumでインストールされている前提で、公式サイトの手順に従って実施します。
（MySQLでも同じです）

- Zabbix Documentation 3.4 / installation / Database creation scripts
  - https://www.zabbix.com/documentation/3.4/manual/appendix/install/db_scripts

> schema.sql, images.sql and data.sql files are located in the database subdirectory of
> Zabbix sources. If Zabbix was installed from distribution packages,
> refer to the distribution documentation.
>
> DBの作成に必要な *.sqlはzabbixをソースでインストーるした場合はデータベースのサブディレクトリにあります。
> RPMのようなパッケージでインストールした場合は、ドキュメントを参照してください

と書かれてあります。
今回は、RPMでインストールしていますので、zabbixのバージョンに応じた、以下の場所にSQLがあります。

```
$ ls /usr/share/doc/zabbix-server-mysql-3.4.4/
AUTHORS  COPYING  ChangeLog  NEWS  README  create.sql.gz
```

その前に、まずはzabbixというMariaDB (MySQL)接続専用のユーザと、専用のデータベースを作成します。

```
$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
create database zabbix character set utf8 collate utf8_bin;
grant all privileges on zabbix.* to zabbix@localhost identified by '<接続専用のパスワード>';

# 一度データベースから接続を切り、zabbixuserでログインして確認。

$ mysql -u zabbix -h 127.0.0.1 -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 12
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
| zabbix             |
+--------------------+
3 rows in set (0.00 sec)
```

※ユーザ作成の際のパスワードは、/etc/zabbix/zabbix_server.conf に指定したものが必要です。
(初期値は zabbix です...)
このあとに、専用のSQLを流し込みます。

```
$ cd /usr/share/doc/zabbix-server-mysql-3.4.4/
$ zcat create.sql.gz | mysql -u zabbix -p zabbix
Enter password:

... 処理が続きます ...

# 処理がおわったら、DBに接続してみます

$ mysql -u zabbix -h 127.0.0.1 -p zabbix

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [zabbix]> show tables;
+----------------------------+
| Tables_in_zabbix           |
+----------------------------+
| acknowledges               |
| actions                    |
| alerts                     |

```

出来ていましたので、これで準備OKです。

### Aapcheのインストール

初回のプロビジョニングの際に、zabbix-web-mysql zabbix-web-japanese のパッケージを追加しているので、apache (httpd) も一緒に入ります。


```
$ sudo systemctl start httpd
```

### SELinuxの変更

SELinuxが有効になっていると、うまくzabbixが起動してくれません。

#### ひとまずSELinuxを無効にして先に進む場合

SELinuxの設定は再起動しても有効になるように、設定ファイルを修正します。
エディタで /etc/selinux/config を開き、 SELINUX=disabled に変更します。

```
$ sudo vi /etc/selinux/config

# 以下を変更して保存
SELINUX=enforcing

# 一旦再起動
$ sudo reboot

# 再起動後に再び ssh ログインしてSELinuxの状態を確認

$ getenforce
Disabled
```

あとは、zabbixのサービスを起動します。

まず、サービスの有効化をします。

```
$ sudo systemctl enable zabbix-server
Created symlink from /etc/systemd/system/multi-user.target.wants/zabbix-server.service to /usr/lib/systemd/system/zabbix-server.service.

$ sudo systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

$ sudo systemctl enable zabbix-agent
Created symlink from /etc/systemd/system/multi-user.target.wants/zabbix-agent.service to /usr/lib/systemd/system/zabbix-agent.service.
```

つぎに起動します。

```
$ sudo systemctl start httpd
$ sudo systemctl start zabbix-server
$ sudo systemctl start zabbix-agent
```
エラーが無ければ、systemctl status zabbix-server の結果 "Active: active (running)" と表示されます。

#### ZabbixのWebの管理画面の確認

まずはvagarntの仮想マシンの中から。以下でレスポンスが200で返ればOKです。

```
$ curl -L localhost/zabbix
```

つぎに、ホストOS側のブラウザから確認します。
http://192.168.33.10/zabbix/ で画面が表示されればOKです。

![zabbix-start.png](https://qiita-image-store.s3.amazonaws.com/0/27976/6758da6d-9295-7d41-3df8-b7d699e8eba4.png "zabbix-start.png")



うまく行かなかった場合は、Firewalldやiptablesを確認すること。


#### SELinuxを有効のままポリシーを調整して動かす場合

SELinuxを有効にしたままでzabbixを起動する場合は、一度に設定はできないので、順を追っての作業になります。
まずは公式ドキュメントに従って調整します。

- Zabbix Documentation 3.4 / installation / Red Hat Enterprise Linux/CentOS (SELinux)
 - https://www.zabbix.com/documentation/3.4/manual/installation/install_from_packages/rhel_centos#selinux_configuration


```
# SELinuxの確認
$ getenforce
Enforcing

# 該当の部分を調整 / ただしこれだけでは足りません...
$ sudo setsebool -P httpd_can_network_connect=1
$ sudo setsebool -P httpd_can_connect_zabbix=1
$ sudo setsebool -P zabbix_can_network=1
```

上記の3つの設定のあとに、 **一度zabbixのサービスを起動** します。
systemctl start zabbix-server を実行すると、以下のようにエラーになります。
/var/log/zabbix/zabbix_server.log や /var/log/audit/audit.log にもzabbixについてのメッセージがでています。

```
$ sudo systemctl start httpd
$ sudo systemctl start zabbix-server
Job for zabbix-server.service failed because a configured resource limit was exceeded. See "systemctl status zabbix-server.service" and "journalctl -xe" for details.

$ tail /var/log/zabbix/zabbix_server.log

 .... [ 省略 ] .....

  4187:20171111:133158.662 using configuration file: /etc/zabbix/zabbix_server.conf
  4187:20171111:133158.662 cannot set resource limit: [13] Permission denied
```

audit.log には "type=AVC msg=audit(1510407210.908:1617): avc:  denied  { setrlimit } for  pid=4227 " といったメッセージが出ているかと思います。
これはリソースの利用制限に引っかかってしまっているので、この調整が必要です。

zabbixの起動前に設定ではなく、いったん起動してどんな制約にひかっかっているかを拾って、それに合わせてポリシーを調整します。このあたりの設定を行い安くするために、まずはpolicycoreutilsというツールを追加します。

```
$ sudo yum install policycoreutils-python -y
```

上記を追加したら、audit2allow というコマンドが使えるようになります。
zabbix-server, zabbix-agentを起動したまま（実際は失敗していますが）、以下を実行します。

```
# zabbix-server用
$ sudo cat /var/log/audit/audit.log | grep zabbix_server | grep denied | audit2allow -M zabbix_server_setrlimit

$ sudo semodule -i zabbix_server_setrlimit.pp
```

ここまで実施すると、zabbix-serverをrestartしたら、ステータスがactiveになります。
これでOKです。

```
$ sudo systemctl restart zabbix-server
$ sudo systemctl status zabbix-server
● zabbix-server.service - Zabbix Server
   Loaded: loaded (/usr/lib/systemd/system/zabbix-server.service; disabled; vendor preset: disabled)
   Active: active (running) since 土 2017-11-11 13:47:51 UTC; 2s ago

 .... [中略] ....

11月 11 13:47:51 localhost.localdomain systemd[1]: Started Zabbix Server.
```


**参考：**

 - http://yallalabs.com/linux/how-to-install-zabbix-3-4-server-on-centos-7-rhel-7/
 - https://qiita.com/atanaka7/items/389f796b221cc0609379#selinuxの設定

### ブラウザでの設定

SELinux有効 / 無効の場合どちらでも、うまくいくとブラウザからzabbix用の画面が表示できます。
指示に従って進むと、途中タイムゾーン設定でエラーが出ることがあります。


![timezone-setting.png](https://qiita-image-store.s3.amazonaws.com/0/27976/eab635c2-4e46-01a4-5eda-50177c793ce4.png "timezone-setting.png")

こちらは、/etc/httpd/conf.d/zabbix.confを調整し、httpdを再起動してください。

```
$ sudo vi /etc/httpd/conf.d/zabbix.conf

php_value date.timezone Asia/Tokyo に変更。

$ sudo systemctl restart httpd

```


## うまく行かなかった場合

とにかくログを見てみましょう。
それから、いくつかチェック用のコマンドも叩いてみましょう。

**サービスが起動できていないとき**

- /var/log/audit/audit.log を見る
- /var/log/zabbix/zabbix_server.log を見る
- /etc/zabbix/zabbix_server.conf の設定を確認する
- MySQL (MariaDB) が起動しているかチェックする
- /var/log/mariadb/mariadb.log を見る
- /var/log/messages を見る

**Webの管理画面が表示されないとき**

- curl -L localhost/zabbix を叩いてみる（レスポンスはどう？）
- /var/log/httpd/error_log を見る
- get enforce (SELinuxの状態）をチェック
- ディスク容量のチェック（溢れていない？）
- systemctl status firewalld.service で仮想マシン側のfirewalld チェック
- そもそもMacやホストOS側から仮想マシン側の通信が許可されているかチェック

MacやホストOS側からブラウザ経由でZabbixの管理画面にアクセスできない時は、疎通がきちんと取れるかも確認してみてください。
ブラウザのみだと、proxyが悪さをしている場合もあるので、可能ならコマンドラインから、telnet, curl, wget でチェックしてみましょう。

netcat (nc) コマンドを使って、仮想マシンのport: 80に接続できるかチェックする例は、以下の通りです。

```
$ nc -vz 192.168.33.10 80
found 0 associations
found 1 connections:
     1:	flags=82<CONNECTED,PREFERRED>
	outif vboxnet1
	src 192.168.33.1 port 53610
	dst 192.168.33.10 port 80
	rank info not available
	TCP aux info available

Connection to 192.168.33.10 port 80 [tcp/http] succeeded!
```

上記の結果 Connection Refused になっていたら、仮想マシン側への通信が届いているけれど仮想マシン側で何らかの形でブロックをしている状態です。

Operation timed out の場合は、MacやホストOSからの通信が仮想マシンに届く前にブロックされている可能性があります。この場合は、ウィルスソフトやパーソナルファイアウォールを確認してみてください。

通信が届いているかどうかは、tcpdumpでも確認できます。
仮想マシンの中に入って、port: 80のリクエストが流れているかをチェックします。
インタフェースは、ip showで表示され、ブラウザで利用したいIPを使います・

```
$ tcpdump -l -i eth1 -A -n -s 0 dst port 80
```

この状態で、ブラウザからURLを叩きます。
通信がとどいていたら、すぐにこんな通信が流れます。

```
22:06:34.807312 IP 192.168.33.1.54806 > 192.168.33.10.http: Flags [.], ack 943, win 4096, options [nop,nop,TS val 814261799 ecr 6041370], length 0
E..4..@.@.wh..!...!
...P.xeVX&.f.....y.....
```

なにも流れなければ、そもそもMacからの通信がゲストOSに届いてないということになります。もし何か流れたら、今度は Apacheのログを確認します。


### zabbix_server.logの確認

どうやらzabbixそのもののプロセスが起動していないと思われる場合は、SELinuxの設定の有無も踏まえて、まずはzabbixの起動のログを見ます。

```
$ tail -f /var/log/zabbix/zabbix_server.log
```

うまく起動していない場合、"failed" といったメッセージが出るのでチェックします。
以下の場合は、zabbix用のデータベースに接続できないといったメッセージです。

```
 3938:20171110:043853.038 using configuration file: /etc/zabbix/zabbix_server.conf
  3938:20171110:043853.043 [Z3001] connection to database 'zabbix' failed: [1044] Access denied for user ''@'localhost' to database 'zabbix'
  3938:20171110:043853.043 Cannot connect to the database. Exiting...
  3947:20171110:043903.277 Starting Zabbix Server. Zabbix 3.4.4 (revision 74338).

```

基本的な手順では同じホストにMySQLやMariaDBのサービスが同居しているので、以下を確認します。

- DBにzabbix用のアカウントが作られているか
- zabbix用のDBが作られているか
- zabbix用のDBにアクセス制限 (grant) が正しく設定されているか

zabbixのDBの接続情報や利用するアカウントは、  /etc/zabbix/zabbix_server.conf に設定されているので、こちらも確認します。
こんな感じになります。

```
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=xxxxxxx
```

DBとの接続が怪しい場合は、 mysql -u zabbix -p zabbix でDBに接続してみます。
また、接続できていても、/var/log/zabbix/zabbix_server.log に以下のようなメッセージが出ていたら、必要なテーブルが作成されていない状態です。

```
  4203:20171110:044542.028 ******************************
  4203:20171110:044542.028 using configuration file: /etc/zabbix/zabbix_server.conf
  4203:20171110:044542.033 [Z3005] query failed: [1146] Table 'zabbix.users' doesn't exist [select userid from users limit 1]
  4203:20171110:044542.033 cannot use database "zabbix": database is not a Zabbix database
```

この場合は、zabbix用のテーブルその他作成用のSQLを流し込みます。

```
$ cd /usr/share/doc/zabbix-server-mysql-3.4.4/
$ zcat create.sql.gz | mysql -u -p zabbix

# mariadbに接続、確認

$ mysql -u root

MariaDB [zabbix]> show tables;
+----------------------------+
| Tables_in_zabbix           |
+----------------------------+
| acknowledges               |
| actions                    |
| alerts                     |
| application_discovery      |

--- [ 中略 ] ---

| widget                     |
| widget_field               |
+----------------------------+
140 rows in set (0.00 sec)

```

これで、うまく起動したら、サービスのstatusはこのようになります。

```
$ systemctl status zabbix-server
● zabbix-server.service - Zabbix Server
   Loaded: loaded (/usr/lib/systemd/system/zabbix-server.service; disabled; vendor preset: disabled)
   Active: active (running) since 金 2017-11-10 05:02:24 UTC; 1h 34min ago
  Process: 5000 ExecStart=/usr/sbin/zabbix_server -c $CONFFILE (code=exited, status=0/SUCCESS)
 Main PID: 5002 (zabbix_server)
   CGroup: /system.slice/zabbix-server.service
           ├─5002 /usr/sbin/zabbix_server -c /etc/zabbix/zabbix_server.conf
           ├─5007 /usr/sbin/zabbix_server: configuration syncer [synced configuration in 0.009876 sec, idle 60 sec]
           ├─5008 /usr/sbin/zabbix_server: alerter #1 started

--- [ 中略 ] ---

           ├─5037 /usr/sbin/zabbix_server: preprocessing worker #1 started
           ├─5038 /usr/sbin/zabbix_server: preprocessing worker #2 started
           └─5039 /usr/sbin/zabbix_server: preprocessing worker #3 started
```

### どうしてもうまくいかない時

#### Vagrantfileを変更した場合

Vagrantfileのネットワークの設定を変更した場合は、変更を反映させるために一度再読み込みさせます。vagrant reload で変更を適用させます。

単純に halt & up では変更が反映されない可能性もあるので、必ず起動後にIPやネットワークインタフェース関連の情報が変わっているか、ゲストOSの中に入ってチェックしたり、GUIの設定画面（VirtualBoxなど）で確認してみてください。

```
$ vagrant reload
```

#### vmの再作成

いろいろ試してしまって綺麗な状態でなくなってしまい、とにかく再作成したいような場合は、以下の通りになります。
以下のようにvm停止、削除、.vagrantfile/ も削除します。

```
$ vagrant halt
==> default: Unmounting NFS shared folders from guest...
==> default: Forcing shutdown of VM...
==> default: [vagrant-hostsupdater] Removing hosts

$ vagrant destroy
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Destroying VM and associated drives...
==> default: [vagrant-hostsupdater] Removing hosts

$ rm -fr .vagrant

# 削除したら再作成

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos/7'...

--- [ 中略 ] ---

==> default:   vim-filesystem.x86_64 2:7.4.160-2.el7
==> default:   vlgothic-p-fonts.noarch 0:20130607-2.el7
==> default:   zabbix-web.noarch 0:3.4.4-2.el7
==> default: Complete!


```

これで作成した仮想マシンが消去されます。

心配な場合は、Vagrantの前提になっている仮想化ソフト（VirtualBoxやParallels) のコンソールも見てみましょう。
もちろん、GUIのコンソール側から消しても良いと思います。


## まとめ

今回は駆け足で、もくもくと作業内容を書きました。
特に困るのはエラーが出てしまったときなので、なるべくどこを見たら良いかを備忘録として添えてみました。