ノード構成時にZabbixAPIのhost.createメソッドでエラー発生

お世話になります。

ZABBIX-JP(バージョン1.8.9-1)を使用し、
ノード構成の分散監視を行っています。

子ノードにて、Zabbix APIの実行を行いましたが、
host.createメソッド実行時に以下のようなエラーが返ってきて
ホストの追加ができませんでした。
{"jsonrpc":"2.0","error":{"code":-32500,"message":"Application error.","data":"[ CHost::create ] No permissions !"},"id":1}

・host.get
・host.update
・host.delete
メソッドは正常に実行できますが、host.createだけが実行できません。
APIはAPI専用のユーザを作成し、APIアクセスは有効で、ユーザの種類も「Zabbix特権管理者」になっていますので
APIを実行するユーザの設定自体に問題はないと思われます。
念のため、adminユーザでAPIアクセスを有効にしてAPIを実行してみましたが、adminユーザでも
host.createメソッド実行時に同じエラーが発生しました。

なお、ZABBIX-JP(バージョン1.8.9-1)をノード構成にする前まではhost.createメソッドも正常に実行できました。
ノード構成にするとhost.createは実行できなくなるのでしょうか?
また、回避策等をご存知でしたらご教授いただけないでしょうか?

ノード構成ではないようですが、本家のフォーラムで
バージョン1.9.8でhost.createメソッド実行時に同様のエラーが出ているようです。
http://www.zabbix.com/forum/showthread.php?t=24633

よろしくお願い致します。

コメント表示オプション

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

お世話になります。

その後調査を継続しております。

?エラーの再現方法
Zabbixをインストール後に、以下手順でノードIDを設定する。
・/etc/zabbix/zabbix_server.confにNodeID=1を設定。
・Zabbixサーバ停止後に、以下コマンドで、データベースのデータをノード構成用に変換する。
/usr/sbin/zabbix_server_mysql -c /etc/zabbix/zabbix_server.conf -n 1
・Webインターフェースでローカルノードの設定を行う。

例えば、
Zabbixを稼動させているサーバのIPアドレス:172.16.1.10で、
IPアドレス:172.16.1.20であるtest01という名前のホストを、
グループID:100100000000006のグループにに所属させ、
テンプレートid:100100000010047の監視テンプレートをリンクさせてホストの追加をする場合
(グループID:100100000000006のグループとテンプレートid:100100000010047の監視テンプレートは
作成済みとします)

ZabbixをインストールしているLinuxサーバにて、
以下のようにcurlコマンドでJSON-RPC形式でデータをPOSTします。
# curl -d '{"jsonrpc":"2.0","method":"host.create","params":{"host":"test01","ip":"172.16.1.20","port":10050,"useip":1,"groups":[{"groupid":100100000000006}],"templates":[{"templateid":100100000010047}]},"auth":"0aba21679b09e4347601fa237a56e7c0","id":1}' \
-H "Content-Type: application/json-rpc" http://172.16.1.10/zabbix/api_jsonrpc.php

以下結果が返ってきます。
{"jsonrpc":"2.0","error":{"code":-32500,"message":"Application error.","data":"[ CHost::create ] No permissions !"},"id":1}

エラーは親ノードと子ノードの親子構成にしない状態(データベースをノード構成用に変換した状態)だけでも発生しました。
また、Zabbixのバージョン1.8.8、1.8.9、1.8.10で検証しましたが、どのバージョンでも同様のエラーが発生しました。

上記のエラーメッセージから、
/usr/share/zabbix/api/classes/class.chost.phpの1090行目〜1094行目の部分
====================================
foreach($groupids as $gnum => $groupid){
if(!isset($upd_groups[$groupid])){
self::exception(ZBX_API_ERROR_PERMISSIONS, S_NO_PERMISSIONS);
}
}
====================================
で$upd_groups[$groupid]に値がセットされていないため、
self::exception(ZBX_API_ERROR_PERMISSIONS, S_NO_PERMISSIONS);
の処理が発生し、"data":"[ CHost::create ] No permissions !"のエラーが表示されたと思われます。

?template.createでも同様のエラーが発生
host.createと同様に、template.createでも似たようなエラーが発生しました。

例:tmplinuxという名前のテンプレートを作成する場合
# curl -d '{"auth":"0aba21679b09e4347601fa237a56e7c0","id":1,"method":"template.create","params":{"host":"tmplinux","groups":[{"groupid":100100000000001}]},"jsonrpc":"2.0"}' \
-H "Content-Type: application/json-rpc" http://172.16.1.10/zabbix/api_jsonrpc.php
以下結果が返ってきました。
{"jsonrpc":"2.0","error":{"code":-32500,"message":"Application error.","data":"[ CTemplate::create ] You do not have permission to perform this operation"},"id":1}

