Amazon Linux用Zabbixパッケージの作成

# はじめに
Zabbix Advent Calendar 2015の4日目です。

早速ですが、ZabbixをAmazon Linux上でも利用されたい方も多いことでしょう。
サポート契約をすれば、公式にAmazon Linux用のパッケージが提供されるようですが、サポート契約が無い場合、利用されているAmazon Linuxのバージョンに合わせたパッケージを用意しなければなりません。

昔は、Amazon LinuxはRHEL 6をベースにしたものであったと思います。
ですので、Zabbix SIAの公式リポジトリのRHEL 6用のパッケージを利用することで対応することができました。
しかし、Amazon Linuxは頻繁に更新されていて、各種パッケージのバージョンが新しくなっているため、RHEL 6用では正常に稼働できない部分がでてきてしまうようになってきています。

具体的に問題として発生してしまう箇所として、Webサーバーのバージョンの変更にともなう設定ファイルの記述方法変更があります。

RHEL 6の標準では、httpd(Apache HTTP Server)のバージョンは、2.2系ですが、現時点のAmazon Linuxでは、2.4系が利用されているため、アクセス制限の記述方法が変更されています。そうすると、RHEL 6用のパッケージ内に含まれる設定ファイル(/etc/httpd/conf.d/zabbix.conf)内のアクセス制限に関わる部分を2.4系用に変更する必要があります。

他にも、他のプロダクトや各種ライブラリも更新されているので、安定して稼働をさせるのであれば、稼働させる環境に合わせた環境でリビルドした方が良いのではないでしょうか。

そこで、以前blogspotなどで公開していた手順を、改めてここで整理しなおして公開しようと思います。

# RHEL 6用からの変更方針
RHEL 6用から変更する方法として、Zabbix SIAが公開しているRHEL 6用のソースのパッケージ(SRPM)を元にしてパッケージを作成することとします。

パッケージを作成するためのルールは、SPECファイルと呼ばれるファイルに記載されています。この中で、利用しているOSのバージョン等を判別して、利用する設定ファイルなどを切り替えることができます。

可能であれば、Amazon Linuxの細かなバージョン(2015.09や2015.03など)での条件分岐を行いたいところなのですが、私が知っている範囲では、これらのバージョンの値を簡単に大小関係とか比較することが難しいので、Amazon Linuxならという分岐を追加するだけとします。

もしも、古いバージョンのAmazon Linuxを利用されていて、httpdのバージョンが2.2系であるならば、設定ファイルは2.2系用を利用するよう変更してください。

以下の手順は、Amazon Linux AMI 2015.09.1 (HVM), SSD Volume Type - ami-383c1956 を利用して確認しました。

# ビルド環境の整備
ビルドするユーザとしては、ec2-userを利用することとします。

ビルドするには、開発関連のツールが必要なのでツールのインストールと、RPMをビルドするためのディレクトリを作成します。

```shell-session
$ sudo yum groupinstall 'Development tools'
$ mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
```

作成したディレクトリに合わせて、ホームディレクトリに.rpmmacrosというファイルを作成($ vi ~/.rpmmacros)して以下のような内容にしておきます。

```
%_topdir /home/ec2-user/rpmbuild
```

## SPECファイルの編集
今回は、Zabbix SIAが公開してくれているZabbix 2.4.7のSRPMをベースに編集します。

まずは、元となるSRPMをダウンロードして、rpmコマンドでインストールし、先ほど作成したディレクトリ以下にソースを展開させます。

```shell-session
$ cd ~/work/
$ wget http://repo.zabbix.com/zabbix/2.4/rhel/6/SRPMS/zabbix-2.4.7-1.el6.src.rpm
$ rpm -ivh zabbix-2.4.7-1.el6.src.rpm
```

そうすると、/home/ec2-user/rpmbuild/SPECSディレクトリにzabbix.specというファイルができると思います。

このファイルに、Amazon Linux用の処理分岐を追加します。

基本的には、最初の方でAmazon Linuxであるかどうかを判別するための処理を追記します。

```
%define is_amzn1 %(grep -i "Amazon Linux" /etc/system-release > /dev/null 2>&1 && echo 1 || echo 0)
```

あとは、この処理で設定された値を利用して、RHEL 6の処理分岐と同じ箇所で、Amazon Linuxでも同様の処理となるように「|| %is_amzn1」と追記します。
例としては以下のような感じです。

```
%if 0%{?fedora} > 9 || 0%{?rhel} >= 6 || %is_amzn1
```

