ホストグループが削除できない

こんにちは。

Zabbix 2.0.8 ですが、最初から存在するホストグループが削除できません。どうにかうまい方法はないものでしょうか?

■やったこと
インストール後、データベースの初期化(create database 後に schema.sql、images.sql、data.sql を読ませる)をした直後に
1. admin でログインし、日本語表示にする
2. ホスト Zabbix server を削除(ホストの設定画面で削除ボタン※)
3. Templates 内にある全てのテンプレートを削除(テンプレート一覧の画面で全てにチェックを入れて「選択を削除」※)
※どちらの削除方法でもおそらく同じだとは思いますが・・・。

ここでホストグループ一覧の画面を見ると、全てのホストグループでテンプレートもホストも (0) となっており、メンバーがいないことが確認できます。

しかし、なぜかこの状態で、ホストグループ Templates と Zabbix servers が削除できないのです。
ホストグループの設定画面に飛ぶと、削除ボタンが無効になっています。
ホストグループ一覧の画面でチェックボックスにチェックを入れ「選択を削除」とすると、
  エラー:グループを削除できません
  ホストが所属しているためグループ"Templates"を削除できません
のようなメッセージが表示されます。 Zabbix servers も同様です。
最初からメンバーがいなかった Linux servers は普通に削除できます。

■ソースから読んだ内容
ホストグループの削除ボタンは、 include/views/configuration.hostgroups.edit.php で $data['deletableHostGroups'] が空っぽのときに disabled となるようです。この変数には、 getDeletableHostGroups() の結果が入るようです。

getDeletableHostGroups() は include/hosts.inc.php 内にあり、以下のSQL文で取得できたもの(削除できるグループIDのリスト)を返すようです。
  SELECT DISTINCT g.groupid FROM groups g
   WHERE g.internal=0
    AND g.groupid=グループID
    AND NOT EXISTS (SELECT NULL FROM hosts_groups hg
             WHERE g.groupid=hg.groupid
              AND hg.hostid=xxxxx)
一番最後の AND hg.hostid=xxxxx の部分は、 getUnlinkableHosts() が何か返せばそれを xxxxx の部分に入れて、返さなければ AND 自体が無くなるようです。返ってきた値が複数あればそれだけ AND が続きそうな気がしますが、そこまでは確認していません。

getUnlinkableHosts() も同じ include/hosts.inc.php 内にあり、以下のSQL文で取得できたもの(削除できないホストIDのリスト)を返すようです。
  SELECT hg.hostid,COUNT(hg.groupid) AS grp_count FROM hosts_groups hg
   WHERE hg.groupid=グループID
   GROUP BY hg.hostid HAVING COUNT(hg.groupid)>0

getUnlinkableHosts() は対象のホストグループに属するホストが存在しているかどうかを hosts_groups テーブルで調べ、存在すればそれを返す。 getDeletableHostGroups() は、指定したホストグループ(のリスト)を調べ、「オートディスカバリではなく、 getUnlinkableHosts() で返ってきたホストを一つも含んでいない」ホストグループを返す。

・・・といった挙動だと思います。

■データベースの状態
インストール直後の状態で Zabbix servers に唯一存在しているホスト Zabbix server の hostid は 10084 のようです。
mysql> select hostid,host from hosts where hostid=10084;
+--------+---------------+
| hostid | host |
+--------+---------------+
| 10084 | Zabbix server |
+--------+---------------+
1 row in set (0.00 sec)

ついでに、ホストグループはこんな感じ。 Zabbix servers の groupid は 4 です。
mysql> select * from groups;
+---------+------------------+----------+
| groupid | name | internal |
+---------+------------------+----------+
| 1 | Templates | 0 |
| 2 | Linux servers | 0 |
| 4 | Zabbix servers | 0 |
| 5 | Discovered hosts | 1 |
+---------+------------------+----------+
4 rows in set (0.00 sec)

ホスト(Zabbix server)削除後、確かに無くなっています。
mysql> select hostid,host from hosts where hostid=10084;
Empty set (0.00 sec)

しかし、 hosts_groups テーブルには残っているようなのです。★
mysql> select * from hosts_groups where hostid=10084;
+-------------+--------+---------+
| hostgroupid | hostid | groupid |
+-------------+--------+---------+
| 92 | 10084 | 4 |
+-------------+--------+---------+
1 row in set (0.00 sec)

