Zabbix 3.0をCentOS 7にインストール(PostgreSQL編)

Zabbixのインストール手順として、MySQL用の物しか見当たらないとのご意見があったので、
CentOS 7上でOS標準のPostgreSQLのパッケージを利用して構成する手順を整理して公開します。

# システム構成
1台のサーバー上に、ZabbixサーバーとZabbixエージェントをインストールして稼働させることとします。

利用する主なソフトウェアとそのバージョンは以下の通りです。

- Zabbix : Zabbix 3.0.1
- OS : CentOS 7 (バージョン7.2.1511)
- PHP : PHP 5.4 (CentOS 7標準)
- DBMS : PostgreSQL 9.2 (CentOS 7標準)


# OSのインストール
最初にCentOS 7をインストールします。

インストールするパッケージは、デフォルトの「最小限のインストール」で構いません。プロキシ経由でも構わないので、インターネットへの接続とyumコマンドが利用できるような環境を用意します。

CentOS 7をインストールし終えたら、必ずyum updateでOSを最新の状態にしてください。

```
# yum update
```

SELinuxは、enforcingのままとします。

yumで更新したパッケージやカーネルなどを反映させるためにOSを再起動しておきます。

```
# reboot
```

# セキュリティ設定
## firewalldの設定
rebootしたら、firewalldの設定を行います。
Zabbixサーバーが外部から接続を受けるのは、Zabbixエージェントからのアクセスと、Webインターフェースへのアクセスです。
SNMPトラップや他のアクセスを許可する場合は、それらも許可するようにしてください。

つまり、Zabbixサーバーには、以下のような設定を行います。

```
# firewall-cmd --add-port=10051/tcp --zone=public --permanent
# firewall-cmd --add-service=http --zone=public --permanent
# systemctl restart firewalld
```

そして、Zabbixエージェントをインストールしたサーバーがfirewalldを利用しているなら、以下のような設定を行います。

```
# firewall-cmd --add-port=10050/tcp --zone=public --permanent
# systemctl restart firewalld
```

Zabbixエージェントへのアクセスが、ローカルのループバックを利用するのであれば、10050をあける必要はありません。つまり、Zabbixエージェントが外部のIPアドレスからアクセスされる場合には、10050をあけます。
Zabbixサーバーが、各監視対象にインストールしたZabbixエージェントからのアクセスを外部から受ける時には、10051をあけます。


## SELinuxの設定
デフォルトの設定では、httpdからデータベースにアクセスできなかったり、zabbix_serverにもアクセスできなかったりするので、
最低限必要と思われる設定をonに変更しておきます。

```
# setsebool -P httpd_can_network_connect_db on
# setsebool -P httpd_can_connect_zabbix on
# setsebool -P zabbix_can_network on
```


# Zabbixのインストール
## Zabbix LLCのリポジトリ登録
Zabbix LLCが、RHEL 7用のyumのリポジトリを公開しているので、それを登録します。

```
# yum install http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
```

## Zabbixのパッケージインストール
Zabbixサーバーの本体、ZabbixサーバーのWebインターフェース、自分自身を監視するためにZabbixエージェントをインストールします。
ここでインストールするのは、PostgreSQL用です。

```
# yum install zabbix-agent zabbix-server-pgsql zabbix-web-pgsql zabbix-web-japanese
```


# PostgreSQLサーバーのインストール
PostgreSQLのサーバーをインストールします。

```
# yum install postgresql-server
```

PostgreSQLを利用し始めるためには、まずは、データベースの初期化が必要なので、初期化を行います。

```
# postgresql-setup initdb
```

PostgreSQL上のアカウントの作成とZabbix用データベース作成のため、PostgreSQLを起動します。

```
# systemctl start postgresql
# systemctl enable postgresql
```

起動できたら、初期設定ではOS上のpostgresユーザーから操作することになるので、suコマンドでpostgresユーザになって、PostgreSQL上のpostgresユーザーのパスワードを変更しておきます。

```
# su - postgres
$ psql -c "alter user postgres with password 'password'"
```

そして、postgresユーザーのまま、Zabbix用データベース接続用アカウントzabbixを作成してパスワードを設定します。

```
$ createuser zabbix -P -S -R -D
新しいロールのためのパスワード:
もう一度入力してください：
$
```

ユーザーを作成したら、そのユーザーをオーナーに指定して、データベースを作成します。

```
$ createdb -O zabbix -E UTF8 zabbix
```

