Zabbix 4.2の最新版を日々ビルドして確認する方法

ZabbixのAdvent Calendarの3日目です。

Zabbix 4.0が正式にリリースされましたが、もうすでに次のバージョンの開発が進められています。
先日のZabbix Conference Japan 2018でもアレクセイさんから説明があったと思いますが、次のバージョンのロードマップが公開されています。

**Zabbix Roadmap** [https://www.zabbix.com/roadmap](https://www.zabbix.com/roadmap)

具体的な開発方針が決まりつつあるものは、Zabbixのチケットシステムでの管理番号も合わせて公開されているので、どのような実装になりそうかもある程度確認することができます。
例えば、以下のような新機能が予定されているようです。


- Gitへの移行
- 開発を進める際にコミュニティやパートナーからのレビューを受け付け
- 公式なパッケージの対応プラットフォームを拡張
- 保存前処理を拡張してバリデーションや不要データの破棄を可能に
- LLD機能の柔軟性向上
- Prometheus exporterへの対応
- トリガーの条件式に柔軟性を持たせる
- タグの保守をホストやテンプレート単位でまとめて行えるように
- ダッシュボードで独自のウィジェットを利用できるようプラグイン化
- アクションやメディア、保存前処理のテスト機能
- 計算アイテムとアグリゲートアイテムの統合
- アクション実行時にWebhook呼び出し
- Webhookで障害発生イベントを生成
- ディスカバリ時に名前解決をしてホスト名でのホスト登録
- ネットワークトポロジや物理的なデバイスを意識した依存関係の設定
- API呼び出しを含むすべての操作の記録(Audit)
- スケーラビリティ、リダンダンシー、分散監視の機能拡張
- テンプレートのバージョニング(バージョンを指定して元にも戻せる)
- テンプレートの作成ガイドラインドキュメントの作成


もしも、実装される予定の機能に意見があるのであれば、チケットシステムにユーザー登録して意見をぶつけてみても良いかもしれません。(ただし、英語で。)

次のリリースのバージョンは、スタンダードリリースとかポイントリリースと呼ばれるサポート期間の短いバージョンですが、リリースタイミングはスケジュールを優先してリリースするということでしたので、上記の機能のすべては盛り込まれないかもしれません。


アルファバージョンの段階からある程度のスパンでパッケージも公開されそうです。
ちなみに、公式リポジトリの4.1というディレクトリで4.2のアルファ版(alpha1)が公開されていたりします。

**Zabbix Official Repository** [http://repo.zabbix.com/zabbix/4.1/](http://repo.zabbix.com/zabbix/4.1/)

いつ公開されるかわからないものを待つよりも、色々な新機能が実装されているバージョンの実装状況を日々試してみたいと思いませんか？

そんな方の為にパッケージのビルド方法をご紹介します。

環境は、CentOS 7とさせていただきます。


# ビルド環境の構築

ビルドに必要となる各種パッケージをインストールします。
iksemelなども必要となるので、Zabbix Official Repositoryを登録しておきます。
「#」で始まるコマンドラインは、rootユーザーで実行するものです。

```sh
# yum groupinstall 'Development tools'
# yum install http://repo.zabbix.com/zabbix/4.1/rhel/7/x86_64/zabbix-release-4.1-1.el7.noarch.rpm
# yum install mysql-devel postgresql-devel net-snmp-devel openldap-devel gnutls-devel sqlite-devel unixODBC-devel curl-devel OpenIPMI-devel libssh2-devel java-devel libxml2-devel openssl-devel iksemel-devel libevent-devel
```

次に、ビルド用のユーザーを作成します。
ユーザー名は、「builduser」としておきます。

```sh
# useradd builduser
# passwd builduser
```

ユーザーを作成したら、その作成したユーザーでログインします。
ログインしたら、ビルド用のディレクトリを作成します。
「$」で始まるコマンドラインは、そのビルド用ユーザーで実行するものです。

```sh
$ mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
```

ディレクトリを作成したら、そのディレクトリを使用するよう設定ファイルも作成しておきます。

```sh
$ vi ~/.rpmmacros
```

ファイルの内容は、以下の1行だけでOKです。

```
%_topdir /home/builduser/rpmbuild
```


1からビルド用のパッケージを作成するのは面倒なので、alpha1のソースパッケージを利用します。

```sh
$ wget http://repo.zabbix.com/zabbix/4.1/rhel/7/SRPMS/zabbix-4.2.0-0.1alpha1.el7.src.rpm
$ rpm -ivh zabbix-4.2.0-0.1alpha1.el7.src.rpm
```

日々更新されたソースをtar.gzにまとめたファイルは、以下のURLからダウンロードできます。


**Nightly Builds** [https://www.zabbix.com/developers](https://www.zabbix.com/developers)


今回は、4.2の最新版を試したいので、Pre-4.2.0xxxxというようなバージョンのDownloadボタンをクリックしてダウンロードします。
この記事を書いた2018/12/03の時点では、pre-zabbix-4.2.0alpha2-87484.tar.gzというファイルになりますが、リリースのタイミングによってバージョンやリビジョンが変わってくるので注意して読み替えてください。

取得したファイルをビルド環境のSOURCEディレクトリにコピーします。
今回のtar.gzファイルは、Zabbix 4.2.0のalpha2というバージョンでリビジョンが87484というファイルなので、Zabbix 4.2.0のalpha2というバージョンのtar.gzファイルとしてSOURCEディレクトリに配置します。

```sh
$ cp -p pre-zabbix-4.2.0alpha2-87484.tar.gz ~/rpmbuild/SOURCES/zabbix-4.2.0alpha2.tar.gz
```

これでビルドの環境を準備することができました。


# ビルドの実施

では、ビルドを開始してみましょう。

ビルドにはrpmbuildコマンドを使用するのですが、アルファ版などの正式版ではないバージョンをビルドする時には、明示的に引数で指定する必要があります。
また、zabbix-4.2.0-0.1alpha1.el7.src.rpm内のビルドの手順が記載されたzabbix.specファイルでは、バージョン番号も明示的に指定する必要があるので、以下のように実行します。

```sh
$ cd ~/rpmbuild/SPECS/
$ rpmbuild --define 'zabbixversion 4.2.0' --define 'alphatag alpha2' -ba zabbix.spec
```

で、ここで問題が。
pre-zabbix-4.2.0alpha2-87484.tar.gzの内容では、automakeというツールが1.14でなければビルドできないようになっていて、CentOS 7の標準の環境では、以下のようなエラーとなってしまうはずです。

```
+ make
CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/sh /home/builduser/rpmbuild/BUILD/zabbix-4.2.0alpha2/missing aclocal-1.14 -I m4
/home/builduser/rpmbuild/BUILD/zabbix-4.2.0alpha2/missing: line 81: aclocal-1.14: command not found
WARNING: 'aclocal-1.14' is missing on your system.
         You should only need it if you modified 'acinclude.m4' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'aclocal' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>
make: *** [aclocal.m4] Error 127
エラー: /var/tmp/rpm-tmp.2bcEX2 の不正な終了ステータス (%build)


RPM ビルドのエラー:
    /var/tmp/rpm-tmp.2bcEX2 の不正な終了ステータス (%build)
```


そこで、CentOS 7標準のautomake 1.13の環境でもビルドできるようちょっと書き換えます。
作業用にbuilduserのホームディレクトリにworkというディレクトリを作成して作業します。

```sh
$ cd ~
$ mkdir work
$ cd work
$ cp ~/pre-zabbix-4.2.0alpha2-87484.tar.gz ~/work/
$ tar zxvf pre-zabbix-4.2.0alpha2-87484.tar.gz
$ cp -pr zabbix-4.2.0alpha2 zabbix-4.2.0alpha2.orig
```

zabbix-4.2.0alpha2/configureファイル内のam__api_versionを1.13に書き換えます。

```sh
$ vi zabbix-4.2.0alpha2/configure
```

書き換え終わったら、差分を取得してautomake.patchというファイルに保存してSOURCEディレクトリにもコピーしておきます。

```sh
$ diff -Nru zabbix-4.2.0alpha2.orig zabbix-4.2.0alpha2 > automake.patch
$ cp automake.patch ~/rpmbuild/SOURCES/
```

作成したpatchファイルをビルド時に読み込むようzabbix.specファイルに追記します。

```sh
$ cd ~/rpmbuild/SPECS/
$ vi zabbix.spec
```

変更する差分は以下の通りです。

```diff
--- zabbix.spec-org     2018-11-28 03:46:15.000000000 +0900
+++ zabbix.spec 2018-12-03 18:50:14.865373616 +0900
@@ -22,6 +22,7 @@
 Patch0:                config.patch
 Patch1:                fonts-config.patch
 Patch2:                fping3-sourceip-option.patch
+Patch3:                automake.patch

 Buildroot:     %{_tmppath}/zabbix-%{version}-%{release}-root-%(%{__id_u} -n)

@@ -292,6 +293,7 @@
 %if 0%{?rhel} >= 7
 %patch2 -p1
 %endif
+%patch3 -p1

 ## remove font file
 rm -f frontends/php/fonts/DejaVuSans.ttf
```

ここまで準備できれば、再度ビルドにチャレンジしてみましょう。

```sh
$ cd ~/rpmbuild/SPECS/
$ rpmbuild --define 'zabbixversion 4.2.0' --define 'alphatag alpha2' -ba zabbix.spec
```

ビルドが終了すれば、ビルド環境のRPMディレクトリにパッケージが生成されているはずです。
「~builduser/rpmbuild/RPMS/x86_64/」「~builduser/rpmbuild/RPMS/noarch/」の2つのディレクトリの内容を確認してみてください。


# パッケージのインストール

パッケージがビルド出来たら、あとはインストールして動かしてみることができます。
ビルドしたサーバー上で動かしてみるのであれば、rootで以下のように実行してパッケージをインストールします。

```sh
# cd ~builduser/rpmbuild/RPMS/x86_64/
# yum install zabbix-agent-4.2.0-0.1alpha2.el7.x86_64.rpm zabbix-server-mysql-4.2.0-0.1alpha2.el7.x86_64.rpm ../noarch/zabbix-web-4.2.0-0.1alpha2.el7.noarch.rpm ../noarch/zabbix-web-mysql-4.2.0-0.1alpha2.el7.noarch.rpm ../noarch/zabbix-web-japanese-4.2.0-0.1alpha2.el7.noarch.rpm
```

データベースの準備やFirewallの設定は、通常のZabbix 4.0と同じ手順となります。

作成したデータベースへの接続情報を/etc/zabbix/zabbix_server.confに設定し、/etc/httpd/conf.d/zabbix.conf内のtimezoneの設定を行った後で、zabbix-agent、zabbix-server、httpdを起動すると最新版のZabbixを利用開始することができます。


# 最後に

今回ご紹介したのは、あくまでも検証用に最新版をビルドして使用する方法です。
本番環境では使用しないでください。

また、まれに正常に機能しない時があります。
そんな時は、以前稼働できていたパッケージに戻しておいて、正常に稼働できるソースが公開されるまで待ちましょう。