Zabbix2.0から2.1にバージョンアップする

※この記事は2013-5-13に書いたもので情報が古いです。間違って削除したため再掲しています

 

 

  去年発表されたZabbix2.2のリリース予定はとうに過ぎているのですが、リリースされるとすぐにバージョンアップすることを求められる環境にいるため、開発版である2.1をインストールして、動作確認しようと思ったのですが、わりと悩んだので、まとめずに、だらだら書きます。

 

環境・前提

  • CentOS 6.2
  • MySQL 5.6.11 (OracleのサイトからRPMをダウンロードしたもの)
  • Zabbix 2.0.6 をyumでインストール済み
  • バージョンアップする2.1のリビジョン: 35587

手順

 ソースコードを取得します。今回はwww.zabbix.comで公開されているファイルをダウンロードして、/usr/local/src に解凍しました。

   http://www.zabbix.com/jp/developers.php

 リビジョンはあっという間に増えていきます。その都度取り直して手を加えていくのは大変な場合はリポジトリから直接取得したほうが良いでしょう。2.1.0というブランチやタグはなかったので(branches/devかな?)、トランクを取得します。リポジトリから取得した場合、configureなどがないので、bootstrap.shを実行して作成します。名前は微妙ですが、前述のものと合わせました。

   https://www.zabbix.org/wiki/Get_Zabbix

svn co svn://svn.zabbix.com/trunk /usr/local/src/zabbix-2.1.0
/usr/local/src/zabbix-2.1.0/bootstrap.sh

 

 インストール手順はマニュアルを参考にしていますが、2.0.6をyumでインストールしている環境なので、ユーザ作成などは省略します。

   https://www.zabbix.com/documentation/doku.php?id=2.2/manual/installation/install

 ビルドします。インストール先を /usr/local/zabbix21 にして、server, agent込みで、DBはmysqlにします。

cd zabbix-2.1.0
./configure --prefix=/usr/local/zabbix21 --enable-server --enable-agent --with-net-snmp --with-libcurl --with-mysql

 すると、こんなエラーが出ました。

configure: error: Not found MySQL library

 OracleRPMをダウンロードしてインストールしたので構成に差異があったのかもしれません。こんな時は mysql_config の場所を指定します。

./configure --prefix=/usr/local/zabbix21 --enable-server --enable-agent --with-net-snmp --with-libcurl --with-mysql=/usr/bin/mysql_config

 これを実行した所、おんなじようだけど、ちょっと違うエラーが出ました。

configure: error: Not found mysqlclient library

 devel も shared もインストールしてるのに・・・と思ったけど、よく見ると、インストールしているのは shared-compat でした。OracleのサイトのRPMは、shared とshared-compat の二種類があるんです。なので、shared を追加でインストールしました。今インストールしているMySQLRPMは次の通りです。

MySQL-client-5.6.11-2.el6.x86_64
MySQL-shared-5.6.11-2.el6.x86_64
MySQL-server-5.6.11-2.el6.x86_64
MySQL-shared-compat-5.6.11-2.el6.x86_64
MySQL-devel-5.6.11-2.el6.x86_64

 気を取り直して、configure を再実行したところ、またエラーが出ました。

configure: error: Invalid NET-SNMP directory - unable to find net-snmp-config

 NET-SNMPも追加したためです。これは net-snmp-devel をインストールすればいいだけです。インストールして、configureを再実行すると、正常にビルドできたので、インストールします。

make install

 ここで 2.1 用のデータベースを作っておきます。2.0 の時のデータベースをエクスポート&インポートして作ります。今回は、 zabbix21 という名前で作成しました。

 zabbixはメジャーバージョンが上がった時にデータベース構造の変更が入るので、普段ならパッチを当てるのですが、2.2からはパッチ当てが自動で行われるので、特に何かをする必要はありません。ただし、serverを起動したときに自動的に(強制的に)パッチを当てる処理が動くので、予めバックアップをとっておく必要があります。

 もしデータベースを新しく作るのであれば、/usr/local/src/zabbix-2.1.0/database/mysql/ にある schema.sql, data.sql, images.sql をインポートしてください。

 データベースを用意したら、その内容を設定ファイルに記述します。この環境だと、このフォルダにあるファイルになります。データベースに必要な最低限の項目は DBName, DBUser, DBPassword です。

   /usr/local/zabbix21/etc/zabbix_server.conf

 設定ファイルの準備が終われば、server を起動します。

/usr/local/zabbix21/sbin/zabbix_server

 残念ながら、このリビジョンでは起動に失敗します。/tmp/zabbix_server.log を見ると、次のようなエラーメッセージが表示されています。

