ChatGPTでおなじみのOpenAIは、OpenAI APIと呼ばれるAPIによる利用が可能となっている。APIを利用することで、curlコマンドなどを用いて手軽に生成AIの機能をシステムに組み込んで利用することができる。
本記事では、OpenAI APIを使ってZabbixの障害アラートを生成AIに連携する手順を記載する。
具体的には、OpenAI APIを用いて以下のプロンプトを連携し、Zabbixの障害アラートの原因の問い合わせを行う。問い合わせで得られた生成AIの応答をZabbixのメッセージとして表示できるようにする。
Please tell me the cause of the error message below.
[障害アラートの内容]
なお、本記事の作成にあたり、以下の記事も参考にさせていただいた。
環境
今回の環境は以下の通り。
- Zabbix 7.0
OpenAIのアカウントを作成していない場合は、事前に作成をしておこう。ChatGPTを利用している場合は、すでにアカウント作成済みとなるため、新たにアカウント作成は不要となる。
OpenAI APIのAPI keyを取得
1. OpenAI API keyの作成画面にログイン
以下URLにアクセスすると、OpenAI API keyの作成画面が表示される。
2. API keyを作成
「Create new secret key」ボタンを押し、API keyを作成する。
作成時にkeyの名前の入力を求められるが、未入力でも問題ない。
作成完了後、API keyが表示されるので、必ずコピーして控えること。ここでコピーしておかないと、以降確認することができないため、API keyを再作成する必要がある。
3. OpenAI APIの利用状況を確認
OpenAI APIはリクエストや応答に含まれるトークンの数によって課金される。トークンは英語の場合は1単語がおおよそ1トークンとなるようだが、日本語の場合は1文字が1トークン以上の場合があるとの情報があるので注意する。
トークンの使用状況は以下URLから確認することができる。
なお、アカウントを新規作成した際は、5.00 USD分の無料利用枠がある(3か月の期限付き)。テストする際にかなりAPIを使用してみたが、それでも0.03 USDしか消費しなかったので、5.00 USDあれば検証用途としては十分だろう。
OpenAI API連携用スクリプトの作成
1. curlによるOpenAI API実行方法
curlを使う場合は以下の通り実行すればOpenAI APIによる問い合わせができる。
# API keyを設定
export OPENAI_API_KEY='sk-********'
header='Content-Type: application/json'
apiurl='https://api.openai.com/v1/chat/completions'
prompt="ここに問い合わせしたい内容を記載。"
json='{"model": "gpt-4o-mini", "messages": [{"role": "user", "content": "'${prompt}'"}]}'
# API実行
curl ${apiurl} -sS -H "Authorization: Bearer ${OPENAI_API_KEY}" -H "${header}" -d "${json}"
実行結果は以下の通り。.choices[0].message.contentがAIの回答となる。
# curl ${apiurl} -sS -H "Authorization: Bearer ${OPENAI_API_KEY}" -H "${header}" -d "${json}"
{
  "id": "chatcmpl-xxxxxxxx",
  "object": "chat.completion",
  "created": 1723324974,
  "model": "gpt-4o-mini-2024-07-18",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "もちろんです!問い合わせ内容をお知らせいただければ、適切な回答やアドバイスをお伝えいたします。どのようなことについてお尋ねですか?",
        "refusal": null
      },
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 17,
    "completion_tokens": 40,
    "total_tokens": 57
  },
  "system_fingerprint": "fp_48196bc67a"
}
2. スクリプト作成
curlによるOpenAI APIの実行方法を用いて、Zabbixの障害アラートを連携するスクリプトを以下の通り作成した。各環境に合わせて、OpenAIのAPI keyやZabbix API実行用のユーザとパスワードを設定すること。
障害アラートへのメッセージ追加はZabbix APIを使用する。Zabbix APIの使い方は、以下別記事を参考にしていただきたい。
また、OpenAI APIで同時に多数のリクエストを実行すると、応答がうまく得られずnullが返ってくる場合があったため、負荷分散を目的として、実行間隔制御の待機時間(最小10秒~最大120秒)を設定した。
send_chatgpt_api.sh
#!/bin/bash
# アラート内容を引数に代入
eventid=$1
alert=$(echo $2 | sed -e 's/"/\\"/g')
# 実行間隔制御 (10秒+ランダム時間)
sleep $(( 10 + ($RANDOM % 110) ))
# API keyを設定
export OPENAI_API_KEY='sk-********'
# モデルを選択
#model="gpt-3.5-turbo"
model="gpt-4o-mini"
header='Content-Type: application/json'
apiurl='https://api.openai.com/v1/chat/completions'
prompt="Zabbixで検知した以下イベントメッセージの原因及び解消方法を簡潔に教えてください。\n\n${alert}"
json='{"model": "'${model}'", "messages": [{"role": "user", "content": "'${prompt}'"}]}'
# API実行
result=$(curl ${apiurl} -sS -H "Authorization: Bearer ${OPENAI_API_KEY}" -H "${header}" -d "${json}")
# 出力
result_message=$(echo $result | jq -r '.choices[0].message.content')
# Zabbix APIログイン
header='Content-Type:application/json-rpc'
apiurl='http://[ZabbixサーバのURL]/zabbix/api_jsonrpc.php'
json='{"jsonrpc": "2.0","method": "user.login","params": {"username": "Admin","password": "********"},"id": 1,"auth": null}'
zbxauth=$(curl -sS -X POST -H "${header}" -d "${json}" ${apiurl} | jq -r ".result")
# Zabbix APIでイベントにメッセージ追加
json='{"jsonrpc": "2.0","method": "event.acknowledge","params": {"eventids": "'${eventid}'","action": 4,"message": "'$(echo ${result_message} | sed -e 's/"/\\"/g')'"},"auth": "'${zbxauth}'","id": 1}'
curl -sS -X POST -H "${header}" -d "${json}" ${apiurl} | jq
# Zabbix APIログオフ
json='{"jsonrpc": "2.0","method": "user.logout","params": [],"id": 4,"auth": "'$zbxauth'"}'
curl -sS -X POST -H "${header}" -d "${json}" ${apiurl} | jq
exit 0
3. スクリプトをZabbixサーバに配置
本スクリプトは、Zabbixサーバの/usr/local/binに配置し、実行権限を付与しておく。
# cp send_chatgpt_api.sh /usr/local/bin/
# chmod +x /usr/local/bin/send_chatgpt_api.sh
# ls -l /usr/local/bin/send_chatgpt_api.sh
-rwxr-xr-x 1 root root 1753  9月 23 07:41 /usr/local/bin/send_chatgpt_api.sh
実行方法は以下の通りとなる。
/usr/local/bin/send_chatgpt_api.sh '[イベントID]' '[アラート内容]'
Zabbixのトリガーアクションを設定
1. スクリプト設定
Zabbixのスクリプト設定を以下の通り行う。
| 設定項目 | 設定値 | 
|---|---|
| 名前 | Send ChatGPT | 
| タイプ | スクリプト | 
| 次で実行 | Zabbixサーバー | 
| コマンド | /usr/local/bin/send_chatgpt_api.sh '{EVENT.ID}' '{ITEM.VALUE}' | 
2. トリガーアクション設定
Zabbixのトリガーアクション設定を以下の通り行う。今回は、「軽度の障害」以上の場合にスクリプトを実行するよう設定する。
| 設定項目 | 設定値 | 
|---|---|
| 名前 | Send ChatGPT | 
| 実行条件 | 「メンテナンス期間外」 AND 「トリガーの深刻度 以上 軽度の障害」 | 
アクションの実行内容は以下の通り、先ほど作成したスクリプトを指定する。
| 設定項目 | 設定値 | 
|---|---|
| 処理内容 | Send ChatGPT | 
| ターゲットリスト | Zabbix server | 
動作確認
実際に障害アラートを発生させて、動作を確認してみよう。
例として、以下の障害アラートを発生させてみた。ポートチャネルPo1からgi3が除外されたアラートとなる。
SNMP Trap from t1250c250 : 2024/02/10 15:11:26. .1.3.6.1.4.1.9.6.1.101.0.161 
Normal General event UNKNOWN - %TRUNK-W-PORTREMOVED: Port gi3 removed from Po1 1
しばらくするとスクリプトが実行され、以下の通りOpenAI APIで取得した生成AIの回答がメッセージとして表示された。
このイベントメッセージの原因は、ポートgi3がPo1 1から削除されたことです。 
解決方法は、次のいずれかです。
  1. ネットワーク上でポートを再接続し、Po1 1にgi3を再度追加します。
  2. システムの設定を確認し、ポートが正しく構成されていることを確認します。
  3. 他のネットワークデバイスとの接続に問題がある場合は、接続を確認し、
     必要に応じて修正します。
これらの手順を実行することで、問題が解決する可能性があります。
ただし、具体的な状況に応じて解決方法が異なる場合もあるため、
詳細な情報があれば助かります。
以上で、OpenAI APIを使ってZabbixの障害アラートを生成AIに連携する手順は完了となる。
参考
更新履歴
- 2023/9/23 新規作成
- 2024/2/10 OpenAI APIに送るプロンプトを日本語に変更
- 2024/6/24 send_chatgpt_api.shをZabbix 7.0に対応するように修正
- 2024/8/11 生成AIモデルをgpt-3.5-turboからgpt-4o-miniに変更








 
 
 
 
0 件のコメント:
コメントを投稿