2024年6月30日日曜日

Zabbix APIを使って未クローズの障害イベントをクローズする

Zabbixではトリガーによって検知した障害は、復旧条件を満たさなければクローズされることはなく、いつまでも障害として残り続けてしまう。

Zabbix 4.0以降では、管理画面から手動による障害のクローズができるようになったため、復旧条件の記載が難しいログ監視やSNMP Trap監視などにおいても、クローズができるようになりかなり便利になった。

とはいえ、大量の監視対象がある環境においては、障害のクローズを手作業で実施すること自体が負荷となるケースが存在すると考えられるため、今回はZabbix APIを使って未クローズの障害イベントを一気にクローズする手順を検証した。

環境

環境は以下の通りZabbix 5.0を使用している。ただし、Zabbix 4.0以降でも利用できることを確認するため、Zabbix APIのマニュアルはZabbix 4.0のものを確認して検証を行った。

  • OS : CentOS 8.1
  • Zabbix : 5.0.8
  • APIのURL : http://192.168.11.24/zabbix/api_jsonrpc.php

Zabbix APIを使用する際に、jqコマンドが必要となるため、事前にインストールをしておく。jqコマンドは、Zabbix APIやREST APIなどで利用されているJSON形式のデータを整形して出力したり、必要なデータのみ抽出するのに利用するコマンドとなる。

# dnf install epel-release
# dnf install jq

手順

Zabbix APIを実行する際に送信するJSON形式のデータは、以下構文となる。

{
  "jsonrpc": "2.0",
  "method": "メソッド名",
  "params": {
    "パラメータ1 Key": "パラメータ1 Value",
    "パラメータ2 Key": "パラメータ2 Value",
    ...
  },
  "auth": "Zabbix認証トークン",
  "id": 任意の数字
}

以降の手順では、上記構文の送信データを作成したのち、curlコマンドでそのデータを送信してAPIを実行する、という流れとなる。

また、Zabbix APIのURLやヘッダ情報などは、毎回同一となることから、あらかじめ変数として利用できるようにしておこう。

# header='Content-Type:application/json-rpc'
# apiurl='http://192.168.11.24/zabbix/api_jsonrpc.php'

1. Zabbix APIの認証トークンを取得

Zabbix APIの実行は、認証トークンが必要となる。認証トークンは、user.loginメソッドで取得できる。Zabbixの管理者権限を持つユーザとパスワードを指定して、以下のようにAPIを実行するためのデータを作成する。

# json='{"jsonrpc": "2.0","method": "user.login","params": {"username": "Admin","password": "XXXXXXXX"},"id": 1,"auth": null}'
# echo $json | jq
{
  "jsonrpc": "2.0",
  "method": "user.login",
  "params": {
    "user": "Admin",
    "password": "XXXXXXXX"
  },
  "id": 1,
  "auth": null
}

認証トークンは、以降の作業で常に指定して利用することから、実行結果を変数$zbxauthに代入しておく。

# zbxauth=$(curl -sS -X POST -H "${header}" -d "${json}" ${apiurl} | jq -r ".result")
# echo $zbxauth
e2519a6fbc680a87affc8382b65cdcb7

2. 未クローズの障害イベントを取得

障害イベントのクローズには、eventidが必要となる。problem.getメソッドを使うことで一覧として取得できるので、以下の通り送信データを作成する。
※Zabbix 6.0ではoutputeventidを指定しても動作していたが、Zabbix 7.0では動作しなくなったため、extendを指定する必要がある。

# json='{"jsonrpc": "2.0","method": "problem.get","params": {"output": "extend"},"id": 3,"auth": "'$zbxauth'"}'
# echo $json | jq
{
  "jsonrpc": "2.0",
  "method": "problem.get",
  "params": {
    "output": "extend"
  },
  "id": 3,
  "auth": "e2519a6fbc680a87affc8382b65cdcb7"
}

取得したeventidは、次の手順で配列として利用できるようにするため、jqコマンドを使って出力結果を整形して変数$eventidsに格納する。以下コマンドの実行例では、6件の障害イベントが対象となる。

# eventids=$(curl -sS -X POST -H "${header}" -d "${json}" ${apiurl} | jq -c '[ .result[].eventid ]')
# echo $eventids
["34308","50073","50875","50876","50877","50954"]

3. 障害イベントを手動クローズ

イベントに対する捜査はevent.acknowledgeメソッドを使う。event.acknowledgeメソッドでは、イベントに対して実行する処理をactionにて指定するが、その際に指定できる値は以下の通りとなる。

  • 1 - close problem;
  • 2 - acknowledge event;
  • 4 - add message;
  • 8 - change severity.

