【インシデント管理】ZabbixのアラートをRedmine上に自動起票する方法

Zabbixでシステム監視をする方法を前回の記事で紹介しましたが、実際のシステム運用の現場では、アラートは検知してそれで終わりというわけではありません。
検知したことをインシデントとして管理して、対応完了までの時系列などを記録しておく必要があります。

Excelなどで手作業で管理することも可能ですが、自動化できれば非常に便利です。
この記事では、チケット管理ツールとして有名なRedmineをZabbixと連携して、ZabbixのアラートをRedmineに自動登録する方法を紹介します。

目次

Redmineとは?

Redmine(れっどまいん)は、オープンソースで開発されているプロジェクト管理ツールです。
チケットによるタスク管理機能や、ガントチャート、wiki、フォーラムなど、様々な機能があります。

システム開発の現場で使われることを想定したツールですが、システム運用の現場で、インシデント管理、問い合わせ管理などの用途でも活用することができます。

日本語の情報は、非公式サイトのRedmine.JPにいろいろまとめられています。

参考サイト

この記事を書く上で、「障害発生時にも漏れなし! Zabbixの監視アラートでRedmine上にチケットを起票する仕組みをつくろう」という記事を参考にしました。

Redmineのインストール・初期設定

今回は、CentOS 7上に、最新版のRedmine 3.4をインストールしました。

インストールと初期設定の方法はRedmine.JPの解説ページに細かく書いてあります。
書いている通りにやればスムーズにできるので、本記事では割愛します。

ちなみに、dockerを使えばとても簡単に環境を作ることが可能です。
初心者のDocker入門4 – Redmine + MySQLが参考になります。

Redmineの設定

プロジェクトの作成

まずは、インシデントの管理を行うためのプロジェクトを作成します。

  1. メニューの「プロジェクト」⇒「新しいプロジェクト」をクリック。
  2. 名称と識別子を設定。
    識別子はZabbixと連携する際に必要になります。他の項目はデフォルトのままで問題なし。
    Redmineプロジェクト

トラッカーの追加

Redmineでは、チケットの分類を「トラッカー」といいます。

デフォルトでは「バグ」「機能」「サポート」があります。
これをそのまま利用してもよいのですが、今回は分類しやすいように「インシデント」を作ってみます。

  1. メニューの「管理」⇒「トラッカー」⇒「新しいトラッカー」をクリック。
    Redmineトラッカー
  2. 名称、デフォルトのステータスを設定。
    ワークフローは既存のトラッカーの設定を流用したいので「バグ」を選択。
    使用するプロジェクトにチェックを入れておきます。
    Redmineトラッカー
  3. トラッカーが作成されます。
    作ったトラッカーのリンクにカーソルを合わせると「http://RedmineのURL/trackers/数字/edit」というリンクになっていますが、この数字(tracker id)を後で使うので覚えておきます。
    Redmineトラッカー

REST APIの有効化

Redmineでは外部と連携させるために、REST APIが利用できます。

デフォルトでは無効化されているので、有効化しましょう。

  1. 管理者アカウントでログインして、メニューの「管理」⇒「設定」⇒「API」と進みます。
  2. 「RESTによるWebサービスを有効にする」にチェックを入れて、保存すれば完了です。
    Redmine REST API

APIアクセスキーの確認

REST APIを経由してRedmineにアクセスするときは、APIアクセスキーを利用します。

  1. APIアクセスキーはユーザ毎に異なる値なので、起票したいユーザでログインし直した上で、メニューの「個人設定」をクリック。
  2. 画面右側にある「APIアクセスキー」の欄で「表示」リンクをクリックすると、40桁くらいの英数字が表示されますが、これがAPIアクセスキーです。
    あとでZabbixの設定で使うので控えておきます。
    Redmine APIアクセスキー

Redmine起票用Pythonスクリプトの作成

RedmineのREST APIを使えば、チケットを起票することができます。

Zabbixでは、アラートを検知したときに指定したコマンドを実行する機能があるので、REST APIを操作するプログラムをPythonで記述して、Zabbixがインストールされているサーバに配置しておきます。

内容は参考ページ「障害発生時にも漏れなし! Zabbixの監視アラートでRedmine上にチケットを起票する仕組みをつくろう」を踏まえたものですが、エラーが出た箇所を修正した部分や、少し機能を追加した部分があります。

  1. Zabbixサーバにroot権限でログインして、epelと、Python関連のパッケージ(pip、python-redmine)をインストール。
    # yum install epel-release
    # yum install python-pip
    # pip install pip --upgrade
    # easy_install python-redmine Jinja2
  2. 下記内容のファイルを、/usr/local/bin/issue_reporter.pyに保存。
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import sys
    from redminelib import Redmine
    from optparse import OptionParser
    
    parser = OptionParser()
    parser.add_option('-u', '--url', dest='url', help='Endpoint url of a redmine')
    parser.add_option('-k', '--key', dest='key', help='API Access  Key')
    parser.add_option('-s', '--subject', dest='subject', help='Subject of a reporting issue')
    parser.add_option('-p', '--project_id', dest='project_id', help='Project ID of the issue')
    parser.add_option('-d', '--description', dest='description', help='Description of the issue')
    parser.add_option('-t', '--tracker_id', dest='tracker_id', help='Tracker ID of the issue')
    (options, args) = parser.parse_args()
    
    redmine = Redmine(options.url, key=options.key)
    issue = redmine.issue.create(project_id=options.project_id, tracker_id=options.tracker_id, 
                                 subject=options.subject)
    if options.description is None:
        issue.description = u"This ticket was created by issue_reporter.py"
    else:
        issue.description = options.description
    issue.notes = u"""
    このチケットは自動登録されました。
    確認、対応をお願いします。
    """
    
    issue.save()

Zabbixの設定

アクションの追加

次に、Zabbix側の設定をします。

アラートを検知したら起票用スクリプトを実行させるため、アクションを追加します。

  1. Zabbixの管理画面で「設定」⇒「アクション」を選択。
  2. 「アクションの作成」を選択。
    Zabbixアクション設定
  3. アクションの名前を設定。
    Zabbixアクション設定
  4. 「実行内容」タブをクリックすると、具体的な実行内容を設定できます。
    ①「実行内容」の欄で「新規」をクリック。
    ②実行内容のタイプ:「リモートコマンド」
    ③ターゲットリスト:「現在のホスト」
    ④タイプ:「カスタムスクリプト」
    ⑤次で実行:「Zabbixサーバー」
    ⑥コマンド:下記を設定。改行も下記のままで。
    RedmineのURL、APIアクセスキー、プロジェクトの識別子、トラッカーIDは適宜変更してください。
    お好みで題名や内容を編集してもかまいません。

    python /usr/local/bin/issue_reporter.py -u http://RedmineのURL/ -k APIアクセスキー -s "アラート発生の報告" -p 識別子 -t トラッカーID -d "以下のメッセージを検知しました。
    発生日時 {EVENT.DATE} {EVENT.TIME}
    ホスト: {HOST.NAME}
    検知内容: {TRIGGER.NAME}
    深刻度: {TRIGGER.SEVERITY}"
  5. 最終的に、下記スクショのような感じに設定できたら、「追加」をクリックして保存。
    Zabbixアクション設定
  6. あとは、実際に何かアラートを発生させて動作確認します。
    Redmine上にインシデントが自動登録されるはずです。

まとめ

以上で、ZabbixとRedmineを連携してインシデント管理ができるようになりました。
これで、システム運用が今まで以上に効率的に実現できるようになると思います。

コメントを残す

メールアドレスが公開されることはありません。

関連記事