首先主要思路是通过中控的机器来发送监控的细节,然后返回结果。
![](http://img.blog.itpub.net/blog/attachment/201601/16/23718752_1452956337GK55.png?x-oss-process=style/bb)
首先就是我们需要有一个服务器列表,里面会有这些需要的元数据信息。
比如列表如下:
192.127.133.13 某某服务中心主库 jeanron Primary Linux Oracle N xxx
192.127.133.12 某某服务备库 jeanron Standby Linux Oracle N xxxx
192.127.133.18 某某业务主库 jeanron Primary Linux Oracle N xxxx
192.127.133.52 某某业务备库 jeanron Primary Linux Oracle N xxxx
通过这个列表就可以开始分析了。脚本实现内容如下:
. ~/.bash_profile > /dev/null
BASEDIR="/home/hardcheck"
mkdir -p ${BASEDIR}/{tmplog,log} && cd ${BASEDIR}
DATE=`date +%Y%m%d%H%M`
LOG="hardcheck_${DATE}.log"
TMP_SCRIPT="hardcheck_${DATE}.sh"
exec 3>&1 4>&2 1>$LOG 2>&1
### 将服务器列表作为参数传递进来,为了考虑字符兼容性,统一采用utf8来处理
SERVERLIST=$1
if [ -z "${SERVERLIST}" ] || [ ! -s "${SERVERLIST}" ] ; then
cat /home/jeanron/alldbserver-linux.txt|iconv -f GBK -t UTF8|grep jeanron|grep -v Solaris|grep -v nopingdb|grep -v "#1"> db_list.all.lst
SERVERLIST=$BASEDIR/db_list.all.lst
fi
SSH="ssh -oConnectionAttempts=3 -oConnectTimeout=5 -oStrictHostKeyChecking=no"
echo "#start hardcheck"
### {{{ 以下为真正的hardcheck检查,远程调用
while read line
do
tmp_host=`echo $line|egrep -iv '^$|^#|Solaris|AIX'` --排除solaris,AIX的检测
IP=`echo $tmp_host|awk '{print $1}'`
DB=`echo $tmp_host|awk '{print $2}'`
OWNER=`echo $tmp_host|awk '{print $3}'`
STD_TYPE=`echo $tmp_host|awk '{print $4}'`
DB_TYPE=`echo $tmp_host|awk '{print $6}'`
ILO_INFO=`echo $tmp_host|awk '{print $8}'`
echo "echo \"$IP;$DB;$OWNER;$STD_TYPE;$DB_TYPE;$ILO_INFO\"" >> $TMP_SCRIPT
echo "${SSH} $IP \"/opt/MegaRAID/MegaCli/MegaCli64 -CfgDsply -a0|grep Error;/opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL|grep Firmware|grep -v Level|grep -v Up|grep -v Online \" " >>$TMP_SCRIPT
done < ${SERVERLIST}
### }}}
### {{{ 邮件报警
sh $TMP_SCRIPT |tee $LOG |grep -v "Error Count: 0"| grep -v \;\;\;\;\;> mail.txt
MAILTO="jeanron100@hotmail.com"
/bin/bash $BASEDIR/beautymail.sh -t "DBIP;DB用途;负责人;主备库;数据库类型;ILO信息" -m ${MAILTO} -s "Disk Error Count Health Daily Check(${DATE})" ${BASEDIR}/mail.txt
里面有几个地方可以改进一下,对于命令的报告形式,发现还是有一个脚本非常不错,beautymail.sh
内容如下,对于格式美化还是非常给力的,我们只需要输入一个基本格式的数据,就会输出一个格式化后的结果内容,非常给力。
输出的结果类似下面的效果。
![](http://img.blog.itpub.net/blog/attachment/201601/16/23718752_1452958447Shas.jpg?x-oss-process=style/bb)
脚本内容如下,当然也是参考了很多的出处,我只是引用一下。
source /etc/profile > /dev/null
. ~/.bash_profile > /dev/null
title=''
topline=""
html='/tmp/info.html'
mail='jeanron100@hotmail.com'
subject='【报警输出优化】Test'
while getopts "a:T:t:H:m:s:h" Option
do
case $Option in
a) addfile="$OPTARG";;
T) title="$OPTARG";;
t) topline="$OPTARG";;
H) html="$OPTARG";;
m) mail="$OPTARG";;
s) subject="$OPTARG";;
h)
echo -e "beautymail V2.0 copyright To make your mail more human-readable\n\
Usage: beautymail [-a addfile] [-T title-in-mail] [-t topline] [-H html-location] [-m mail-addr] [-s subject] content-file\n\
Options:
-a: 设置邮件里加附件,addfile需要附件的绝对路径
-T: 设置邮件里表格上方的说明文字
-t: 设置表格中首行,即各列的含义,如-t \" 日志类型;日志量;文件数 \", 注意是用英文分号隔开的多列
-m: 指定收件人
-s: 邮件主题
"
exit
esac
done
shift $(($OPTIND - 1))
function init(){
chars=$(echo $topline|wc -c)
width=$(echo $chars*50|bc)
cat >$html<
EOF
topline=$(echo $topline |sed -e 's/^//' -e 's/;/<\/b>;/g' -e 's/$/<\/b>/')
write2table "$topline" yellow
}
function write2table() {
sed -i '$i\
# line=$(echo "$1"|awk -F';' '{i=1; while (i<=NF) {print $i;i++}}')
# for colume in $line;do
echo "$1"|awk -F';' '{i=1; while (i<=NF) {print $i;i++}}'|while read colume
do
wcl=$(cat $html|wc -l)
insert=$(echo ${wcl}-1|bc)
# echo $insert $colume
# echo
if [ -n $2 ] ; then
sed -i "$insert i\
else
sed -i "$insert i\
fi
done
}
init
[ -z $1 ] && echo 'At least need a log file to mail' && exit 2
cp -p $1 $1.tmp
dos2unix $1.tmp # && sed -i -e 's/ /;/g' -e 's/\t/;/g' $1
#for i in $(cat $1);do
### 按行处理
cat $1.tmp |while read line
do
write2table "$line"
done
rm -f ${1}.tmp
#发送带附件的HTML格式正文的函数 (对于非txt或者cvs格式的文件,例如excel的xls,需要单独修改Type:搜MIMEtype)
#$1: mail_from
#$2: mail_to
#$3: subject
#$4: content mimetype, such as "text/plain"
#$5: content
#$6: attach mimetype, such as "text/csv"
#$7: attach display name
#$8: attach file path
function SendMailMultiMediaAttach(){
local MSG_FILE="/tmp/mail.tmp"
sub=$(echo $3|iconv -f GB2312 -t UTF-8)
echo "From: $1" > $MSG_FILE
echo "To: $2" >> $MSG_FILE
echo "Subject: $sub" >> $MSG_FILE
echo "Mime-Version: 1.0" >> $MSG_FILE
echo 'Content-Type: multipart/mixed; boundary="GvXjxJ+pjyke8COw"' >> $MSG_FILE
echo "Content-Disposition: inline" >> $MSG_FILE
echo "" >> $MSG_FILE
echo "--GvXjxJ+pjyke8COw" >> $MSG_FILE
echo "Content-Type: $4" >> $MSG_FILE
echo "Content-Disposition: inline" >> $MSG_FILE
echo "" >> $MSG_FILE
echo "$5" >> $MSG_FILE
echo "" >> $MSG_FILE
echo "" >> $MSG_FILE
if [ ! -z $8 ];then
echo "--GvXjxJ+pjyke8COw" >> $MSG_FILE
echo "Content-Type: $6" >> $MSG_FILE
echo "Content-Transfer-Encoding: base64" >> $MSG_FILE
echo "Content-Disposition: attachement; filename=$7" >> $MSG_FILE
echo "" >> $MSG_FILE
echo "" >> $MSG_FILE
/usr/bin/base64 $8 >> $MSG_FILE
fi
cat $MSG_FILE | /usr/lib/sendmail -t
}
##! @TODO: 发送邮件
##! @AUTHOR: http://neoremind.net/2011/02/linux_sendmail_attachment_mutt/
##! @VERSION: 1.0
##! @IN:
##! @OUT:
function sendMail()
{
echo "Sending $subject mail from $from to $to"
from="root@$(hostname)"
to="$1"
#subject="$2"
subject="=?UTF-8?B?`echo -n $2|base64`?="
content_type="text/html;charset=utf-8"
MAIL_HTML="$3"
body="$(cat $MAIL_HTML)"
attach_type="text/csv"
attach_path="$4"
attach_name=$(echo "$attach_path"|awk -F'/' '{print $NF".txt"}')
SendMailMultiMediaAttach "$from" "$to" "$subject" "$content_type" "$body" "$attach_type" "$attach_name" "$attach_path"
echo "Send mail done."
}
echo $addfile
if [ -z "$addfile" ];then
sendMail "$mail" "$subject" "$html"
else
sendMail "$mail" "$subject" "$html" "$addfile"
fi
#mutt -e 'my_hdr Content-Type: text/html' "$mail" -s "$subject" < "$html";