上記は組み合わせることが可能であり、今回は「1 : 障害のクローズ」と「4 : メッセージ追加」の2つを同時に実行するため、actionを1 + 4 = 5で指定する。

# json='{"jsonrpc": "2.0", "method": "event.acknowledge", "params": {"eventids": '$eventids', "action": 5, "message": "Closed problem by API"}, "auth": "'$zbxauth'", "id": 1}'
# echo $json | jq
{
  "jsonrpc": "2.0",
  "method": "event.acknowledge",
  "params": {
    "eventids": [
      "34308",
      "50073",
      "50875",
      "50876",
      "50877",
      "50954"
    ],
    "action": 5,
    "message": "Closed problem by API"
  },
  "auth": "e2519a6fbc680a87affc8382b65cdcb7",
  "id": 1
}

障害イベントのクローズ前に、GUI上でも障害一覧を確認しておく。1件はホストを無効化しているため障害が表示されていないが、GUI上では5件の障害が表示されている。後ほど、API実行後に赤枠で示したアラートがクローズされることを確認する。

curlにてAPIを実行する。resultに処理を実行したイベントIDの一覧が表示されればOKとなる。

# curl -sS -X POST -H "${header}" -d "${json}" ${apiurl} | jq
{
  "jsonrpc": "2.0",
  "result": {
    "eventids": [
      34308,
      50073,
      50875,
      50876,
      50877,
      50954
    ]
  },
  "id": 1
}

GUI上にて再度障害一覧を確認すると、すべての障害がクローズされ、一覧から消えていることが確認できた。

また、クローズされたイベントを確認すると、APIで指定した「Closed problem by API」のメッセージとともに、ステータスが「解決済」になっていることが確認できた。

4. Zabbix APIの認証トークンを削除

最後に認証トークンを削除するため、user.logoutメソッドを使用する。

# json='{"jsonrpc": "2.0","method": "user.logout","params": [],"id": 4,"auth": "'$zbxauth'"}'
# echo $json | jq
{
  "jsonrpc": "2.0",
  "method": "user.logout",
  "params": [],
  "id": 4,
  "auth": "e2519a6fbc680a87affc8382b65cdcb7"
}

curlにてAPIを実行し、resulttrueであれば、認証トークンの削除が正常に実施されている。

# curl -sS -X POST -H "${header}" -d "${json}" ${apiurl} | jq
{
  "jsonrpc": "2.0",
  "result": true,
  "id": 4
}

スクリプト化してみる

クローズ処理を定期的に実行できるようclose_zabbix_problem.shという名前のスクリプトを作成し、cronに登録して定期的に古い障害イベントをクローズできるようにしてみた。

7日前の未分類、情報、警告ステータスのイベントをクローズする処理となり、クローズする対象を限定するため、イベントID取得時に、time_tillseveritiesといったパラメータを指定している。

#!/bin/bash

# クローズ対象の日付
clode_date=$(date +%s --date '7 day ago')
close_message="Closed problem by API"

# Zabbix APIログイン
header='Content-Type:application/json-rpc'
apiurl='http://192.168.11.24/zabbix/api_jsonrpc.php'
json='{"jsonrpc": "2.0","method": "user.login","params": {"username": "Admin","password": "XXXXXXXX"},"id": 1,"auth": null}'
zbxauth=$(curl -sS -X POST -H "${header}" -d "${json}" ${apiurl} | jq -r ".result")

# イベント一覧(未解決の障害、指定日以前のもの、未分類・情報・警告イベント)を取得
json='{"jsonrpc": "2.0","method": "problem.get","params": {"output": "extend","time_till": '${clode_date}',"severities": [0,1,2]},"auth": "'${zbxauth}'","id": 1}'
eventids=$(curl -sS -X POST -H "${header}" -d "${json}" ${apiurl} | jq -r '.result[].eventid' | tr '\n' ' ')

# Zabbix APIでイベントにメッセージ追加しクローズ
for eventid in ${eventids}; do
  json='{"jsonrpc": "2.0","method": "event.acknowledge","params": {"eventids": '${eventid}',"action": 5,"message": "'${close_message}'"},"auth": "'${zbxauth}'","id": 1}'
  curl -sS -X POST -H "${header}" -d "${json}" ${apiurl} | jq
done

# 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

参考

更新履歴

  • 2021/2/17 新規作成
  • 2024/1/20 クローズ処理のスクリプト化の記載を追記
  • 2024/6/30 Zabbix 7.0に対応するため、イベント一覧取得時のコマンドを修正
2024年6月27日木曜日

Zabbix 7.0でZabbixサーバーに対するスクリプト実行が設定できない問題の解消手順

ZabbixではZabbixサーバーやZabbixエージェントを経由して、スクリプトを実行する機能がある。

