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 件のコメント:
コメントを投稿