上記のエラーメッセージから
/usr/share/zabbix/api/classes/class.ctemplate.phpの966行目〜970行目の部分
====================================
foreach($groupids as $gnum => $groupid){
if(!isset($upd_groups[$groupid])){
self::exception(ZBX_API_ERROR_PERMISSIONS, S_NO_PERMISSION);
}
}
====================================
で$upd_groups[$groupid]に値がセットされていないため、
self::exception(ZBX_API_ERROR_PERMISSIONS, S_NO_PERMISSIONS);
の処理が発生し、[ CTemplate::create ] You do not have permission to perform this operation"の
エラーが表示されたと思われます。

?hostgroup.createはエラーなし
hostgroup.createでも同様のエラーが発生するかと思われましたが、こちらはエラーは発生しませんでした。

例:Test Groupという名前のホストグループを作成する場合
# curl -d '{"auth":"0aba21679b09e4347601fa237a56e7c0","id":1,"method":"hostgroup.create","params":[{"name":"Test Group"}],"jsonrpc":"2.0"}' \
-H "Content-Type: application/json-rpc" http://172.16.1.10/zabbix/api_jsonrpc.php
以下結果が返ってきました。
{"jsonrpc":"2.0","result":{"groupids":["100100000000007"]},"id":1}

現在までの調査結果を整理すると
・ノード構成用にデータベースを変換している場合にのみ、host.createとtemplate.createメソッドでエラーが発生する。
・host.get、host.update、host.deleteではエラーは発生しない。
・hostgroup.createではエラーは発生しない。

バグのようにも思われるのですが、回避策はございますでしょうか?

ユーザー kodai の写真

実際には試せていないのですが、もし上記のエラーが出るようでしたらバグかもしれません。

本家BTSにも似たような問題が報告されていますが、いずれも解決済みになっています。

https://support.zabbix.com/browse/ZBX-1852
https://support.zabbix.com/browse/ZBX-1955
https://support.zabbix.com/browse/ZBX-3320

上記修正時にノード構成の考慮が漏れていたのかもしれません。

可能であれば、本家BTSに新規バグとして登録していただけると助かります。

ユーザー tysw の写真

kodaiさん

返信ありがとうございます!
つたない英語ではありますが、
本家BTSに新規バグとして登録をしました。
https://support.zabbix.com/browse/ZBX-4566
(はじめて本家に登録したので、どうなるものやら・・・)

ユーザー kodai の写真

ありがとうございます!私もwatchしておきました。

ユーザー tysw の写真

kodaiさん

調査を継続したところ、問題が解決いたしましたのでご報告致します。

JSON-RPCの中で
host.createでは
":[{"groupid":100100000000006}],"templates":[{"templateid":100100000010047}]},"
の記述部分を
":[{"groupid":"100100000000006"}],"templates":[{"templateid":"100100000010047"}]},"
に変更

template.createでは
":[{"groupid":100100000000001}]},"

":[{"groupid":"100100000000001"}]},"
に変更することで問題が解決できました。

■原因
APIのソースのエラー発生箇所で使用されていた配列の値を
デバッグして調べたところ、
groupidの値が
1.001E+14
となっていました。このため、エラーが発生していました。
ノード構成にしたことにより、groupidやtemplateidの桁数が多くなり、
PHP内でfloatと解釈されたため、上記のような値として取り込まれてしまったようです。
なので、JSON-RPC内のgroupidとtemplateidの値を「""」で囲んでgroupidとtemplateidを明示的に
stringとして扱うようにしたところ、正常に実行することができました。
(ノード構成ではない場合は、groupidやtemplateidは5桁でしたので、
上記の影響はなかったため、「""」で囲まなくても正常に実行できていた。)

本家BTSのほうもcloseにしました。
https://support.zabbix.com/browse/ZBX-4566

ユーザー kodai の写真

情報どうもありがとうございました。

groupidの値が
1.001E+14
となっていました。このため、エラーが発生していました。
ノード構成にしたことにより、groupidやtemplateidの桁数が多くなり、
PHP内でfloatと解釈されたため、上記のような値として取り込まれてしまったようです。

もし分かれば教えて欲しいのですが、1.001E+14と解釈してしまったのはどのポイントなのでしょう?(Zabbix API側?それともJSONを作成したクライアント側?)

ユーザー tysw の写真

kodaiさん

お世話になります。

Zabbix APIにて1.001E+14と解釈したと判断しています。

Zabbix APIはPHPで書かれていますが、
API内では変数の型を宣言していないため、PHPにて値を変数に渡すときに
14桁以上のものを自動的にfloatとして解釈するようで
1.001E+EとZabbix APIにて解釈したと思います。

ユーザー kodai の写真

ありがとうございます。

となると、ノード構成では必ず桁数が多くなるわけですし、API側も修正の余地がありそうですね。

私の方でも確認してみます。