しかし、Zabbix 7.0をクリーンインストールした後にスクリプトを設定しようとしたところ、「次で実行」の設定項目にて以下のメッセージが表示され、Zabbixサーバーにおけるスクリプト実行が設定できなくなっていた。

Zabbixサーバーによるスクリプト実行は設定により無効化されています。

本記事では、Zabbix 7.0でZabbixサーバーに対するスクリプト実行が設定できない問題の解消手順を記載する。

環境

導入環境は以下となる。事前にZabbixサーバーがインストールされていることが前提となる。

  • OS : AlmaLinux 9.4
  • Zabbix : 7.0

原因

Zabbix 7.0のWhat’s newを見ると、以下の記載がある。どうやら、EnableGlobalScripts=0という設定が実施されており、デフォルトではZabbixサーバーにおいてスクリプト実行ができないようになっているとのこと。

global script execution on Zabbix server can be disabled by setting EnableGlobalScripts=0 in server configuration. For new installations, global script execution on Zabbix server is disabled by default.

解消方法

1. 設定を修正

/etc/zabbix/zabbix_server.confのファイルを開き、EnableGlobalScriptsを1に修正する。デフォルト値は1に設定されている旨が設定ファイルのコメントに記載されているが、実際はZabbix 7.0ではデフォルト値が0となっていた。

### Option: EnableGlobalScripts
#    Enable global scripts on Zabbix server.
#       0 - disable
#       1 - enable
#
# Mandatory: no
# Default:
# EnableGlobalScripts=1
EnableGlobalScripts=1 # ★0→1に修正

2. Zabbixサーバーのサービスを再起動

修正後、設定反映のため、Zabbixサーバーのサービスを再起動する。

# systemctl restart zabbix-server

3. 動作確認

あらためてスクリプトの設定を行うと、先ほどは選択できなかった「次で実行」の設定項目で「Zabbixサーバー」の項目が選択できるようになっている。


2024年6月24日月曜日

OpenAI APIを使ってZabbixの障害イベントを生成AIに連携する

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 6.0.17

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-3.5-turbo", "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}  -H "Authorization: Bearer ${OPENAI_API_KEY}" -H "${header}" -d "${json}"
{
  "id": "chatcmpl-xxxxxxxx",
  "object": "chat.completion",
  "created": 1695187433,
  "model": "gpt-3.5-turbo-0613",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "The OpenAI mission is to ensure that artificial general intelligence (AGI) benefits all of humanity. AGI refers to highly autonomous systems that outperform humans in most economically valuable work. OpenAI aims to build safe and beneficial AGI directly, but it also considers its mission fulfilled if its work aids others in achieving this outcome. OpenAI commits to principles of broadly distributed benefits, long-term safety, technical leadership, and cooperative orientation to achieve the positive impact of AGI on society."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 14,
    "completion_tokens": 97,
    "total_tokens": 111
  }
}

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-********'

header='Content-Type: application/json'
apiurl='https://api.openai.com/v1/chat/completions'
prompt="Zabbixで検知した以下イベントメッセージの原因及び解消方法を簡潔に教えてください。\n\n${alert}"
json='{"model": "gpt-3.5-turbo", "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年6月22日土曜日

Zabbix 7.0をAnsibleで操作するためのcommunity.zabbixモジュール最新化手順

2024年6月4日にリリースされたZabbix 7.0をAnsibleで操作しようとしたところ、以下のようなInvalid paramsのエラーで失敗した。

failed: [t1023zabi] (item={'name': 't3051kube', 'groups': 'Linux servers', 'type': 'agent', 'ip': '192.168.1.1', 
'templates': ['Linux by Zabbix agent']}) => {"ansible_loop_var": "item", "changed": false, "item": {"groups": "Linux servers", 
"ip": "192.168.1.1", "name": "t3051kube", "templates": ["Linux by Zabbix agent"], "type": "agent"}, 
"msg": "connection error occurred: REST API returned {'code': -32602, 'message': 'Invalid params.', 
'data': 'Invalid parameter \"/1/groups/1\": unexpected parameter \"name\".'} 
when sending {\"jsonrpc\": \"2.0\", \"method\": \"host.create\", \"id\": \"706afb46-c4e4-461b-83e9-6e798396b800\", \"params\": {\"host\": \"t3051kube\", 
\"interfaces\": [{\"type\": 1, \"main\": 1, \"useip\": 1, \"ip\": \"192.168.1.1\", \"details\": {}, \"dns\": \"\", \"port\": \"10050\"}], 
\"groups\": [{\"groupid\": \"2\", \"name\": \"Linux servers\", \"flags\": \"0\", 
\"uuid\": \"dc579cd7a1a34222933f24f52a68bcd8\"}], \"status\": 0}, 
\"auth\": \"7922aa3xxxx556615xxxx0344xxxx2fea\"}"}

