こんにちは、SCSK株式会社の小寺崇仁です。
今回はZabbixにて検知したSNMPTrapをChatGPTに連携して、対処方法を教えてもらいたいと思います。
機能概要としては、以下となります。
1.CahtGPT用のメディアタイプ(javascript)を作成
2.トリガーアクションでメディアタイプが実行されるように設定
3.障害を検知すると、アクション(メディアタイプ)が実行され、イベントにコメントを付けます。
コメントの内容はChatGPTが考えた対処方法になります。
忙しい方はこちらからメディアタイプがダウンロード可能です。
※拡張子をyamlにして、インポートしてご利用ください。
事前準備
| Zabbix | 6.x | 6系以上のZabbixが必要です。 |
| GhatGPTのAPIキー | xxxxxxx | ChatGPTの実行アカウントでの発行が必要です。 |
| ZabbixのAPIトークン | zzzzzzzz | Zabbixの「管理->一般設定->APIトークン」から発行できます。 |
メディアタイプの作成
メディアタイプのタブ
| 項目 | 値 | 補足 |
|---|---|---|
| 名前 | 任意 | |
| タイプ | webhook | |
| ↓パラメータ↓ | ||
| AI_API_KEY | xxxxxxx | ChatGPTのAPIキーを指定 |
| AI_MODEL | gpt-3.5-turbo | |
| AI_TEXT | {ALERT.MESSAGE} | ChatGPTへの問い合わせ文字列 メッセージテンプレートを参照するマクロを指定 |
| AI_URL | https://api.openai.com/v1/chat/completions | ChatGPTのURLを指定 |
| ZB_API_KEY | zzzzzzzz | ZabbixのAPIトークンを指定 |
| ZB_EVENT_ID | {EVENT.ID} | コメントをつけるイベントのIDを指定 イベントIDを参照するマクロを指定 |
| ZB_URL | https://127.0.0.1/zabbix/api_jsonrpc.php | ZabbixのURLを指定 |
| スクリプト | 次に記載 | |
| タイムアウト | 60s | ChatGPTの実行に時間がかかるので最大値を指定 |
スクリプト
//////////////////////////////////////////
//初期化処理
//////////////////////////////////////////
params = JSON.parse(value);
const AI_URL = params.AI_URL;
const AI_API_KEY = params.AI_API_KEY;
const AI_MODEL = params.AI_MODEL;
const AI_TEXT = params.AI_TEXT;
const ZB_EVENT_ID = params.ZB_EVENT_ID;
const ZB_URL = params.ZB_URL;
const ZB_API_KEY = params.ZB_API_KEY;
//////////////////////////////////////////
//ChatGPT処理
//////////////////////////////////////////
ai_req = new HttpRequest();
ai_data = {};
//リクエストヘッダー
ai_req.addHeader('Content-Type: application/json');
ai_req.addHeader('Authorization: Bearer '+AI_API_KEY);
//Postデータ
ai_data.model = AI_MODEL;
ai_data.messages = [{'role':'user','content': AI_TEXT}];
//送信
ai_resp = ai_req.post(AI_URL,JSON.stringify(ai_data));
ai_resp = JSON.parse(ai_resp);
//デバッグログ
Zabbix.log(4, 'ai_req:'+JSON.stringify(ai_data));
Zabbix.log(4, 'ai_resp:'+JSON.stringify(ai_resp));
//////////////////////////////////////////
//Zabbix処理
//////////////////////////////////////////
zb_req = new HttpRequest();
zb_data = {};
//リクエストヘッダー
zb_req.addHeader('Content-Type: application/json-rpc');
//Postデータ
zb_data.auth = ZB_API_KEY;
zb_data.method = 'event.acknowledge';
zb_data.id = 1;
zb_data.params = {};
zb_data.params.eventids = ZB_EVENT_ID;
zb_data.params.action = 4;
zb_data.params.message = ai_resp.choices[0].message.content;
zb_data.jsonrpc = '2.0';
//送信
zb_resp = zb_req.post(ZB_URL,JSON.stringify(zb_data));
zb_resp = JSON.parse(zb_resp);
//デバッグログ
Zabbix.log(4, 'zb_data:'+JSON.stringify(zb_data));
Zabbix.log(4, 'zb_resp:'+JSON.stringify(zb_resp));
//処理終了
return 1;
※サンプルプログラムです。自己責任でご利用ください。
※スクリプトの転載はお控えください。
メッセージテンプレートのタブ
| 項目 | 値 | 補足 |
|---|---|---|
| メッセージタイプ | 障害 | |
| 件名 | 任意 | 不使用 |
| メッセージ | 次のログを検知しました。対処方法を教えてください。 {ITEM.LASTVALUE} |
ChatGPTに送信する文字列 |
実行イメージ
LinkDownのトラップを送信する
# snmptrap -v2c -c public localhost '' .1.3.6.1.6.3.1.1.5.3
Zabbixで受信する
障害として検知する
GhatGPTからの回答がコメントに記載される
今後の展開について
今回はChatGPTを使用したので、一般的な回答になってしまいます。
これでは障害対応するのは難しいと思います。
そのため、次のような回答がもらえるようにAIをつくっていく必要があると思っています。
・〇〇日前に同様の障害を検知しました。その際は△△の対応を行いました。
・先ほど検知した〇〇の件に関連して発生した可能性があります。
最後に
弊社ではZabbix関連サービスを展開しています。以下ページもご参照ください。
SCSK Plus サポート for Zabbix
★YouTubeに、SCSK Zabbixチャンネルを開設しました!★
★X(旧Twitter)に、SCSK Zabbixアカウントを開設しました!★





