ホストグループが削除できない
こんにちは。
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 - 投稿数: 1341
詳細な調査&記載ありがとうございます。
バグのような気もしますが、ひとまずこちらでも再現できるかどうか試してみます。
kodai - 投稿数: 1341
Zabbix 2.0.8を新規にインストールした状態で試してみたのですが、上記の手順そのままを実行したところ、こちらの環境では問題なく削除できています。
上記の問題が出ているのは新規インストール直後でしょうか?他の設定(アクションなど)でZabbix serversホストを利用しているといったことはないでしょうか?
heya - 投稿数: 319
こんにちは。
kodai さん、テストありがとうございます。
厳密には、インストール直後ではありません。インストール後、テストのために何回か drop database zabbix; したあとで「create database 後に schema.sql、images.sql、data.sql を読ませる」をしています。その直後に上記の 1、2、3 を実行しました。実質インストール直後と同じだと思ったんですが、何か違うところがあるんですかね・・・。
他の設定は無かったはずなのですが、その後テストであれこれいじっているので、今は確認できない状態です。一回アンインストールして、 Zabbix のインストールからやり直してみようと思います。
heya - 投稿数: 319
こんにちは。
一回アンインストールしてインストールからやり直したら、削除できました。
#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
以下同じ