原因はAnsibleのcommunity.zabbixモジュールが古く、Zabbix 7.0にサポートしていなかったことが原因だった。本記事では、Zabbix 7.0をAnsibleで操作するために必要となるcommunity.zabbixモジュールの最新化手順を記載する。

環境

今回手順確認を行った環境の情報は以下の通り。

  • OS : AlmaLinux 8.5
  • Ansible : 8.1.0 (Ansible core 2.15.3)
  • community.zabbix : 2.1.0 → 3.0.0

community.zabbixモジュールの最新化手順

1. Ansible Galaxyにてモジュールを確認

community.zabbixモジュールは以下URLからバージョン情報を確認することができる。

また、変更内容はGitHubのChangelogから直接確認する。

以下の通り、v3.0.0においてZabbix 7.0で各種モジュールが動作するよう改修がされていることが確認できる。

zabbix_discovery_rule, zabbix_group_events_info, zabbix_host, zabbix_host_events_info, 
zabbix_proxy, zabbix_proxy_info modules updated to work wih Zabbix 7.0

2. 現在のバージョン確認

現在インストールされているcommunity.zabbixモジュールのバージョンを確認する。

# ansible-galaxy collection list community.zabbix
実行結果------------------------------
# /usr/local/lib/python3.9/site-packages/ansible_collections
Collection       Version
---------------- -------
community.zabbix 2.1.0  

3. Ansible Galaxyより最新版モジュールをインストール

以下コマンドで最新版モジュールをインストールする。なお、すでにモジュールがインストールされている場合インストールが実行されない (All requested collections are already installed.と表示されインストールが実施されない) ため、--forceオプションまたはバージョンを指定することでインストールを続行するようにしている。

# ansible-galaxy collection install community.zabbix --force
または
# ansible-galaxy collection install community.zabbix:3.0.0

4. インストール後のバージョン確認

インストール後のcommunity.zabbixモジュールのバージョンを確認する。

# ansible-galaxy collection list community.zabbix
実行結果------------------------------
# /root/.ansible/collections/ansible_collections
Collection       Version
---------------- -------
community.zabbix 3.0.0  

# /usr/local/lib/python3.9/site-packages/ansible_collections
Collection       Version
---------------- -------
community.zabbix 2.1.0  

5. Ansibleを実行

最後にZabbix 7.0に対してPlaybookを実行する。以下は、Zabbix 7.0に対して、community.zabbix.zabbix_hostモジュールを用いて監視対象ホストを登録した際の実行結果となり、問題なく実行できていることがわかる。
# ansible-playbook -i hosts -l t1023zabi zabbix/set_zabbix_host.yml

[root@t1025alma test]# ansible-playbook -i hosts -l t1023zabi zabbix/set_zabbix_host.yml

PLAY [Set zabbix host] **************************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************************************
ok: [t1023zabi]

TASK [Create host] ******************************************************************************************************************************************************************
changed: [t1023zabi] => (item={'name': 't3051kube', 'groups': 'Linux servers', 'type': 'agent', 'ip': '192.168.1.1', 'templates': ['Linux by Zabbix agent']})

PLAY RECAP **************************************************************************************************************************************************************************
t1023zabi                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

2024年6月16日日曜日

Zabbix 7.0にSNMP Trapを監視する手順 (AlmaLinux 9+SNMPTT)

以下記事で、AlmaLinux9.4+Zabbix 7.0のインストール手順を記載した。

Zabbix自体には、SNMP Trapを受信する機能はないため、snmptrapdやSNMPTTと連携して監視設定を行う必要がある。

本記事では、Zabbix 7.0の環境にて、SNMPTTを用いたSNMP Trap監視設定の手順を記載する。

環境

導入環境は以下となる。事前にZabbixサーバーがインストールされていることが前提となる。

  • OS : AlmaLinux 9.4
  • Zabbix : 7.0
  • SNMPTT : 1.5

SNMPTTインストール

1. リポジトリを登録

SNMPTTは通常のAlmaLinuxのリポジトリには存在しないため、EPELとCRBのリポジトリを登録する。なお、CRB (CodeReady Builder)のリポジトリは、以前はPowerToolsという名称で呼ばれていたものとなる。

dnf install epel-release -y
dnf config-manager --set-enabled crb

2. パッケージをインストール

以下コマンドでNET-SNMPと各種関連Perlモジュールをインストールする。

