ラベル Zabbix の投稿を表示しています。 すべての投稿を表示
ラベル Zabbix の投稿を表示しています。 すべての投稿を表示
2024年8月11日日曜日

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 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に変更
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月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-pgsql zabbix-web-pgsql 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からインタフェースに劇的な変更はないように見えるが、細かいところで変更は入っているようなので、今後使いながら確認していきたい。


2023年12月23日土曜日

UbuntuにZabbix Agent 2をインストールする手順

Zabbix Agentは過去のバージョンから利用されているZabbix Agentとは別に、新たにGo言語ベースで作り直されたZabbix Agent 2が存在する。

過去Windows環境にZabbix Agent 2をインストールする手順は記載した。

今回は、Ubuntuに対してZabbix Agent 2をインストールする手順を記載する。

環境

導入対象となるOSとZabbixのバージョンは以下の通り。

  • OS : Ubuntu 22.04.2 LTS
  • Zabbix Agent 2 : 6.0

Ubuntuは初期状態ではcurlコマンドが使えない場合があるので、その場合は以下の通りインストールをしておくこと。

$ sudo apt install curl

手順

1. zabbix-releaseをインストール

以下URLから最新のzabbix-releaseのパッケージファイルのURLを確認する。

バージョン URL
6.0 https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/
6.2 https://repo.zabbix.com/zabbix/6.2/ubuntu/pool/main/z/zabbix-release/
6.4 https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/

今回の場合は、Ubuntu 22.04.2 LTSに対して、Zabbix 6.0のエージェントをインストールすることから、https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest%2Bubuntu22.04_all.debcurlを使ってダウンロードしてインストールする。

$ curl -LO https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest%2Bubuntu22.04_all.deb
$ sudo dpkg -i zabbix-release_latest%2Bubuntu22.04_all.deb
以前に未選択のパッケージ zabbix-release を選択しています。
(データベースを読み込んでいます ... 現在 204627 個のファイルとディレクトリがインストールされています。)
zabbix-release_latest%2Bubuntu22.04_all.deb を展開する準備をしています ...
zabbix-release (1:6.0-4+ubuntu22.04) を展開しています...
zabbix-release (1:6.0-4+ubuntu22.04) を設定しています ...

$ sudo apt update

2. Zabbix Agnet 2をインストール

$ apt search zabbix-agent
ソート中... 完了
全文検索... 完了
pcp-export-zabbix-agent/jammy 5.3.6-1build1 amd64
  Module for exporting PCP metrics to Zabbix agent

zabbix-agent/jammy 1:6.0.25-1+ubuntu22.04 amd64
  Zabbix network monitoring solution - agent

zabbix-agent-dbgsym/jammy 1:6.0.25-1+ubuntu22.04 amd64
  debug symbols for zabbix-agent

zabbix-agent2/jammy 1:6.0.25-1+ubuntu22.04 amd64
  Zabbix network monitoring solution - agent

zabbix-agent2-dbgsym/jammy 1:6.0.25-1+ubuntu22.04 amd64
  debug symbols for zabbix-agent2

zabbix-agent2-plugin-mongodb/jammy 1:6.0.25-1+ubuntu22.04 amd64
  Zabbix Agent2 plugin for monitoring MongoDB installations

zabbix-agent2-plugin-postgresql/jammy 1:6.0.25-2+ubuntu22.04 amd64
  Zabbix Agent2 plugin for monitoring PostgreSQL installations
$ sudo apt install zabbix-agent2

