クラウドソリューション事業部の倉岡です。
毎朝仕事のルーティンでzabbixの障害情報の一覧を取得してbacklogに記載するという業務があるのですが、毎日コピペをするのが面倒になっていました。
これを自動化できないかと思い今回shellスクリプトとpythonを使用して、日々のコピペから解放される自動化スクリプトを作成したので記事にしたいと思います。
目次
1.準備する環境
・linuxサーバー
・python(ver 2.7以降)
・backlog api
準備backlogに投稿するためのAPIの取得を行いましょう。
以下の記事を参考にAPIキーの取得を行ってください。
2.zabbixから障害情報のみを取得する
zabbixもapiを叩くことによって障害情報の取得はできますが、通知を無効化している障害内容や非表示にしているものまで取得するなど煩雑な部分が多いです。
そのため今回はcurlでログインを行って、障害情報の一覧をcsvファイルで取得する形にしました。以下がスクリプトの内容です。
GeneralPurposeRoutine.sh
1#!/bin/bash
2CookieLog=cookie.log
3#ログイン情報
4zabbixuser=user
5zabbixpass=pass
6
7#ログイン
8builtin echo "--data \"name=${zabbixuser}&password=${zabbixpass}&autologin=1&enter=Sign+in\"" | curl -isS -c $CookieLog -b $CookieLog -X POST -K- "https://zabbix*********/index.php"
9#障害情報をcsvで取得と不要な部分の整形
10#URLが長いのは、zabbixの検索窓に前調べたホスト情報などが残っていた際フィルターがかかった状態のcsvファイルが取得されるから
11curl -isS -c $CookieLog -b $CookieLog "http://zabbix*********/zabbix.php?action=problem.view.csv&filter_show=3&filter_application=&filter_name=&filter_inventory%5B0%5D%5Bfield%5D=type&filter_inventory%5B0%5D%5Bvalue%5D=&filter_evaltype=0&filter_tags%5B0%5D%5Btag%5D=&filter_tags%5B0%5D%5Boperator%5D=0&filter_tags%5B0%5D%5Bvalue%5D=&filter_show_tags=0&filter_show_opdata=0&filter_set=1" | tr -d \" | sed '1,14d' > zabbix.csv
12#一度テキストに書き込みと不要な部分の削除整形
13cut -d , -f -6 zabbix.csv > zabbix.txt
14#今日起きた新しい障害の一覧
15diff -u zabbix.txt zabbixyesterday.txt | grep ^+ | grep -v ^+++ | sed s/^+// > newResolutionzabbix.txt
16#解決済みの障害の一覧
17diff -u zabbix.txt zabbixyesterday.txt | grep ^- | grep -v ^--- | sed s/^-// > newProblemzabbix.txt
18cat zabbix.txt > zabbixyesterday.txt
19#バックログに投稿するためのpythonファイル実行
20python backlog.py
※注意点
URLが長いのは、zabbixの検索窓に前調べたホスト情報などが残っていた際フィルターがかかった状態のcsvファイルが取得されます。
コメント部分に記載した内容をもう少し詳しく説明すると、zabbixは「監視データ」項目の「障害」ページでホストなど検索しフィルターをかけたまま他のページに遷移すると、再度「監視データ」項目の「障害」ページに遷移した際同じURLページなのにフィルターをかけた状態の障害検索結果が出ることになります。
なので、対処法として「監視データ」項目の「障害」ページにアクセス後、全て空の状態で適応ボタンを押して出てきた右上のCSVボタンのURLを記載することをお勧めします。
3.backlogに投稿するpythonファイルの作成
続いてzabbixから取得した障害内容をバックログに投稿するpythonファイルです。
先ほど準備で取得したapiキーをurlの変数に書き込むことで投稿できます。投稿内容は適宜変えていただければと思います。
backlog.py
1# coding: UTF-8
2import requests
3import datetime
4dt_now = datetime.datetime.now()
5#backlogapiキーURL
6url = 'https://seeds-std.backlog.jp/api/v2/issues?apiKey=********************************'
7
8#ZABBIX読み取り
9f = open('zabbix.txt') # f = open('test.txt', 'rt'):
10zabbix = f.read() # ファイルの全内容が1つの文字列として返される
11#print(s)
12f.close()
13#新たな障害
14f = open('newProblemzabbix.txt') # f = open('test.txt', 'rt'):
15zabbixPro = f.read() # ファイルの全内容が1つの文字列として返される
16#print(s)
17f.close()
18#解決済みの障害
19f = open('newResolutionzabbix.txt') # f = open('test.txt', 'rt'):
20zabbixRes = f.read() # ファイルの全内容が1つの文字列として返される
21#print(s)
22f.close()
23
24#ファイルが空文字の時は「なしの記載」
25if zabbix =="":
26 zabbix="なし"
27if zabbixPro =="":
28 zabbixPro="なし"
29if zabbixRes =="":
30 zabbixRes="なし"
31
32#投稿内容
33description = """
34Backlog APIを利用してPythonから課題を投稿しています。
35
36## zabbixトップ(ダッシュボード)の確認
37
38現在の障害内容
39
40```
41"""+zabbix+"""
42```
43
44解決済みの障害
45
46```
47"""+zabbixRes+"""
48```
49
50新たな障害
51
52```
53"""+zabbixPro+"""
54```
55
56"""
57
58#projectid 投稿したいプロジェクトのID
59#summary 題名
60#issueTypeId 課題のテンプレート種類
61#priorityId 優先度
62#assigneeId 担当者
63#categoryId[] カテゴリ
64
65data = {
66 'projectId': *******,
67 'summary': '汎用ルーチンワーク'+dt_now.strftime('%Y%m%d'),
68 'issueTypeId': ******,
69 'priorityId': *,
70 'description': description,
71 'assigneeId': ******,
72 'categoryId[]': ******,
73 }
74headers = {
75 'Content-Type': 'application/x-www-form-urlencoded'
76}
77r = requests.post(url, data = data, headers = headers)
78print(r.status_code)
79print(r.json())
4.最後にcronの設定
vi /etc/crontabにて、月から金(平日)のみ毎朝10時に投稿するように設定します。
100 10 * * 1-5 root sh /home/hoge/GeneralPurposeRoutine.sh
5.完成
いい感じに障害情報の一覧が自動で投稿されました。
これで毎朝10時に投稿されてコピペの単純作業からおさらばです。
※注意点
cronで設定してスクリプトを起動するとディレクトリの位置関係でファイル取得ができなくなり正常動作しないので
1zabbix.csv → /home/hoge/zabbix.csv
のフルパスに変更するとうまく動作します。