dnf install net-snmp net-snmp-utils net-snmp-perl perl-Time-HiRes \
perl-Text-Balanced perl-Sys-Syslog perl-DBI perl-DBD-MySQL perl-DBD-Pg \
perl-threads perl-Digest-MD5 perl-DBD-ODBC perl-Config-IniFiles perl-Net-IP -y

3. SNMPTTをダウンロード

SNMPTTを以下公式サイトからダウンロードする。今回はsnmptt_1.5.tgzをダウンロードした。

http://www.snmptt.org/downloads.shtml

4. SNMPTTを手動インストール

先ほどダウンロードしたSNMPTTのファイルをサーバーの任意のディレクトリに配置し、展開する。

tar zxvf snmptt_1.5.tgz

展開したファイルに含まれるSNMPTTとSNMPTT handlerの実行ファイルを/usr/sbin/に配置する。

cd snmptt_1.5
cp snmptt /usr/sbin/
chmod +x /usr/sbin/snmptt
cp snmptthandler /usr/sbin/
chmod +x /usr/sbin/snmptthandler

SNMPTT実行用ユーザーsnmptt-rオプションを付けてシステムユーザーとして作成する。

adduser -r snmptt

設定ファイルを/etc/snmpttに配置する。

mkdir /etc/snmptt
chown -R snmptt.snmptt /etc/snmptt
chmod 750 /etc/snmptt
cp snmptt.ini /etc/snmptt/

ログ等を保管するディレクトリを作成する。

mkdir /var/log/snmptt
chown -R snmptt.snmptt /var/log/snmptt
chmod -R 755 /var/log/snmptt
mkdir /var/spool/snmptt/
chown -R snmptt.snmptt /var/spool/snmptt
chmod -R 750 /var/spool/snmptt

systemdに起動用設定ファイルを配置する。

cp snmptt.service /usr/lib/systemd/system/snmptt.service
chmod -x /usr/lib/systemd/system/snmptt.service

ログローテート用の設定ファイルを配置する。

cp snmptt.logrotate /etc/logrotate.d/snmptt

ログローテートの設定ファイルの記載が一部適切ではないので、★箇所を
修正しておく。

# vi /etc/logrotate.d/snmptt

/var/log/snmptt/snmptt*.log /var/log/snmptt/snmptthandler.debug {
    weekly
    notifempty
    missingok
}

/var/log/snmptt/snmptt.debug {
    weekly
    notifempty
    missingok
    postrotate
        /usr/bin/systemctl reload snmptt >/dev/null 2>/dev/null # ←★reloadコマンドを修正
    endscript
}

5. SNMPTT設定

SNMPTTの設定ファイルsnmptt.iniを以下の通り修正する。

# vi /etc/snmptt/snmptt.ini
net_snmp_perl_enable = 1
log_enable = 1
log_file = /var/log/snmptt/snmptt.log
date_time_format = %Y/%m/%d %H:%M:%S
syslog_enable = 0

Trap受信時の出力内容を定義するsnmptt.confファイルを作成する。

# cat << 'EOF' > /etc/snmptt/snmptt.conf
EVENT general .* "General event" Normal
FORMAT ZBXTRAP $aA $*
EOF

SNMPTTを起動させる。

systemctl start snmptt
systemctl enable snmptt
systemctl status snmptt

6. snmptrapd設定

snmptrapdの設定を行う。

# vi /etc/sysconfig/snmptrapd
OPTIONS="-On -Lsd -p /var/run/snmptrapd.pid -M /usr/share/snmp/mibs:/usr/share/snmp/venders -m all"

# vi /etc/snmp/snmptrapd.conf
authCommunity   log,execute,net public
traphandle default /usr/sbin/snmptthandler

snmptrapdを起動させる。

systemctl start snmptrapd
systemctl enable snmptrapd
systemctl status snmptrapd

7. SNMP Trap受信テスト

一度ここでsnmptrapコマンドを用いて、SNMP Trapを送信しておく。

snmptrap -v2c -c public 127.0.0.1 "" .1.3.6.1.6.3.1.1.5.1 coldStart s "Start"

SNMP Trap送信後、SNMPTTのログにTrapの内容が出力されていれば問題ない。

# cat /var/log/snmptt/snmptt.log
2024-06-15T12:30:48+0900 .1.3.6.1.6.3.1.1.5.1 Normal "Status Events" localhost - ZBXTRAP  Device reinitialized (coldStart)

8. Zabbixサーバーの設定

Zabbixサーバーは以下設定を変更しておく。

# vi /etc/zabbix/zabbix_server.conf
SNMPTrapperFile=/var/log/snmptt/snmptt.log
StartSNMPTrapper=1

変更を反映するため、Zabbixサーバーのサービスを再起動しておく。

systemctl restart zabbix-server

ZabbixにおけるSNMP Trap監視設定