[Z3005] query failed: [1101] BLOB/TEXT column 'variables' can't have a default value [alter table httptest change column macros variables text default '' not null]

 先ほど記述した通り、zabbix_server を起動したとき、データベースのパッチを当てているのですが、不適切なSQLを実行しようとして、SQLエラーが発生しています。実行したSQLが書かれているのでみてみると、項目名を変更しているのだけれど、text型の初期値を設定しようとしています。mysql ではこれは実行できません。null にするか、varchar型に変更剃る必要があります。

 なぜこんなSQLが実行されているかというと、定義からSQLを生成しているためです。これに該当する定義と生成部分が次の箇所です。

   /usr/local/src/zabbix-2.1.0/src/libs/zbxdbupgrade/dbupgrade.c

static int      DBpatch_02010074(void)
{
const ZBX_FIELD field = {"variables", "", NULL, NULL, 0, ZBX_TYPE_SHORTTEXT, ZBX_NOTNULL, 0};

return DBrename_field("httptest", "macros", &field);
}

static int DBpatch_02010075(void)
{
const ZBX_FIELD field = {"variables", "", NULL, NULL, 0, ZBX_TYPE_SHORTTEXT, ZBX_NOTNULL, 0};

return DBadd_field("httpstep", &field);
}

 これを書き換えるのもひとつの手なのですが、それよりも、定数を定義している箇所を修正します。このファイルの上の方に次のような記述があります。

#if defined(HAVE_IBM_DB2)
# define ZBX_TYPE_SHORTTEXT_STR "varchar(2048)"
#elif defined(HAVE_ORACLE)
# define ZBX_TYPE_SHORTTEXT_STR "nvarchar2(2048)"
#else
# define ZBX_TYPE_SHORTTEXT_STR "text"
#endif

 このコードを見ると、mysql で ZBX_TYPE_SHORTTEXT_STR は text型で生成されることがわかります。また、 別の箇所で、 ZBX_NOTNULL で初期値の指定がないので、空文字のデフォルト値を設定する記述を、生成するSQLに埋め込もうとします。そこで、text型ではなくvarchar型でSQLを作成するよう修正します。次の二行を挿入します。

#if defined(HAVE_IBM_DB2)
# define ZBX_TYPE_SHORTTEXT_STR "varchar(2048)"
#elif defined(HAVE_ORACLE)
# define ZBX_TYPE_SHORTTEXT_STR "nvarchar2(2048)"
#elif defined(HAVE_MYSQL)
# define ZBX_TYPE_SHORTTEXT_STR "varchar(2048)"
#else
# define ZBX_TYPE_SHORTTEXT_STR "text"
#endif

 ソースをいじったので、ビルドし直します。

cd /usr/local/src/zabbix-2.1.0
./configure --prefix=/usr/local/zabbix21 --enable-server --enable-agent --with-net-snmp --with-libcurl --with-mysql=/usr/bin/mysql_config
make install

 severとagentを起動します。

/usr/local/zabbix21/sbin/zabbix_server
/usr/local/zabbix21/sbin/zabbix_agentd

 

 次に画面側を作成します。インストールしたファイルをhttpdのフォルダにコピーします。

mkdir /var/www/html/zabbix21
cp -a /usr/local/src/zabbix-2.1.0/frontends/php/* /var/www/html/zabbix21/
 日本語で利用するために、次のシェルを実行してインストールします。
/var/www/html/zabbix21/locale/make_mo.sh
 そうすると、次のエラーが出ます。これが出たら、 gettext をインストールして、再実行します。
/var/www/html/zabbix21/locale/make_mo.sh: line 4: msgfmt: command not found

 次に、phpのデフォルト設定を行います。まずは作成したzabbixの画面にブラウザでアクセスしてください。

   htttp://localhost/zabbix21/

 設定画面を進めると、要件に満たないものが幾つかあります。環境によって違うとおもいますが、私は次の要件を満たしていなかったため、設定しました。

   /etc/php.ini

post_max_size = 16M
max_execution_time = 300
max_input_time = 300
date.timezone = Asia/Tokyo

 phpの設定を有効にするために httpd を再起動します。

 再起動したら、再度ブラウザでアクセスして、データベースの設定をします。もし選択できるDatabaseがnoだったり、SQLite3しかなかったりするなら、一度mysqlを再起動してみてください。設定が終われば最後の画面でsetup.phpを次のフォルダに名前を変えて保存すれば、インストール完了です。

   /var/www/html/zabbix21/conf/zabbix.conf.php