rootユーザーに戻って、/var/lib/pgsql/data/pg_hba.conf内の認証設定を変更します。
変更箇所は以下の通りです。

```diff
--- pg_hba.conf.orig    2016-03-01 19:03:28.377980056 +0900
+++ pg_hba.conf 2016-03-01 19:23:50.040944482 +0900
@@ -77,11 +77,11 @@
 # TYPE  DATABASE        USER            ADDRESS                 METHOD

 # "local" is for Unix domain socket connections only
-local   all             all                                     peer
+local   all             all                                     trust
 # IPv4 local connections:
-host    all             all             127.0.0.1/32            ident
+host    all             all             127.0.0.1/32            trust
 # IPv6 local connections:
-host    all             all             ::1/128                 ident
+host    all             all             ::1/128                 trust
 # Allow replication connections from localhost, by a user with the
 # replication privilege.
 #local   replication     postgres                                peer
```

psqlコマンドを実行するときに、peerのままだとOSのアカウントが利用されるため、PostgreSQL上のアカウントを明示的に指定してデータベースを更新できないので、trustに変更しています。
また、ローカルループバックのIPv4とIPv6の両方もZabbix用アクセスアカウントでアクセス可能となるようtrustに変更しました。

ただし、今回はローカルにPostgreSQLサーバーを起動して、listen_addressesも指定していないため、ローカルからしかアクセスしないので、このtrustの設定にしました。

Zabbixサーバーを複数サーバーで構成したり、ネットワーク経由でPostgreSQLサーバーにアクセスできるような環境である場合は、その環境に適した認証方式を選択するようにしてください。

変更が終了したら、設定変更を反映するためにPostgreSQLを再起動します。

```
# systemctl restart postgresql
```

# 初期データベースの作成
MySQL用と同様にデータベース作成用のSQL文が圧縮されて用意されているので、それを利用して初期データベースを作成します。


```
# zcat /usr/share/doc/zabbix-server-pgsql-3.0.1/create.sql.gz | psql -U zabbix zabbix -W
ユーザ zabbix のパスワード:
NOTICE:  CREATE TABLE / PRIMARY KEYはテーブル"maintenances"に暗黙的なインデック ス"maintenances_pkey"を作成します
CREATE TABLE
.....
INSERT 0 1
COMMIT
#
```


# Zabbixの設定ファイルの更新
PostgreSQL用なので、最低限の設定としては、DBPasswordとDBPortを設定します。
Zabbix用データベース接続用アカウントzabbixのパスワードをDBPasswordに設定し、
DBPortにPostgreSQLサーバーのデフォルトのポート番号5432を設定します。

```
# vi /etc/zabbix/zabbix_server.conf
```

設定内容は以下の通りです。

```
DBPassword=password
DBPort=5432
```

# ZabbixのWebインターフェース用設定修正
Zabbixのパッケージのデフォルトでは、PHPのtimezoneの設定がコメントアウトされているので、設定を有効にしてタイムゾーンが日本ならば、Asia/Tokyoに設定します。

```
# vi /etc/httpd/conf.d/zabbix.conf
```

設定箇所は以下の部分です。

```
php_value date.timezone Asia/Tokyo
```

# 各種デーモン起動
以下のコマンドで、各サービスを起動して自動起動も設定します。

```
# systemctl start zabbix-server
# systemctl start zabbix-agent
# systemctl start httpd
# systemctl enable zabbix-server
# systemctl enable zabbix-agent
# systemctl enable httpd
```


# Webインターフェースにアクセス

ブラウザを利用して、
http://ZabbixサーバーのIPアドレス/zabbix/
にアクセスします。

最初のアクセス時は、Zabbix設定のウィザードが実行されるので、DBへのアクセス情報などを入力して次へ次へと進めてください。
「Configure DB connection」では、データベース作成時に指定したUserとPassword、そしてポート番号を入力してください。

![PostgreSQL-install.png](https://qiita-image-store.s3.amazonaws.com/0/101989/13e30e83-556d-a9b2-404a-9f920a97dbcb.png)


設定が終わるとログイン画面になります。アカウント「Admin」、パスワード「zabbix」でログインしてください。


# ご参考
- [PostgreSQL 9.2.4文書「19.3. 認証方式」](https://www.postgresql.jp/document/9.2/html/auth-methods.html)
- [Zabbix 3.0をCentOS 7にインストール](http://qiita.com/atanaka7/items/294a639effdb804cfdaa)(MySQL編)