SNMPTTの設定が完了したら、ZabbixのWeb画面にログインし、テンプレート、アイテム、トリガーを設定する。

1. テンプレートを設定

  • テンプレート名:SNMP Trap
  • グループ:Templates

2. アイテムを設定

  • 名前:SNMP Trap log
  • タイプ:SNMP トラップ
  • キー:snmptrap[]
  • データ型:ログ
  • ヒストリ保存期間:Store up to 90d
  • ログの時間の形式:yyyy/MM/dd hh:mm:ss
  • 有効:チェック

3. トリガーを設定

  • 名前:SNMP Trap from {HOST.NAME} : {ITEM.LASTVALUE1}
  • 深刻度:軽度の障害 ※任意の深刻度で設定する
  • 条件式:last(/SNMP Trap/snmptrap[])<>""
  • 障害イベント生成モード:複数
  • 手動クローズを許可:チェック
  • 有効:チェック

4. 監視対象機器に対してテンプレート適用とSNMPインタフェース設定

監視対象機器に対してテンプレート適用とSNMPインタフェース設定を行い監視を有効化する。

5. SNMP Trap受信テスト

再度snmptrapコマンドを用いて、SNMP Trapを送信しておく。

snmptrap -v2c -c public 127.0.0.1 "" .1.3.6.1.6.3.1.1.5.1 coldStart s "Start"

Zabbixサーバーの監視画面にて、トリガーによる障害検知がされれば設定は完了となる。

参考

2024年6月12日水曜日

Zabbix 7.0インストール手順 (AlmaLinux 9+PostgreSQL利用)

2024年6月4日にZabbixの最新バージョンであるZabbix 7.0がリリースされた。

リリースノートは以下にて確認できる。

本記事では、Zabbix 7.0をAlmaLinux 9とPostgreSQLを用いてインストールする手順を記載する。なお、MariaDBを用いてインストールする手順は以下記事にて記載しているので参考にしていただきたい。

環境

環境は以下の通り。LinuxディストリビューションはAlmaLinux 9.4を使用する。AlmaLinuxはRed Hat Enterprise Linux互換ディストリビューションであるため、Red Hat Enterprise LinuxやCentOSなどでも同様の手順でインストールできるはずだ。

  • OS:AlmaLinux 9.4
  • DB:PostgreSQL 13.11
  • Web Server:Apache 2.4.57

Zabbixをインストールする際は、サポートされるDBのバージョンを確認しておく必要がある。以下URLでサポートされるDBのバージョンを確認することができるが、Zabbox 7.0の場合、PostgreSQLは13.0-16.Xを使用することが求められる。

なお、dnfを使うため、インターネット接続できる環境であることが前提となる。

インストール手順

1. SELinuxとfirewalldを停止する

これらが動いているとうまく動作しないことが多いので停止しておく。

2. PostgreSQLをインストール

dnfでPostgreSQLをインストールすると、AlmaLinux 9.4ではバージョン13.xxがインストールされる。このバージョンはZabbix 7.0がサポートしているため問題ないが、もしサポート外のバージョンの場合は、zabbix-serverのサービス起動に失敗するため注意しよう。

# dnf install postgresql-server postgresql-contrib -y

DBの初期化を実施しておく。

# postgresql-setup initdb

3. PostgreSQLの初期設定

DBの設定として、以下2点を実施する。

  • DB接続時の認証方式をident認証からDB独自認証に変更
  • DBのパフォーマンスチューニング

DB接続時の認証方式の変更は、/var/lib/pgsql/data/pg_hba.confのファイルを以下の通り修正して対応する。

# vi /var/lib/pgsql/data/pg_hba.conf
---
# IPv4 local connections:
host    all     all       127.0.0.1/32    md5 # identからmd5に修正
# IPv6 local connections:
host    all     all       ::1/128         md5 # identからmd5に修正

DBのチューニングとしては、以下3つのパラメーターを修正する。PostgreSQLの設定ファイルは、特に変更をしていない場合は、/var/lib/pgsql/data/postgresql.confに配置されている。

パラメーター デフォルト値 設定値 説明
shared_buffers 128MB 1GB 共有メモリバッファのために使用するメモリ量。搭載メモリ量の25%程度を目安に増加させる。今回は搭載メモリが4GBであったことから、1GBに設定する。
checkpoint_timeout 5min 30min チェックポイント実行までの間隔。5分は短いことから、30分に延ばしておく。
max_wal_size 1GB 8GB shared_buffersの増加と比例させる形で増やしておく。
# vi /var/lib/pgsql/data/postgresql.conf
---
shared_buffers = 1GB
---
checkpoint_timeout = 30min
max_wal_size = 8GB

