障害発生時でも確実にチケットを起票できますか?
前回は、RedmineのREST APIを利用して複数のRedmineを参照して情報を集約する方法を紹介しました。
Redmineのタスク管理機能を利用すると、たとえば、障害発生時にRedmineにチケットを起票(登録)して対応を行い、完了までの記録を管理するというインシデント管理にも利用できたりします。
もちろん、そもそものインシデントの根本原因を解決することが大事ですね。
とはいえ、障害発生時には、障害そのものの対応に追われるため、チケットを起票し、詳細情報を記載することを忘れる可能性も否定できません。次に挙げる2つの要件、
- 障害の速やかな解決に注力するため、チケット起票のような事務作業的な要素を極力、排除する
- 障害アラートを見逃すようなことのないよう、確実に記録を残す
を満たすには、「ひたすら頑張る」以外に道はないのでしょうか?
そこで、本記事では、オープンソースのインシデント監視アプリケーション「Zabbix」を例に、監視時のアラートに合わせてRedmine上にチケットを起票する仕組みを紹介します。インシデントの発生頻度や、解決までの履歴を見直し、分析することもできるため、筆者らも大変重宝しています。
curlでのチケット操作
それでは、さっそくRedmineへのチケット起票をやってみましょう。起票には、前回紹介したREST APIを利用します。まずは curl
コマンドから試してみます。
なお、Redmineサーバのホスト名は前回と同じく redmine-server
とします。また、環境変数 API_KEY
にRedmine API Keyを保持しているものとします。
チケット作成のサンプル
チケットの参照には GET
メソッドを使用しました。では、チケットの作成はどうするのでしょうか?
Redmine REST APIでは、POST
メソッドを使ってチケットを作成します。チケットに起票する内容、つまりリクエストパラメータを渡すには、curl
では、コマンドラインオプションにひたすら書く、もしくは、あらかじめ用意したファイルを指定するという方法があります。
ここでは、ファイルに記載しておいたリクエストパラメータをPOST
する方法を採用します。
以下のように POST
する内容をcurl_post.jsonというファイルに保存しておきます。チケットの所属プロジェクト(project_id)は「biz」(ビジネス)とします。
{ "issue": { "project_id": "biz", "subject": "Example", "priority_id": 1 } }
登録する内容の準備ができたので、次のコマンドを実行します。--data
オプションに @
を付けたファイル名を渡しています。
$ curl -v -H "Content-Type: application/json" -X POST \ -H "X-Redmine-API-Key: $API_KEY" --data "@curl_post.json" \ http://redmine-server/issues.json
成功すれば、次のような出力が得られると思います。
* About to connect() to redmine-server port 80 (#0) * Trying redmine-server... * Adding handle: conn: 0x21b3278 * Adding handle: send: 0 * Adding handle: recv: 0 * Curl_addHandleToPipeline: length: 1 * - Conn 0 (0x21b3278) send_pipe: 1, recv_pipe: 0 * Connected to redmine-server (xxx.xxx.xxx.xxx) port 80 (#0) > POST /issues.json HTTP/1.1 > User-Agent: curl/7.30.0 > Host: redmine-server > Accept: */* > Content-Type: application/json > X-Redmine-API-Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx > Content-Length: 82 > * upload completely sent off: 82 out of 82 bytes < HTTP/1.1 201 Created < Date: Mon, 05 Jan 2015 02:11:42 GMT * Server Apache is not blacklisted < Server: Apache < X-UA-Compatible: IE=Edge,chrome=1 < Cache-Control: max-age=0, private, must-revalidate < X-Request-Id: fad9bfd65163e92d1752e59ce93b8598 < X-Runtime: 0.087294 < X-Rack-Cache: invalidate, pass < X-Powered-By: Phusion Passenger 4.0.50 < X-Frame-Options: SAMEORIGIN < Location: http://redmine-server/issues/6 < ETag: "0fe565dd60cfad07f33204593a1cc441" < Status: 201 Created < Transfer-Encoding: chunked < Content-Type: application/json; charset=utf-8 < {"issue":{"id":6,"project":{"id":1,"name":"\u30d3\u30b8\u30cd\u30b9"},"tracker":{"id":1,"name":"Bug"},"status":{"id":1,"name":"New"},"priority":{"id":1,"name":"Low"},"author":{"id":6,"name":"Takaaki NAKAJIMA"},"subject":"Example","start_date":"2015-01-05","done_ratio":0,"spent_hours":0.0,"created_on":"2015-01-05T02:11:42Z","updated_on":"2015-01-05T02:11:42Z"}} * Connection #0 to host redmine-server left intact
レスポンスのStatusが 201 Created
で返ってきており、末尾に、作成されたチケットがJSON形式で表現されています。このままだと読みにくいので、整形してみると、このチケットにはID 6番が割り当てられたことが分かります。
{ "issue": { "author": { "id": 6, "name": "Takaaki NAKAJIMA" }, "created_on": "2015-01-05T02:11:42Z", "done_ratio": 0, "id": 6, "priority": { "id": 1, "name": "Low" }, "project": { "id": 1, "name": "\u30d3\u30b8\u30cd\u30b9" }, "spent_hours": 0.0, "start_date": "2015-01-05", "status": { "id": 1, "name": "New" }, "subject": "Example", "tracker": { "id": 1, "name": "Bug" }, "updated_on": "2015-01-05T02:11:42Z" } }
POST
したのは project_id
と subject
(チケットのタイトル)、priority_id
(優先度)だけでしたが、トラッカーおよびステータスは省略したのでデフォルトとして 1
が入っています。