このため、 getUnlinkableHosts() のSQL文が、値を返してしまいます。
mysql> SELECT hg.hostid,COUNT(hg.groupid) AS grp_count FROM hosts_groups hg WHERE hg.groupid=4 GROUP BY hg.hostid HAVING COUNT(hg.groupid)>0;
+--------+-----------+
| hostid | grp_count |
+--------+-----------+
| 10084 | 1 |
+--------+-----------+
1 row in set (0.00 sec)

その結果 getDeletableHostGroups() では削除可能なホストグループが空っぽになってしまい、削除できないと判断されてしまいます。
mysql> SELECT DISTINCT g.groupid FROM groups g WHERE g.internal=0 AND g.groupid=4 AND NOT EXISTS (SELECT NULL FROM hosts_groups hg WHERE g.groupid=hg.groupid AND hg.hostid=10084);
Empty set (0.00 sec)

結局問題なのは★の部分のような気がするのですが、これはバグなんでしょうか?
そして、どうにか回避する方法ありますか?
#前は普通に削除できていたはずなんですけどね・・・。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー kodai の写真

詳細な調査&記載ありがとうございます。

バグのような気もしますが、ひとまずこちらでも再現できるかどうか試してみます。

ユーザー kodai の写真

Zabbix 2.0.8を新規にインストールした状態で試してみたのですが、上記の手順そのままを実行したところ、こちらの環境では問題なく削除できています。

上記の問題が出ているのは新規インストール直後でしょうか?他の設定(アクションなど)でZabbix serversホストを利用しているといったことはないでしょうか?

ユーザー heya の写真

こんにちは。

kodai さん、テストありがとうございます。
厳密には、インストール直後ではありません。インストール後、テストのために何回か drop database zabbix; したあとで「create database 後に schema.sql、images.sql、data.sql を読ませる」をしています。その直後に上記の 1、2、3 を実行しました。実質インストール直後と同じだと思ったんですが、何か違うところがあるんですかね・・・。

他の設定は無かったはずなのですが、その後テストであれこれいじっているので、今は確認できない状態です。一回アンインストールして、 Zabbix のインストールからやり直してみようと思います。

ユーザー heya の写真

こんにちは。

一回アンインストールしてインストールからやり直したら、削除できました。
#drop database zabbix と何が違うんだろう・・・?

結局(アンインストール前に)削除できなかった原因は不明のままですが、とにかく削除できた&再現方法が分からない、というわけで、これでクローズとしたいと思います。

参考までに、やったこと。
root# /etc/init.d/zabbix-server stop
root# /etc/init.d/mysqld stop

root# yum remove zabbix zabbix-web mysql
→ 依存関係で mysql, zabbix, zabbix-web, mysql-server, zabbix-agent, zabbix-server, zabbix-server-mysql, zabbix-web-japanese, zabbix-web-mysql がアンインストールされる

root# mv /var/lib/mysql/ /var/lib/mysql.old

root# yum install mysql zabbix zabbix-web mysql-server zabbix-agent zabbix-server zabbix-server-mysql zabbix-web-japanese zabbix-web-mysql
※ /etc/my.cnf と /etc/zabbix/web/zabbix.conf.php はアンインストール前のがそのまま残っているため、これらのファイルについては何もしない。

root# /etc/init.d/mysqld start
→ /var/lib/mysql/ が作成される

root# mysqladmin -u root password パスワード1
root# mysql -u root -p
mysql> CREATE DATABASE zabbix CHARACTER SET utf8;
mysql> GRANT ALL PRIVILEGES ON zabbix.* TO zabbix@localhost IDENTIFIED BY 'パスワード2';
mysql> exit

root# mysql -u root -p zabbix < /usr/share/doc/zabbix-server-mysql-2.0.8/create/schema.sql
root# mysql -u root -p zabbix < /usr/share/doc/zabbix-server-mysql-2.0.8/create/images.sql
root# mysql -u root -p zabbix < /usr/share/doc/zabbix-server-mysql-2.0.8/create/data.sql

root# mv /etc/zabbix/zabbix_server.conf.rpmsave /etc/zabbix/zabbix_server.conf
root# /etc/init.d/zabbix-server start
以下同じ