設定反映のため、このタイミングでPostgreSQLを再起動しておく。

# systemctl restart postgresql
# systemctl enable postgresql

4. Zabbix 7.0をインストール

以下コマンドを実行することで、Zabbix 7.0をインストールすることができる。

# rpm -Uvh https://repo.zabbix.com/zabbix/7.0/alma/9/x86_64/zabbix-release-7.0-2.el9.noarch.rpm
# dnf clean all

# dnf install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent -y

Web画面の英語表示や日本語表示をできるよう、以下のパッケージも追加でインストールしておく。

# dnf install glibc-langpack-en zabbix-web-japanese -y

5. DBの初期設定

DBの初期設定として、DB作成とユーザーへの権限付与を行う。

まずは、PostgreSQLに接続し、ユーザー「zabbix」を作成する。次に、DB「zabbix」を作成する。

# password="P@ssw0rd!"
# su - postgres -c "psql -c \"create user zabbix login encrypted password '${password}'\""
# su - postgres -c "createdb -O zabbix zabbix"

Zabbix初期化用SQLファイルが用意されているので、以下コマンドで流し込みを行う。パスワードは先ほど作成したzabbixユーザのパスワードを指定する。特にエラー等なく、プロンプトが返ってくれば問題ない。

# zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u zabbix psql zabbix > /dev/null
# echo $?
0

6. Zabbixの初期設定

/etc/zabbix/zabbix_server.confは、先ほど設定したDB「Zabbix」に接続するためのzabbixユーザのパスワードを設定する。

# vi /etc/zabbix/zabbix_server.conf
DBPassword=P@ssw0rd!

7. Zabbixを起動

以上で準備が整ったので、Zabbixを起動させる。

# systemctl restart zabbix-server zabbix-agent httpd php-fpm
# systemctl enable zabbix-server zabbix-agent httpd php-fpm

8. Web画面で初期セットアップを行う

以下URLにアクセスし、初期セットアップを行う。

http://<Zabbixサーバーのホスト名 or IPアドレス>/zabbix/

最初の画面では、言語選択が可能となっているので、「ja-JP」を選択し、「次のステップ」を選択する。

「前提条件のチェック (Check of pre-requisites)」では、すべて「OK」となっていることを確認する。通常はデフォルト設定ですべて「OK」となっているはずである。

「データベース接続設定 (Configure DB connection)」では、以下3点を設定する。

  • 「パスワード」は、事前に設定したパスワードを入力する。
  • 「データーベーススキーマ」は、空欄のままとしておく。ここに誤った値を入れると「現在のZabbixデータベースのバージョン:テーブル"dbversion"が存在しませんを判断できません。」といったエラーメッセージが表示され先に進めない。
  • 「データベース接続のTLS暗号化」は、セキュリティ面を重視するなら有効にしてもよいが、今回は同一サーバー内のDB接続となることから、TLS暗号化は無効とする。

「設定 (Settings)」では、「Zabbixサーバー名」がデフォルト空白なのでホスト名など入れてもよい。「Zabbixサーバー名」で設定した名前が何に使われるかというと、操作画面の右上に表示されるだけのようなので、空白のままでも動作に支障はない。また、タイムゾーンの設定ができるようになっているので、「(UTC+9:00) Asia/Tokyo」を選択しておこう。

「設定パラメータの確認 (Pre-installation summary)」で設定を再確認できる。

問題なければ以下のような画面が表示され、設定値がetc/zabbix/web/zabbix.conf.phpに保存される。これでインストール作業は完了となる。

8. Zabbixにログインする

初期設定が終わるとログイン画面に遷移するので、早速ログインしてみよう。初期ID/パスワードは以下の通り。

  • ID:Admin ※Aは大文字。大文字小文字の区別をするため注意
  • パスワード:zabbix

以上で完了となる。特に問題なければ、1時間もあればインストールできる。Zabbix 6.0からインタフェースに劇的な変更はないように見えるが、細かいところで変更は入っているようなので、今後使いながら確認していきたい。

2024年6月8日土曜日

Zabbix 7.0インストール手順 (AlmaLinux 9+MariaDB利用)

2024年6月4日にZabbixの最新バージョンであるZabbix 7.0がリリースされた。

リリースノートは以下にて確認できる。

本記事では、Zabbix 7.0をAlmaLinux 9とMariaDBを用いてインストールする手順を記載する。なお、PostgreSQLを用いてインストールする手順は以下記事にて記載しているので参考にしていただきたい。

環境

