shell-告警系統

chunyang315發表於2018-04-24

shell專案-告警系統

  • 需求背景
    使用shell定製各種個性化告警工具,但需要統一化管理、規範化管理。當zabbix伺服器之間因為網路原因而無法上報資料時,就可以先通過shell指令碼來暫時監控。

  • 這樣的告警系統屬於分散式的,需要在每一臺機器上去放置該shell指令碼,每一臺機器都獨立監控,不需要依賴其他機器。

  • 思路:指定一個指令碼包,其中包含以下內容
    (1)主程式:作為整個指令碼的入口,是整個系統的命脈
    (2)配置檔案:是一個控制中心,用他來開關各個子程式,指定各個相關聯的日誌檔案
    (3)子程式:這個才是真正的監控指令碼,用來監控各個指標
    (4)郵件引擎:是由一個pythen程式來實現,它可以定義發郵件的伺服器、發郵件人以及發件人密碼。
    (5)輸出日誌:整個監控系統要有日誌輸出

  • 要求:機器角色很多種,但是所有機器上都要部署同樣的監控系統,也就是說所有的機器不管什麼角色,整個程式框架是一致的,不同之處在於根據不同的角色,定製不同的配置檔案。

  • 程式框架

    這裡寫圖片描述


告警系統主指令碼

  • 先定義各個監控系統的目錄,然後再去定義主指令碼,因為是分散式的,所以每一臺機器都需要這樣去做。可以在其他機器上建立那些目錄,然後將這臺機器上的指令碼拷貝過去,並做一些更改。

  • 將指令碼全部放在/usr/local/sbin目錄下,方便以後的查詢。

  • 建立mon目錄,並建立bin 、 conf 、shares 、log 、mail這幾個子目錄。

    -主指令碼放在/bin目錄下,並寫入以下內容

#!/bin/bash
##written by zcy
#是否傳送郵件的開關,0為是指不傳送
export send=1  //所有的子指令碼只是關閉告警,監控還是繼續監控
#過濾ip地址
export addr=` /sbin/ifconfig |grep -A1 "ens33: "|awk '/inet/ {print $2}'`
dir=`pwd`
#只需要最後一些目錄名
last_dir=`echo $dir |awk -F '/' '{print $NF}'`
#下面判斷的目的是,保證執行指令碼的時候,我們在bin目錄裡面,不然監控指令碼、郵件和日誌很有可能找不到
if [ $last_dir == "bin" ] || [ $last_dir == "/bin/" ] ; 
  then 
  conf file="../conf/mon.conf"
else
  echo "you shoud cd bin dir"
  exit
fi 
exec 1 >> ../log/mon.log 2>> ../log.err.log
echo "`date+"%F %T"` load average"
#主指令碼中呼叫了子指令碼
/bin/bash ../shares/load.sh  
#先檢查配置檔案中舒服需要監控502
if grep -q 'to_mon_502=1' $conf_files ; 
then 
 export log=`grep 'logfile='$conf file |awk -F  '=' '{print $2}' |sed 's/ //g'`
 /bin/bash ../shares/502.sh
fi

告警系統配置檔案

  • 它主要定義一些開關和日誌的路徑

  • 切換到conf子目錄中建立配置檔案mon.conf,並寫入以下內容

## to config the options if to monitor
## 定義mysql的伺服器地址、埠以及user 、password
to_mon_cdb=0 ##0 or 1, default 0,0 not monitor, 1 monitor 
db_ip=192.168.244.136
db_port=3315
db_user=zcy
db_pass=xxxxx
## httpd 如果是1則監控,為0不監控
to_mon_httpd=0
## php 監控為1 不監控為0
to_mon_php_socket=0
## http_code_502 需要定義訪問日誌的路徑
to_mon_502=1
logfile=/data/log/xxx.xxx.com/access.log
## request_count  定義日誌路徑以及域名
to_mon_request_count=0  //是否監控請求數,為0不監控
req_log=/data/log/www.discuz.net/access.log
domainname=www.discuz.net 

配置檔案怎麼定義取決於子指令碼里面需要用到的資源, 可以把用到的所有資源,比如日誌、域名等全部寫入到子指令碼中,前提是機器不多才可以。

將請求日誌摘取到配置檔案中,目的是為保證通用性。


告警系統監控專案 ##

  • 監控專案放在shares目錄下,建立load.sh,寫入以下內容
#!/bin/bash
load=`uptime |awk -F 'average:' '{print $2}'|cut -d ',' -f1 |sed 's/  //g' |cut -d . -f1`   //系統負載的值
if [ $load -gt 10 ] && [ $send -eq "1" ] 
then 
   echo "$addr `date+%T` load is $load" > ../log/load.tmp 這個日誌是用來發郵件用到的日誌。
   /bin/bash ../mail/mail.sh $addr\_load $load ../log/load.tmp 
fi
echo "`date+%T` load is $load"


  • 建立502.sn
#!/bin/bash
d=`date -d "-1 min" +%H:$M`
c_502=`grep :$d: $log |grep '502' |wc -l `
if [ $c_502 -gt 10 ] && [ $send == 1 ]; then
    echo "$addr $d 502 count is $c_502">../log/502.tmp
    /bin/bash../mail/mail.sh $addr\_502 ../log/502.tmp 
fi 
echo "`date+%T` 502 $c_502"
  • 監控磁碟 使用率disk.sh
#!/bin/bash
rm -f ../log/disk.tmp
for in `df -h |awk -F '[%]+' '{print $5}' |grep -v Use`
do  
 if [ $r -gt 90 ] && [ $send -eq "1" ]
 then 
   echo  "$addr `date+%T` disk uesrage is $r" >>../log/disk.tmp
 fi
 if [ -f ../log/disk.tmp ] 
 then 
 df -h >> ../log/disk.tmp 
 /bin/bash ../mail/mail.sh $addr \_disk $r ../log/disk.tmp
 echo "`date+%T` disk uesrage in nook"
else 
 echo "`date+%T` disk uesrage is ok"
fi

awk -F ’ [ % ]+’ /表示以一個或多個空格或%作為分隔符

相關文章