$ systemctl status zabbix-agent2
● zabbix-agent2.service - Zabbix Agent 2
     Loaded: loaded (/lib/systemd/system/zabbix-agent2.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-12-16 20:34:53 JST; 25s ago
   Main PID: 4798 (zabbix_agent2)
      Tasks: 10 (limit: 4599)
     Memory: 4.5M
        CPU: 21ms
     CGroup: /system.slice/zabbix-agent2.service
             mq4798 /usr/sbin/zabbix_agent2 -c /etc/zabbix/zabbix_agent2.conf

12月 16 20:34:53 t1082ubnt systemd[1]: Started Zabbix Agent 2.
12月 16 20:34:53 t1082ubnt zabbix_agent2[4798]: Starting Zabbix Agent 2 (6.0.25)
12月 16 20:34:53 t1082ubnt zabbix_agent2[4798]: Zabbix Agent2 hostname: [Zabbix server]
12月 16 20:34:53 t1082ubnt zabbix_agent2[4798]: Press Ctrl+C to exit.

3. 設定ファイルを修正

/etc/zabbix/zabbix_agent2.confのファイルを修正し、Zabbix Serverと疎通できるようにする。最低限以下の通り設定すれば動作する。

Server=[Zabbix ServerのIPアドレス]
ServerActive=[Zabbix ServerのIPアドレス]
Hostname=[Ubuntuのホスト名]

設定反映のため、Zabbix Agent 2を再起動する。

$ sudo systemctl restart zabbix-agent2

以上で、Ubuntuに対してZabbix Agent 2をインストールする手順は完了となる。

2023年6月25日日曜日

AnsibleでZabbixを操作する (Ansible 8.1 [core 2.15]対応)

自宅ではAnsibleを導入してから、以下OSやソフトウェアに対して作業のコード化や自動化を行ってきた。導入手順などは以下記事を参照。

OS/ソフトウェア URL
Linux AnsibleでLinuxサーバの初期設定と単体テストを行う
Windows Server AnsibleからWindows Serverに接続するための事前作業
vSphere ESXi AnsibleでESXi上に仮想マシンを構築する

今回は、Ansibleを使ってZabbixを操作するための手順を記載する。Zabbixはcommunity.zabbixというモジュールで操作可能となる。

環境

今回手順を確認した環境は以下の通り。

  • コントロールノード
    • OS : AlmaLinux 8.5
    • Ansible : 8.1.0 [core 2.15.1]
  • Zabbix : 6.0.17

AnsibleでZabbixを操作する場合は、事前にzabbix-apiのPythonパッケージをインストールする必要があるため、pipコマンドを使って以下の通りインストールしておこう。

# pip3 install zabbix-api

Zabbixのメンテナンス期間を作成するPlaybook

community.zabbixは、Zabbix設定のための各種モジュールが提供されている。設定したい内容に応じて、以下URLより必要なモジュールを探して利用しよう。

今回は、シンプルにZabbixの「メンテナンス期間」を作成するだけのPlaybookを作成した。

以下にPlaybookの内容を説明する。

Playbook説明

変数 (vars)

Ansibleを使ってZabbixを操作する場合、ansible_useransible_passwordではなくZabbixのログインユーザ情報とパスワードの指定が常に必要となる。それ以外の設定値の変数は、使用するZabbixモジュールに応じて追加が必要となる。

変数 設定値
ansible_user Zabbixのログインユーザを指定。今回はAdminを指定する。
ansible_httpapi_pass Zabbixのログインユーザのパスワードを指定する。
ansible_network_os community.zabbix.zabbix
ansible_connection httpapi
ansible_httpapi_port 今回はZabbixサーバはHTTPアクセスによる構成としていることから、80を指定する。
ansible_zabbix_url_path Zabbixサーバにアクセスする際のURLのパスを記載する。具体的には、http://[ZabbixサーバのIPアドレス]/[パス][パス]に記載の文字列を指定すればよく、通常はzabbixとなるはずだ。
ansible_host ZabbixサーバのIPアドレスを指定する。
zabbix_maintenance.name 「メンテナンス期間」に使用する名前を指定する。
zabbix_maintenance.host_name 「メンテナンス期間」で指定する監視対象ホストを指定する。
zabbix_maintenance.minutes 「メンテナンス期間」の期間を指定する。今回は「30分」を指定する。

タスク (tasks)

今回のPlaybookのタスクは、以下1個のみとなる。

タスク モジュール 説明
メンテナンス期間作成 zabbix_maintenance メンテナンス期間を作成する。「有効期間の開始日時」はタスク実行時間となり、「有効期間の終了日時」はminutesに設定した時間経過後となるため、今回は30分後となる。例えば、Ansibleを5:00に実行した場合は、5:30がメンテナンス期間の終了日時となる。

Playbook

以上をふまえ、Playbook全体は以下となる。

set_zabbix_maintenance.yml

---
- name: Set zabbix maintenance
  gather_facts: true
  hosts: zabbix_servers

  vars:
    ansible_user: Admin
    ansible_httpapi_pass: zabbix
    ansible_network_os: community.zabbix.zabbix
    ansible_connection: httpapi
    ansible_httpapi_port: 80
    ansible_zabbix_url_path: zabbix
    ansible_host: 192.168.11.24

    zabbix_maintenance:
      name: Test maintenance
      host_name: Zabbix server
      minutes: 30

  tasks:
    - name: Enable maintenance
      community.zabbix.zabbix_maintenance:
        name: "{{ zabbix_maintenance.name }}"
        host_name: "{{ zabbix_maintenance.host_name }}"
        minutes: "{{ zabbix_maintenance.minutes }}"
        collect_data: true
        state: present

実行結果

Playbookの実行結果は以下の通り。

# ansible-playbook -i hosts zabbix/set_zabbix_maintenance.yml 

PLAY [Get zabbix info] *********************************************************************************************

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

TASK [Enable maintenance] ******************************************************************************************
changed: [t1024cent]

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

Zabbixの管理画面からも、メンテナンス期間が作成されたことが確認できた。22:40にAnsibleを実行したため、メンテナンス期間の終了日時は30分後の23:10となっていることがわかる。

以上で、Ansibleを使ってZabbixを操作するための手順は完了となる。

更新履歴

  • 2023/4/22 新規作成
  • 2023/6/25 Ansibleバージョンを6.0.0 -> 8.1.0へバージョンアップしたことに伴い記載を更新

2023年6月3日土曜日

Windows用Zabbix Agent 2をmsiexecコマンドを使ってサイレントインストールする

先日、Windows用Zabbix Agent 2をMSIインストーラのウィザードに従ってGUIでインストールする手順を記事にした。

そこまで多くの設定が必要ではないとはいえ、GUIで設定することも手間となる。幸いMSIインストーラはmsiexecというコマンドを使えば、ウィザードを使わずにサイレントインストールをさせることができる。

本記事では、Windows用Zabbix Agent 2をmsiexecコマンドを使ってサイレントインストールする手順を記載する。また、Ansibleを使ってZabbix Agentを自動インストールするPlaybookを作ってみたので紹介する。

環境

  • Zabbix Server : 6.0.17
  • 監視対象OS : Windows Server 2022
  • Zabbix Agent 2バージョン : 6.0.17

Zabbix Agentサイレントインストール手順

1. Zabbix Agent 2のダウンロード

Zabbix Agent 2は以下URLからダウンロードできる。

今回は、以下の通り、Zabbix 6.0用のエージェントを指定する。

項目 設定値
OS DISTRIBUTION Windows
OS VERSION Any
HARDWARE amd64
ZABBIX VERSION 6.0 LTS
ENCRYPTION OpenSSL
PACKAGING MSI

図11

指定すると、従来のZabbix AgentとZabbix Agent 2の二種類が表示されるので、Zabbix Agent 2のMSIインストーラをダウンロードする。

2. コマンドプロンプトを「管理者として実行」で起動

コマンドプロンプトを「管理者として実行」で起動する。

3. msiexecコマンドにてインストールを実行

以下の通り、実行する。コマンドプロンプトでは行末に^を付与するとコマンドの改行ができる。今回は見やすくするため改行を入れているが、一行で記述しても当然実行できる。

msiexec /l*v log.txt^
        /i zabbix_agent2-x.x.x-windows-amd64-openssl.msi /qn^
        HOSTNAME=[Zabbixに登録したホスト名]^
        SERVER=[Zabbix ServerのIPアドレス]^
        SERVERACTIVE=[Zabbix ServerのIPアドレス]

以下実行例となる。サイレントインストールとなるため、実行結果は何も表示されない。

C:\work> msiexec /l*v log.txt^
/i zabbix_agent2-6.0.17-windows-amd64-openssl.msi /qn^
HOSTNAME=test-server^
SERVER=192.168.1.1^
SERVERACTIVE=192.168.1.1

インストールが問題なくされているか不安な場合は、「コントロールパネル」→「プログラムと機能」にZabbix Agentが存在することを確認しよう。

AnsibleでZabbix Agentを自動インストールするPlaybook

Playbookの説明は以下の通り。Zabbix Agentがインストールされているかどうかチェックしたのち、MSIインストーラをコピーしてサイレントインストールする、シンプルなPlaybookとなる。

タスク名 モジュール 説明
Check zabbix agent installation status win_shell PowerShellでGet-WmiObject Win32_Productを実行し、Zabbix Agnetのインストール状況を確認する。
Copy zabbix agent file win_copy Zabbix Agnetがインストールされていない場合、Zabbix AgentのMSIインストーラファイルをコピーする。
Install zabbix agent win_command msiexecにてZabbix Agentをサイレントインストールする。

実際のPlaybookを以下に記載する。

---
- name: Install windows zabbix agent
  gather_facts: true
  hosts: windows_servers

  vars:
    ansible_user: ansibleuser
    ansible_password: XXXXXXXX
    ansible_port: 5986
    ansible_connection: winrm
    ansible_winrm_server_cert_validation: ignore

    zabbix_agent:
      server: 192.168.1.1
      name: zabbix_agent2-6.0.17-windows-amd64-openssl.msi
      logname: log_install_zabbix_agent.log

  tasks:
    # インストール確認
    - name: Check zabbix agent installation status
      ansible.windows.win_shell: |
        Get-WmiObject Win32_Product | Where-Object { $_.Name -like "Zabbix Agent*" }
      changed_when: false
      register: result_check

    # ファイルコピー
    - name: Copy zabbix agent file
      ansible.windows.win_copy:
        src: /ansible_mnt/
        dest: C:\Temp
      when: result_check.stdout == ""

    # インストール実行
    - name: Install zabbix agent
      ansible.windows.win_command: |
        C:\Windows\System32\msiexec.exe /l*v C:\Temp\{{ zabbix_agent.logname }} /i C:\Temp\{{ zabbix_agent.name }} /qn^
          HOSTNAME={{ inventory_hostname }} SERVER={{ zabbix_agent.server }} SERVERACTIVE={{ zabbix_agent.server }}
      changed_when: true
      register: result
      when: result_check.stdout == ""

以上で、Windows用Zabbix Agent 2をmsiexecコマンドを使ってサイレントインストールする手順は完了となる。

参考

2023年5月27日土曜日

Windows用Zabbix Agent 2インストール手順

Zabbixは監視対象OSにZabbix Agentと呼ばれるエージェントを導入することで、CPUやメモリの使用率を取得やログの監視をするなどの監視を実現することができる。

Zabbix Agentは、新しくGo言語で開発された「Zabbix Agent 2」という新バージョンが存在する。以前のZabbix Agentとの違いは以下公式マニュアルに記載があるが、これから新しく監視対象を追加する場合は、基本的にZabbix Agent 2を選択した方がよいだろう。

本記事では、Windows用Zabbix Agent 2インストール手順を記載する。以前(Zabbix 3.0や4.0の時代)は手作業でZabbix Agentのバイナリを配置してサービスへの登録やWindowsファイアウォールの設定などが必要だったが、現在はMSIによるインストーラ形式で公開されており、インストールは非常に楽になっていた。

環境

  • Zabbix Server : 6.0.17
  • 監視対象OS : Windows Server 2022
  • Zabbix Agent 2バージョン : 6.0.17

Windows用Zabbix Agent 2インストール手順

1. Zabbix Agent 2のダウンロード

Zabbix Agent 2は以下URLからダウンロードできる。

今回は、以下の通り、Zabbix 6.0用のエージェントを指定する。

項目 設定値
OS DISTRIBUTION Windows
OS VERSION Any
HARDWARE amd64
ZABBIX VERSION 6.0 LTS
ENCRYPTION OpenSSL
PACKAGING MSI

指定すると、従来のZabbix AgentとZabbix Agent 2の二種類が表示されるので、Zabbix Agent 2のMSIインストーラをダウンロードする。

2. インストールウィザード実行

ダウンロードしたMSIインストーラは、そのままダブルクリックして実行すれば、インストールウィザードが起動する。

インストールウィザードでは複雑な設定はないため画面は割愛するが、最低限、自身のホスト名やZabbix ServerのIPアドレスを指定すればよい。

画面 操作説明
Welcome to Zabbix Agent 2 Setup Wizard そのまま「Next」を選択。
End-User License Agreement 同意のチェックボックスにチェックし、「Next」を選択。
Custom Setup そのまま「Next」を選択。
Zabbix Agent 2 service configuration ここでは、監視対象OSのホスト名、Zabbix ServerのDNS名/IPアドレス、ポート番号、アクティブチェック時のZabbix ServerのDNS名/IPアドレスなどを指定する。ホスト名は、Windowsのコンピューター名から自動的に入力がされているが、すべて英大文字になっている注意する。Zabbix Serverで登録しているホスト名と大文字・小文字が一致していない場合、監視が正常に動作しない場合があるため、その場合は小文字に修正してインストールを進めよう。
Ready to install Zabbix Agent 2 そのまま「Install」を選択。

インストールが終わると、Zabbix Agent 2はサービス登録され自動起動される。

また、Windowsファイアウォールの受信の規則において、「Zabbix Agent 2 listen port」というルールが追加され、Zabbix Serverからの通信を受け付けるようになっている。

3. Zabbix Serverでホスト登録を行い疎通できることを確認

Zabbix Serverで監視対象のWindows OSのホスト登録を行い、「Windows by Zabbix agent」のテンプレートを適用してみよう。しばらくしてエージェントの状態が緑表示になれば、問題なくZabbix ServerとZabbix Agent 2間で疎通が取れていることになる。

以上で、Windows用Zabbix Agent 2インストール手順は完了となる。

2022年5月14日土曜日

サービス監視スクリプト (Windows版)

サーバーのプロセス監視 (Windowsの場合はサービス監視) は、監視ソフトウェア(ZabbixやJP1など)を使えば当たり前のように実現できる。ただし、環境やライセンスの関係でエージェントの導入ができない場合がある。

そのような場合でも、スクリプトを使ってプロセス監視 (サービス監視) を行うことは可能となる。

今回、Windowsのサービス監視を行うスクリプトを作ってみたので、その内容を記載する。

なお、Linuxのプロセス監視のスクリプトについては、以下記事を参照いただきたい。

実現方法

本スクリプトの設計概要を図示する。

このスクリプトは、確認対象のサービスを設定ファイル(check-service.conf)に記載しておき、Get-ServiceコマンドレットにてサービスがRunningステータスであるかどうかを確認する。

サービスダウンを検知した際は、Write-EventLogコマンドレットでApplicationイベントログにエラーメッセージを出力する。エラーメッセージ出力タイミングは、サービスダウンの初回発生時のみとし、それ以外は情報メッセージとして出力する。

以下に、本スクリプトで発生するメッセージを記載する。

サービス状態 メッセージ
正常時 [INFO] Service XXX up
正常状態継続時 [INFO] Service XXX still up
ダウン時 [ERROR] Service XXX down
ダウン状態継続時 [INFO] Service XXX still down

この処理をタスクスケジューラーで1分間隔で実行するよう登録し、定期的なサービス監視を実現する。

スクリプト実行手順

1. スクリプト実行前にイベントソースを登録

Windowsイベントログにイベントを出力する際に、事前にイベントソースの登録が必要となる。事前に管理者権限でPowerShellのプロンプトを開き、以下コマンドを実行しておくこと。

PS C:\> New-EventLog -LogName Application -Source "Service Check Script"

なお、イベントソースの登録削除は、以下のコマンドとなる。

PS C:\> Remove-EventLog -Source "Service Check Script"

2. スクリプト配置

以下にスクリプトのコードを記載する。GitHubにも配置してある。

スクリプトファイル:check-service.ps1

################
# Scripts name : check-service.ps1
# Usage        : ./check-service.ps1
#                同一ディレクトリにcheck-service.confを配置し、タスクスケジューラーで定期実行する。
#                事前にAdmin権限で以下コマンドをを実行すること。
#                New-EventLog -LogName Application -Source "Service Check Script"
# Description  : Windowsサービスチェックスクリプト
# Create       : 2022/05/02 tech-mmmm (https://tech-mmmm.blogspot.com/)
# Modify       : 
################

$currentdir = Split-Path -Parent $MyInvocation.MyCommand.Path
$conffile = $currentdir + "\check-service.conf"    # 設定ファイル
$tmpfile = $currentdir + "\check-service.tmp"      # サービス情報保存用一時ファイル
$event_source = "Service Check Script"             # スクリプトソース名

# すでにDownしているサービス情報を取得
if ( Test-Path -Path $tmpfile ){
    $down_service = Get-Content $tmpfile
}
Write-Output $null | Out-File $tmpfile

# 設定ファイル読み込み
foreach ($line in (Get-Content $conffile)) {   
    # コメント行と空行を処理しない
    if ( $line -notmatch "^ *#|^$" ){
        # 現在のサービス数を取得
        $count = (Get-Service -Name $line | Where-Object { $_.Status -eq "Running" }).count
        
        # サービス数チェック
        if ( $count -lt 1 ){
            # Down時の処理
            # Downしているサービスか確認
            if ( $down_service -eq $line ){
                # すでにDown
                $message = "Service """ + $line + """ still down"
                $event_type = "Information"
            }else{
                # 初回Down
                $message = "Service """ + $line + """ down"
                $event_type = "Error"
            }
            
            # イベントログに出力
            Write-Output $message
            Write-EventLog -LogName Application -EntryType $event_type -Source $event_source -EventId 100 -Message $message

            # Donwしているサービス情報を出力
            Write-Output $line | Out-File -Append $tmpfile
        }else{
            # Up時の処理
            # Downしていたサービスか確認
            if ( $down_service -eq $line ){
                # Downだった
                $message = "Service """ + $line + """ up"
                $event_type = "Information"                
            }else{
                # すでにUp
                $message = "Service """ + $line + """ still up"
                $event_type = "Information"
            }

            # イベントログに出力
            Write-Output $message
            Write-EventLog -LogName Application -EntryType $event_type -Source $event_source -EventId 100 -Message $message
        }
    }
}

exit 0

設定ファイル例:check-service.conf

# Service mame
Netlogon
W32Time
VMTools

3. タスクスケジューラーへの登録

タスクスケジューラーにて本スクリプトを1分間隔で実行するように設定する。こちらの方法については、以下別記事を参照いただきたい。

4. 監視テスト

実際にサービスを停止させて動作確認をしてみよう。W32Timeを停止させてサービス停止を検知することを確認してみる。

PS C:\> Stop-Service -Name W32Time
PS C:\> Get-EventLog -LogName Application -Source "Service Check Script"

   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
   12652 5 03 06:27    Information Service Check Script          100 Service "VMTools" still up
   12651 5 03 06:27    Error       Service Check Script          100 Service "W32Time" down  ★停止を検知
   12650 5 03 06:27    Information Service Check Script          100 Service "Netlogon" still up
~(以下略)~

次に、復旧時の動作を確認する。

PS C:\> Start-Service -Name W32Time
PS C:\> Get-EventLog -LogName Application -Source "Service Check Script"

   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
   12655 5 03 06:29    Information Service Check Script          100 Service "VMTools" still up
   12654 5 03 06:29    Information Service Check Script          100 Service "W32Time" up ★復旧
   12653 5 03 06:29    Information Service Check Script          100 Service "Netlogon" still up
~(以下略)~

以上。

更新履歴

  • 2017/12/18 新規作成
  • 2022/05/14 全体的にスクリプトの構成を見直し
2022年5月7日土曜日

プロセス監視スクリプト (Linux版)

サーバーのプロセス監視は、監視ソフトウェア(ZabbixやJP1など)を使えば当たり前のように実現できる。ただし、環境やライセンスの関係でエージェントの導入ができない場合がある。

そのような場合でも、スクリプトを使ってプロセス監視を行うことは可能となる。ログに出力さえできれば、Linuxの場合はrsyslogなどでログを別のサーバに転送でき、そのサーバで監視させるといったことも可能である。

今回は、Linuxのプロセス監視を行うスクリプトを作ってみたので、その内容を記載する。

実現方法

本スクリプトの設計概要を図示する。

このスクリプトは、設定ファイル(check-process.conf)に監視対象のプロセス及び起動プロセス数を記載しておき、psコマンドにて監視対象の起動プロセス数を確認する。

プロセスダウンを検知した際は、loggerコマンドで/var/log/messagesにエラーメッセージを出力する。エラーメッセージ出力タイミングは、プロセスダウンの初回発生時のみとし、それ以外は情報メッセージとして出力する。

以下に、本スクリプトで発生するメッセージを記載する。

プロセス状態 メッセージ
正常時 [INFO] Process XXX up
正常状態継続時 [INFO] Process XXX still up
ダウン時 [ERROR] Process XXX down
ダウン状態継続時 [INFO] Process XXX still down

この処理をcronで1分間隔で実行するよう登録し、定期的なプロセス監視を実現する。

スクリプト実行手順

1. スクリプト配置

以下にスクリプトのコードを記載する。GitHubにも配置してある。

スクリプト本体:check-process.sh

#!/bin/bash
################
# Scripts name : check-process.sh
# Usage        : ./check-process.sh
#                同一ディレクトリにcheck-process.confを配置し、cronで定期実行する。
# Description  : Linuxプロセスチェックスクリプト
# Create       : 2017/12/14 tech-mmmm (https://tech-mmmm.blogspot.com/)
# Modify       : 2022/05/01 tech-mmmm (https://tech-mmmm.blogspot.com/)
################

currentdir="$(dirname "$0")"
conffile="${currentdir}/check-process.conf"    # 設定ファイル
tmpfile="${currentdir}/check-process.tmp"      # プロセス情報保存用一時ファイル

# すでにDownしているプロセス情報を取得
if [ -f "${tmpfile}" ]; then
    down_process=$(paste -d "|" -s "${tmpfile}")
fi
echo -n > "${tmpfile}"

# 設定ファイル読み込み
while read line || [ -n "${line}" ]; do
    # 空白区切りで分割
    process_name=$(echo "${line}" | awk '{print $1}')
    process_num=$(echo "${line}" | awk '{print $2}')
    
    # コメント行と空行を処理しない
    if [ "$(echo "${process_name}" | grep -c -v -e '^ *#' -e '^$')" -gt 0 ]; then      
        # 現在のプロセス数を取得
        count=$(ps ahxo args | grep "${process_name}" | grep -c -v -e "^grep")
        
        # プロセス数チェック
        if [ "${count}" -lt "${process_num}" ]; then
            # Down時の処理
            # すでにDownしているプロセスか確認
            if [ -n "${down_process}" ] && [ "$(echo ${process_name} | grep -c -E ${down_process})" -gt 0 ]; then
                # すでにDown
                message="[INFO] Process \"${process_name}\" still down"
            else
                # 初回Down
                message="[ERROR] Process \"${process_name}\" down"
            fi
            # ログへ出力
            echo "${message}"
            logger "${message}"
            
            # Donwしているプロセス情報を出力
            echo "${process_name}" >> "${tmpfile}"
        else
            # Up時の処理
            # Downしていたプロセスか確認
            if [ -n "${down_process}" ] && [ "$(echo ${process_name} | grep -c -E ${down_process})" -gt 0 ]; then
                # Downだった
                message="[INFO] Process \"${process_name}\" up"
            else
                # すでにUp
                message="[INFO] Process \"${process_name}\" still up"
            fi
            # ログへ出力
            echo "${message}"
            logger "${message}"
        fi
    fi
done < "${conffile}"

exit 0

設定ファイル例:check-process.conf

# Process mame Number of process
/usr/sbin/chronyd 1
/usr/sbin/httpd 5

2. cronへの登録

スクリプトを/root/scriptディレクトリに配置した場合を例として、1分間隔で監視させるようcronを以下のように設定する。

# crontab -e
*/1 * * * * /root/script/check-process.sh

3. 監視テスト

実際にプロセスを停止させて動作確認をしてみよう。httpdを停止させてプロセス停止を検知することを確認してみる。

# systemctl stop httpd
# tail -10 /var/log/messages | grep -E "INFO|ERROR"
May  1 15:12:07 t1192rhel root[76941]: [INFO] Process "/usr/sbin/chronyd" still up
May  1 15:12:07 t1192rhel root[76955]: [ERROR] Process "/usr/sbin/httpd" down ★停止を検知

次に、復旧時の動作を確認する。

# systemctl start httpd
# tail -10 /var/log/messages | grep -E "INFO|ERROR"
May  1 15:12:07 t1192rhel root[76941]: [INFO] Process "/usr/sbin/chronyd" still up
May  1 15:12:07 t1192rhel root[76955]: [ERROR] Process "/usr/sbin/httpd" down
May  1 15:13:46 t1192rhel root[77291]: [INFO] Process "/usr/sbin/chronyd" still up
May  1 15:13:46 t1192rhel root[77308]: [INFO] Process "/usr/sbin/httpd" up ★復旧

以上。

更新履歴

  • 2017/12/16 新規作成
  • 2022/05/07 全体的にスクリプトの構成を見直し

人気の投稿