環境は以下の通り。LinuxディストリビューションはAlmaLinux 9.4を使用する。AlmaLinuxはRed Hat Enterprise Linux互換ディストリビューションであるため、Red Hat Enterprise LinuxやCentOSなどでも同様の手順でインストールできるはずだ。

  • OS:AlmaLinux 9.4
  • DB:MariaDB 10.5.22
  • Web Server:Apache 2.4.57

Zabbixをインストールする際は、サポートされるDBのバージョンを確認しておく必要がある。以下URLでサポートされるDBのバージョンを確認することができるが、Zabbox 7.0の場合、MariaDBは10.5.00-11.3.Xを使用することが求められる。

なお、dnfを使うため、インターネット接続できる環境であることが前提となる。

インストール手順

1. SELinuxとfirewalldを停止する

これらが動いているとうまく動作しないことが多いので停止しておく。

2. MariaDBをインストール

dnfでMariaDBをインストールすると、AlmaLinux 9.4ではバージョン10.5.22がインストールされる。このバージョンはZabbix 7.0がサポートしているため問題ないが、もしサポート外のバージョンの場合は、zabbix-serverのサービス起動に失敗するため注意しよう。

# dnf install mariadb mariadb-server -y

設定は特に変更せずデフォルトの状態で起動させておく。

# systemctl start mariadb
# systemctl enable mariadb

3. Zabbix 7.0をインストール

以下コマンドを実行することで、Zabbix 7.0をインストールすることができる。

# rpm -Uvh https://repo.zabbix.com/zabbix/7.0/alma/9/x86_64/zabbix-release-7.0-2.el9.noarch.rpm
# dnf clean all

# dnf install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent -y

Web画面の英語表示や日本語表示をできるよう、以下のパッケージも追加でインストールしておく。

# dnf install glibc-langpack-en zabbix-web-japanese -y

4. DBの初期設定

DBの初期設定として、DB作成とユーザーへの権限付与を行う。

まずは、MariaDBに接続し、DB「zabbix」を作成する。DB「Zabbix」に対する全権限をユーザー「zabbix」に付与しておく。パスワードは好みで設定すればよい。

# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.5.22-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database zabbix character set utf8mb4 collate utf8mb4_bin;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> create user zabbix@localhost identified by 'P@ssw0rd!';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> set global log_bin_trust_function_creators = 1;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> quit;
Bye

Zabbix初期化用SQLファイルが用意されているので、以下コマンドで流し込みを行う。パスワードは先ほど作成したzabbixユーザのパスワードを指定する。特にエラー等なく、プロンプトが返ってくれば問題ない。

# zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix -p zabbix
Enter password:
# echo $?
0

5. Zabbixの初期設定

/etc/zabbix/zabbix_server.confは、先ほど設定したDB「Zabbix」に接続するためのzabbixユーザのパスワードを設定する。

# vi /etc/zabbix/zabbix_server.conf
DBPassword=P@ssw0rd!

6. Zabbixを起動

以上で準備が整ったので、Zabbixを起動させる。

# systemctl restart zabbix-server zabbix-agent httpd php-fpm
# systemctl enable zabbix-server zabbix-agent httpd php-fpm

7. Web画面で初期セットアップを行う

以下URLにアクセスし、初期セットアップを行う。

http://<Zabbixサーバーのホスト名 or IPアドレス>/zabbix/

最初の画面では、言語選択が可能となっているので、「ja-JP」を選択し、「次のステップ」を選択する。

「前提条件のチェック (Check of pre-requisites)」では、すべて「OK」となっていることを確認する。通常はデフォルト設定ですべて「OK」となっているはずである。

「データベース接続設定 (Configure DB connection)」では、事前に設定したパスワードを入力し、他はデフォルトのままとする。

「設定 (Settings)」では、「Zabbixサーバー名」がデフォルト空白なのでホスト名など入れてもよい。「Zabbixサーバー名」で設定した名前が何に使われるかというと、操作画面の右上に表示されるだけのようなので、空白のままでも動作に支障はない。また、タイムゾーンの設定ができるようになっているので、「(UTC+9:00) Asia/Tokyo」を選択しておこう。

「設定パラメータの確認 (Pre-installation summary)」で設定を再確認できる。

問題なければ以下のような画面が表示され、設定値がetc/zabbix/web/zabbix.conf.phpに保存される。これでインストール作業は完了となる。

8. Zabbixにログインする

初期設定が終わるとログイン画面に遷移するので、早速ログインしてみよう。初期ID/パスワードは以下の通り。

  • ID:Admin ※Aは大文字。大文字小文字の区別をするため注意
  • パスワード:zabbix

以上で完了となる。特に問題なければ、1時間もあればインストールできる。Zabbix 6.0からインタフェースに劇的な変更はないように見えるが、細かいところで変更は入っているようなので、今後使いながら確認していきたい。


人気の投稿