1箇所だけ異なるのは、httpd用の設定ファイルの部分です。
ここだけは、RHEL 7と同様の処理分岐になるようにします。

例えば、元のzabbix.specとは以下のような差分となります。

```diff:zabbix.spec.diff
--- zabbix.spec.org 2015-11-13 10:31:06.000000000 +0000
+++ zabbix.spec 2015-11-26 04:01:06.944168121 +0000
@@ -36,6 +36,8 @@
 %define _missing_doc_files_terminate_build 0
 %endif

+%define is_amzn1 %(grep -i "Amazon Linux" /etc/system-release > /dev/null 2>&1 && echo 1 || echo 0)
+
 %if %{build_server}
 BuildRequires  : mysql-devel
 BuildRequires  : postgresql-devel
@@ -247,7 +249,7 @@
 %package web
 Summary                : Zabbix Web Frontend
 Group          : Applications/Internet
-%if 0%{?fedora} > 9 || 0%{?rhel} >= 6
+%if 0%{?fedora} > 9 || 0%{?rhel} >= 6 || %is_amzn1
 BuildArch      : noarch
 %endif
 Requires       : httpd
@@ -265,7 +267,7 @@
 Requires       : php-xml
 %endif
 # DejaVu fonts doesn't exist on EL <= 5
-%if 0%{?fedora} || 0%{?rhel} >= 6
+%if 0%{?fedora} || 0%{?rhel} >= 6 || %is_amzn1
 Requires       : dejavu-sans-fonts
 %endif
 Requires       : zabbix-web-database = %{version}-%{release}
@@ -278,7 +280,7 @@
 %package web-mysql
 Summary                : Zabbix web frontend for MySQL
 Group          : Applications/Internet
-%if 0%{?fedora} > 9 || 0%{?rhel} >= 6
+%if 0%{?fedora} > 9 || 0%{?rhel} >= 6 || %is_amzn1
 BuildArch      : noarch
 %endif
 Requires       : %{name}-web = %{version}-%{release}
@@ -293,7 +295,7 @@
 %package web-pgsql
 Summary                : Zabbix web frontend for PostgreSQL
 Group          : Applications/Internet
-%if 0%{?fedora} > 9 || 0%{?rhel} >= 6
+%if 0%{?fedora} > 9 || 0%{?rhel} >= 6 || %is_amzn1
 BuildArch      : noarch
 %endif
 Requires       : %{name}-web = %{version}-%{release}
@@ -308,7 +310,7 @@
 %package web-japanese
 Summary                : Japanese font for Zabbix web frontend
 Group          : Applications/Internet
-%if 0%{?fedora} > 9 || 0%{?rhel} >= 6
+%if 0%{?fedora} > 9 || 0%{?rhel} >= 6 || %is_amzn1
 BuildArch      : noarch
 Requires       : vlgothic-p-fonts
 %else
@@ -331,7 +333,7 @@
 %endif

 # DejaVu fonts doesn't exist on EL <= 5
-%if 0%{?fedora} || 0%{?rhel} >= 6
+%if 0%{?fedora} || 0%{?rhel} >= 6 || %is_amzn1
 # remove included fonts
 rm -rf frontends/php/fonts/DejaVuSans.ttf
 %endif
@@ -452,7 +454,7 @@
 mv $RPM_BUILD_ROOT%{_datadir}/zabbix/conf/maintenance.inc.php $RPM_BUILD_ROOT%{_sysconfdir}/zabbix/web/

 # drop config files in place
-%if 0%{?rhel} >= 7
+%if 0%{?rhel} >= 7 || %is_amzn1
 install -m 0644 -p %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf.d/zabbix.conf
 %else
 install -m 0644 -p %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf.d/zabbix.conf
@@ -651,7 +653,7 @@


 %post web
-%if 0%{?fedora} || 0%{?rhel} >= 6
+%if 0%{?fedora} || 0%{?rhel} >= 6 || %is_amzn1
 /usr/sbin/update-alternatives --install %{_datadir}/zabbix/fonts/graphfont.ttf zabbix-web-font %{_datadir}/fonts/dejavu/DejaVuSans.ttf 10
 %else
 /usr/sbin/update-alternatives --install %{_datadir}/zabbix/fonts/graphfont.ttf zabbix-web-font %{_datadir}/zabbix/fonts/DejaVuSans.ttf 10
@@ -668,7 +670,7 @@
 :

 %post web-japanese
-%if 0%{?fedora} || 0%{?rhel} >= 6
+%if 0%{?fedora} || 0%{?rhel} >= 6 || %is_amzn1
   /usr/sbin/update-alternatives --install %{_datadir}/zabbix/fonts/graphfont.ttf zabbix-web-font %{_datadir}/fonts/vlgothic/VL-PGothic-Regular.ttf 20
 %else
   /usr/sbin/update-alternatives --install %{_datadir}/zabbix/fonts/graphfont.ttf zabbix-web-font %{_datadir}/fonts/ipa-pgothic/ipagp.ttf 20
@@ -763,7 +765,7 @@
 %preun web
 if [ "$1" = 0 ]
 then
-  %if 0%{?fedora} || 0%{?rhel} >= 6
+  %if 0%{?fedora} || 0%{?rhel} >= 6 || %is_amzn1
     /usr/sbin/update-alternatives --remove zabbix-web-font %{_datadir}/fonts/dejavu/DejaVuSans.ttf
   %else
     /usr/sbin/update-alternatives --remove zabbix-web-font %{_datadir}/zabbix/fonts/DejaVuSans.ttf
@@ -774,7 +776,7 @@
 %preun web-japanese
 if [ "$1" = 0 ]
 then
-  %if 0%{?fedora} || 0%{?rhel} >= 6
+  %if 0%{?fedora} || 0%{?rhel} >= 6 || %is_amzn1
     /usr/sbin/update-alternatives --remove zabbix-web-font %{_datadir}/fonts/vlgothic/VL-PGothic-Regular.ttf
   %else
     /usr/sbin/update-alternatives --remove zabbix-web-font %{_datadir}/fonts/ipa-pgothic/ipagp.ttf

```


