たろさん7890のブログ
カテゴリ未分類 5
病気のこと 28
商品レビュ 82
いろいろ 141
マラソン 62
情報処理試験 117
PC関連 58
散歩 84
健康 51
情報処理以外の試験 43
引越 9
オヤジの料理 71
ポケモンGO 365
B級グルメ 93
iPhone 3
AWS 5
Linux 7
WordPress 4
zabbix API 1
PHP 0
tabulator 1
全1件 (1件中 1-1件目)
1
zabbix APIを使ってみようと思い、curlを使って、APIをよんでみました。使い方がわからず、もろもろ、試してみて、やっとAPIのよびかたもわかり、なんとか実行して、たどり着いたのが、以下のエラーです。{"jsonrpc":"2.0","error":{"code":-32700,"message":"Parse error","data":"Invalid JSON. An error occurred on the server while parsing the JSON text."},"id":null}ここに至るまでの過程を説明します。1.やりたいこと・zabbix APIを使って、zabbixに登録されているhostなどのデータを取得したい・最終的には、仮想マシン(CentOS)からAPIを呼び出し、取得したデータをMySQLへ登録したい・zabbix は別の仮想マシンで稼働中・MySQLは、Auzure Database for MySQL(8.0)を利用2.現時点での制約・zabbixサーバと仮想マシンの間のF/Wで、http(80)が閉じている・仮想マシンとは別ネットワークにせっちしている、作業用のPCから、zabbixの管理画面には接続できる・F/Wの設定変更完了まで、時間がかかる3.現時点F/Wが開いたら、すぐに仮想マシンでのデータ取得を行いたいので、まず、現時点では、作業用PCで、準備を進めることにしました。(1)curl環境の準備作業用PC:Window10まず、APIをよぶ環境をつくるため、2つのことをしました。・curlコマンドのインストール・Postmanのインストール仮想マシンでは、データの取得処理は自動で行う予定で、また、そこでは、curlコマンドを使う想定でいます。したがって、PCで同じ環境を準備しておいて、あとで、仮想マシンに移行しようと考えました。そこで、curlがあれば、とりあえずはデータ取得できるはず、と考えて、インストールして、APIを呼んでみたわけですが、いろいろエラーがでて、よく分かりません状態に・・・・。何しろ、curlは使ったことがない、まったくの初心者です。何が悪いのか、さっぱりわからず。APIからデータを持ってくるためには、APIから認証キーを取得する必要があるわけで、つまり、APIに接続できなくてはいけない、でもその接続がうまくいかない・・・・という、ニワトリと卵、的は状況なわけで・・・。で、問題を切り分けます。・ブラウザから、zabbixの管理画面は表示できるので、作業用PCとzabbixの間の通信は大丈夫です。・APIは80番ポートでアクセスするので、ブラウザの設定はOKということになります。・curlコマンドですが、これは初心者なので、使い方を間違えている可能性があります。そこで、問題の解明のために、ブラウザから利用できるPostmanをインストールしました。APIをよぶときのパラメータ等を変更しながら、レスポンスをブラウザで確認できます。以前、Postmanを少し使ったことがあるので、これなら、問題の切り分けができるだろう、と考えたわけです。(2)PostmanからのAPI実行確認のために想定したステップは次のとおり。[ステップ1] apiinfo.version というAPIのmethodをつかって、まずは、接続確認。うまく、接続できれば、APIのバージョンを取得できるはずです[ステップ2] user.login というmethodをつかって、認証キーを取得します。[ステップ3] host.get というmethodをつかって、この取得キーを渡して、zabbixに登録されているhostデータを取得します。それぞれのステップで、APIに渡すパラメータ(JSON形式です)は、次のとおりです。[ステップ1]{ "jsonrpc": "2.0", "method": "apiinfo.version", "id": 1, "auth": null, "params": {}}[ステップ2]{ "auth": null, "method": "user.login", "id": 1, "params": { "password": "CGs8WE2loq", "user": "Admin" }, "jsonrpc": "2.0"}[ステップ3]{ "auth": null, "method": "user.login", "id": 1, "params": { "password": "パスワード", "user": "ユーザアカウント" }, "jsonrpc": "2.0"}postmanをつかって、ひとつずつ実行してみます。[ステップ1] バージョンの情報が、JSONデータとして、返ってきました![ステップ2] 認証キーが返ってきました![ステップ3] 登録されているホスト情報が、たくさん返ってきました!(3)問題の切り分けつまり、APIの呼び出しは、渡しているパラメータも含めて、すべて正常なようです。ということは、問題は、curlコマンドの使いかた、ということになります。curlコマンドで、APIを呼ぶときは、次のようにしています。(1行です)curl -X POST -H "Content-Type: application/json-rpc" -d '{"jsonrpc": "2.0","method": "apiinfo.version","id": 1,"auth": null,"params":{}}' http://xxx.xxx.xxx.xxx/zabbix/api_jsonrpc.php このコマンドを実行すると、表記のエラーとなるわけです。最初のうちは、パラメータを複数行に分けていましたが、エラー原因を切り分けるために、最終的には、この1行コマンドにしています。さて、URLが正しいことは、Postmanで実証済みです。{(中カッコ)や、’(シングルコーテーション)や”(ダブルコーテーション)の括りも問題がないことは、Postmanで実証ずみです。でも、エラーの内容はどうも、このあたりを差しています。「parsing」のエラーだと言っているので、このあたりの対応関係がおかしいはずなのです。散々、調べました。でも分からない・・・。グーグル先生に聞くと、DNS関連の問題とするのが多いですが、私はIPアドレスで指定していて、URLが正しいことも実証済み。やはり、行きつくところは、この”、’、{ の対応が、curlコマンドに、正しく解釈されていないだろう、ということです。そして、そして、散々、調べた結果、たどり着いたのは、Windowでは、’(シングルコーテーション)を文字列の括りとして、解釈してくれない、ということでした。グーグル先生は、Linux系の出身の方が多くて、Window環境でのエラーというのが、ポイントでした!自分のあたまの、Linux系なので、気づくのに時間がかかりました。おそらく、Linuxであれば、そもそもエラーなっていないはず、だったわけで。つまり・’(シングルコーテーション)は、文字列の開始ではなく、データの一部と解釈されている・JSONの”(ダブルコーテーション)が文字列として解釈されている・その結果、{パラメータ}のところのパースが失敗しているそこで、’(シングルコーテーション)を”(ダブルコーテーション)に変更して、JSONデータの”(ダブルコーテーション)をデータとして判断されるように、¥(バックスラッシュ)でエスケープさせました。(3)結果変更後のコマンドがこちら。curl -X POST -H "Content-Type: application/json-rpc" -d "{\"jsonrpc\": \"2.0\",\"method\": \"apiinfo.version\",\"id\": 1,\"auth\": null,\"params\":{}}" http://xxx.xxx.xxx.xxx/zabbix/api_jsonrpc.phpこれで、無事、APIのバージョン情報をJSONデータとして、受信することができました!!いやー、初心者はすべてが勉強なので、時間かかります(泣)
2020.06.10
コメント(0)