これを行うには、/ etc / munin / munin.confファイルに連絡先を作成し、この連絡先のparameters \ディレクティブを定義します。 これは次のように行われます。
contacts someuser
contact.someuser.command mail -s "Munin notification" somejuser@fnord.comm
contact.someuser.always_send warning critical
この構成は、連絡先someuserを作成し、そのための通知送信コマンド(この場合はmailコマンド)と、どの通知を送信するか( 警告 \警告およびクリティカル \クリティカル)を発行することを意味します。
なぜなら Muninは5分ごとに情報を収集し、5分ごとに通知(たとえば、ディスク容量不足、df_プラグイン)が送信されます。 理論的には、
contact.contact.max_messages number
というディレクティブがあり
contact.contact.max_messages number
。これは、理解しているように、「警告/クリティカル」イベントの最大通知数を設定する必要があります。 こちらのディレクティブのリストをご覧ください。
この機能は役に立たなかったため、この状況を解決する独自のスクリプトを作成する必要がありました。
また、
contact.someuser.command
ディレクティブを使用すると、メッセージを送信するときに実際の値の代わりに使用される特別な変数を使用できます。 ここに変数のリスト。
このすべてを見てみましょう。 必須:2人のユーザーに通知を送信します。 最初のユーザーは、重大なメッセージと警告メッセージの両方を受け取る必要があります。 2番目は重要です。
/etc/munin/munin.confを開き、連絡先を作成します。
contacts user1 user2
contact.user1.command mail_send_mutt user1mail@gmail.com "Munin notification ${var:host}" "[${var:group};${var:host}] -> ${var:graph_title}: warnings: ${loop<,>:wfields ${var:label}=${var:value}}; criticals: ${loop<,>:cfields ${var:label}=${var:value}}"
contact.user1.always_send warning critical
contact.user2.command mail_send_mutt user2mail@yandex.ru "Munin notification ${var:host}" "[${var:group};${var:host}] -> ${var:graph_title}: warnings: ${loop<,>:wfields ${var:label}=${var:value}}; criticals: ${loop<,>:cfields ${var:label}=${var:value}}"
contact.user2.always_send critical
ここでは、3つの入力パラメーターを取るスクリプトmail_send_muttを使用しました。
1.ユーザーのメール
2.投稿タイトル
3.メッセージテキスト
レターを送信するには、muttコンソールメールクライアントが使用されます。 迅速かつ確実に機能し、追加の設定は必要ありません。
スクリプトテキスト:
#!/bin/bash
# mutt
# :
# 1.
# 2.
# 3.
# -,
# .
# ,
# . " "
email=$1
theme="$2"
ptext="\"$3\""
# : 0 - , 1 - , 2 - .
type_out=0
# .
function out_text () {
dbg_logfile="/var/log/munin/send_mess.log"
if ! test -e "$dbg_logfile"
then
cat "" > "$dbg_logfile"
fi
case $type_out in
1) echo "$1" ;;
2) echo "$1" >> $dbg_logfile ;;
*)
esac
}
#
var_path="/var/log/munin"
# . $email
logfile=""
# ,
if ! test -e "$var_path"
then
mkdir -p $var_path
fi
#
if test -z $email
then
out_text " !"
exit
fi
if test -z "$theme"
then
theme="null"
fi
if test -z "$ptext"
then
ptext="null"
fi
# - $email
#logfile=${email/@/_}
logfile=$var_path"/"${email/@/_}
# , . -
if ! test -e "$logfile"
then
cat "" > "$logfile"
fi
# ,
#
str_found=0
# .
dpos=0
# ,
tdate=""
tmail=""
ttext=""
#
FS="|"
#
FS_d='.'
#
curr_date=$(date +%Y-%m-%d)
out_text "Current date: \"$curr_date\""
# ,
while read fstr
do
# 3 : , e-mail,
# "|"
out_text "str_found begin: $str_found"
out_text "Find symbol: "$FS "; STR:" "$fstr"
dpos=`expr index "$fstr" $FS`
out_text "dpos: $dpos"
tdate=`expr substr "$fstr" 1 $dpos`
fstr=${fstr/$tdate/}
tdate=${tdate/$FS/}
out_text "NEW STR:" "$fstr"
dpos=`expr index "$fstr" $FS`
tmail=`expr substr "$fstr" 1 $dpos`
ttext=${fstr/$tmail/}
tmail=${tmail/$FS/}
dpos=`expr index "$tdate" $FS_d`
let "dpos-=1"
tdate=`expr substr "$tdate" 1 $dpos`
out_text "date: \"$tdate\""
out_text "email: $tmail"
out_text "ttext: $ttext"
out_text "ptext: $ptext"
out_text "------------------------------------------------------"
# ,
if [ "$ptext" == "$ttext" ]
then
#
# , . ( )
out_text "Text EQ found!"
if [ "$tdate" == "$curr_date" ]
then
out_text "Date EQ found!"
let "str_found+=1"
fi
fi
out_text "str_found end: $str_found"
out_text "------------------------------------------------------"
done < "$logfile" #
out_text "str_found: $str_found"
if [ 0 -lt "$str_found" ]
then
out_text " !"
exit
fi
#
echo "$ptext" | mutt $email -s "$theme"
# , ,
echo "$(date +%Y-%m-%d.%H-%M)|$email|$ptext" >> $logfile
デバッグ情報の出力だけでなく、すべてのコメントをスクリプトに残しました。 たぶん誰かがするでしょう。 デフォルトでは、メッセージ出力は無効になっています。 スクリプトを改善する方法についてアイデアをお持ちの方がいらっしゃいましたら、訂正させていただきます。
たとえば、次のような設計があります。
while IFS=: read name passwd uid gid fullname ignore
do
echo "$name ($fullname)"
done </etc/passwd # .
ログファイルを読み取って既に送信されたメッセージを表示するサイクルは、次のようにやり直すことができるようです。
while FS=| read tdate tmail ttext
do
.....
done < "$logfile"
しかし、何らかの理由で、説明どおりに動作しません:(