## 関連ファイルのビルドとインストール
SPECファイルが用意できたので、続いてビルドを行うために必要となるパッケージをインストールしておきます。

```shell-session
$ sudo yum install gnutls-devel libgcrypt-devel
$ sudo yum install mysql-devel postgresql-devel net-snmp-devel openldap-devel sqlite-devel unixODBC-devel curl-devel OpenIPMI-devel libssh2-devel java-devel libxml2-devel
```

あと、OSの標準ではないfpingとiksemelもビルドしてインストールしておきましょう。

```shell-session
$ cd ~/work
$ wget http://repo.zabbix.com/non-supported/rhel/6/SRPMS/fping-2.4b2-16.el6.src.rpm
$ wget http://repo.zabbix.com/non-supported/rhel/6/SRPMS/iksemel-1.4-2.el6.src.rpm
$ rpmbuild --rebuild fping-2.4b2-16.el6.src.rpm
$ rpmbuild --rebuild iksemel-1.4-2.el6.src.rpm
$ cd ~/rpmbuild/RPMS/x86_64/
$ sudo yum install fping-2.4b2-16.amzn1.x86_64.rpm iksemel-1.4-2.amzn1.x86_64.rpm iksemel-devel-1.4-2.amzn1.x86_64.rpm
```

fpingとiksemelは、RHEL 6用のバイナリそのままでも動くかもしれませんが、より適したライブラリでのリビルドの方が望ましいと思い、ここではAmazon Linux上でリビルドしたものを利用しています。


## Zabbixのビルド実行
準備ができたので、ここでやっとZabbixのパッケージのビルドです。先ほど準備したzabbix.specファイルを利用してビルドを行います。

```shell-session
$ cd ~/rpmbuild/SPECS/
$ rpmbuild -ba zabbix.spec
```

これで、Zabbixのパッケージが、/home/ec2-user/rpmbuild/RPMS/ディレクトリ以下にビルドされます。

# インストールの試行
折角パッケージを作成したので、この場で実際にインストールして動かしてみましょう。

Zabbixサーバーを稼働させるためには、データベースサーバーが必要ですので、ここではOS標準のMySQLを利用することとします。

## MySQLサーバーのインストール

```shell-session
$ sudo yum install mysql-server
```

/etc/my.cnfにデフォルトの文字コードやテーブルでのファイル分割を最低限指定しておきます。

```
character-set-server=utf8
collation-server=utf8_bin
skip-character-set-client-handshake
innodb_file_per_table
```

Collationにutf8_binを指定すると、デフォルトとは異なり、半角英字の大文字小文字を判別するのでご注意ください。

## Zabbixサーバー関連のインストール
Zabbixサーバー自体の監視を行うために、zabbix-agentもインストールしてしまいましょう。
以下のコマンド実行例では、MySQL用のZabbixサーバーをインストールしています。

```shell-session
$ cd ~/rpmbuild/RPMS/x86_64/
$ sudo yum install zabbix-2.4.7-1.amzn1.x86_64.rpm zabbix-agent-2.4.7-1.amzn1.x86_64.rpm zabbix-server-2.4.7-1.amzn1.x86_64.rpm zabbix-server-mysql-2.4.7-1.amzn1.x86_64.rpm
```

## Zabbix Webインターフェース関連のインストール
Webインターフェースもインストールしましょう。
zabbix-web-japaneseというパッケージを一緒にインストールすると、グラフの日本語文字化けを防ぐことができます。
こちらの実行例も、MySQL用のパッケージのインストールです。

```shell-session
$ cd ~/rpmbuild/RPMS/noarch/
$ sudo yum install zabbix-web-2.4.7-1.amzn1.noarch.rpm zabbix-web-mysql-2.4.7-1.amzn1.noarch.rpm zabbix-web-japanese-2.4.7-1.amzn1.noarch.rpm
```

## 各種サービスの起動
まずは、MySQLサーバーを起動して、データベースとアクセス用アカウントの作成、そして、初期データベースの作成を行います。(本当は、MySQLのrootユーザーのパスワード設定とかセキュリティ設定をしてね。)

```shell-session
$ sudo service mysqld start
$ mysql -uroot
mysql> create database zabbix;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'password' ;
mysql> flush privileges;
mysql> exit
$ mysql -uroot zabbix < /usr/share/doc/zabbix-server-mysql-2.4.7/create/schema.sql
$ mysql -uroot zabbix < /usr/share/doc/zabbix-server-mysql-2.4.7/create/images.sql
$ mysql -uroot zabbix < /usr/share/doc/zabbix-server-mysql-2.4.7/create/data.sql
```

続いて、Zabbixサーバーの設定で、最低限、データベース接続用のパスワードを変更します。

```shell-session
$ sudo vi /etc/zabbix/zabbix_server.conf
```

変更点は以下の箇所です。

```
DBPassword=password
```

そして、Webインターフェースのため、タイムゾーンの設定を行います。

```shell-session
$ sudo vi /etc/httpd/conf.d/zabbix.conf
```

変更点は以下の箇所です。

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

あと、PHPのバージョンが5.6になると、初期設定を変更することが必要になります。
具体的には、/etc/php.ini内のalways_populate_raw_post_dataを無効(-1)に設定します。

```shell-session
$ sudo vi /etc/php.ini
```

変更点は以下の箇所です。
デフォルトでは、「;(セミコロン)」でコメントアウトされていて有効になっていないので、-1の設定が有効になるよう、頭の「;」を外します。

```
always_populate_raw_post_data = -1
```

設定が終わったら、残りのサーバープロセスを起動します。

```shell-session
$ sudo service zabbix-agent start
$ sudo service zabbix-server start
$ sudo service httpd start
```

## Zabbix Webインターフェースの初期設定ウィザードの実行
httpdが起動できたら、Webブラウザから以下のURLにアクセスします。

```
http:/ZabbixサーバーのIP/zabbix/
```

基本的には、次へ次へと画面を進め、データベースのアクセスの部分で、データベース名、データベースに接続する時のアカウントとパスワードを、環境に合わせて入力して接続テストを行ってください。

それ以外は、Nextボタンで次の画面に進めるはずです。

正常に終了したら、ログイン画面がでてくるので、ユーザ名「Admin」パスワード「zabbix」でログインしてそれ以降の操作を行ってください。

# 注意点
古いAmazon Linuxで、httpdが2.2系ならば、2.2系用の設定ファイルを使うようにしてください。

また、古いAmazon Linuxでは、Zabbixのパッケージをビルドする際、mysqlパッケージがインストールされていることが必要となる場合がありました。ビルド時のエラーメッセージを確認して、MySQLの各種ディレクトリ情報が取得できていないような場合は、mysqlパッケージをインストールしてみてください。

あと、デフォルトのAmazon Linux上に構築した場合、テンプレートのTemplate OS Linuxを紐づけると「Lack of free swap space on ホスト名」のトリガーが発生します。これは、デフォルトのAmazon Linuxがswapパーティションを持っていないため発生します。
このトリガーを無効にするか、swapパーティションを作成してマウントし対処してください。

# ご参考
[Zabbix 2.0をAmazon Linux上で動かしてみよう](http://tnk77.blogspot.jp/2012/05/zabbix-20amazon-linux.html)
[ZabbixをCentOS 7にインストール](http://tnk77.blogspot.jp/2015/03/zabbixcentos-7.html)

次は九龍さんですね。
よろしくお願いします。