開發本身的監控系統2、web篇

開發本身的監控系統1、email篇
開發本身的監控系統3、移動篇(android) css

web篇:
關鍵字:shell mysql python web.py html

在上一篇中,咱們介紹瞭如何使用shell腳本監控系統狀態,並在出現異常時經過email發送警報。但email報警有一個弊端,沒法實時瞭解服務器的運行狀態。爲了知足這一需求,就要開發一個web程序,經過網頁的方式來顯示全部服務器的實時運行狀態。 python

原理:
定時執行監控腳本提取服務器運行相關信息,如系統負載、磁盤空間等,將這些信息入到mysql數據庫中。開發一個web程序,當用戶經過瀏覽器訪問web監控頁面,web程序讀取mysql數據庫中服務器的數據,以網頁的形式展示給用戶。

下面咱們經過一個實例來詳細講解。共用到3臺服務器,一臺監控服務器serverM(60.11.232.17),用於存放咱們web程序和mysql數據庫,還有兩臺被監控服務器,server1(199.83.55.39)和server2(59.66.7.124). mysql

首先在監控服務器serverM上建立一個數據庫monitor: android

mysql -p
create database monitor

在monitor數據庫中建立一個servers表,用於存放監控數據: web

use monitor
create table servers (
    id int not null primary key auto_increment,
    hostname varchar(20),
    ip varchar(64),
    rootpartion varchar(64),
    uptime varchar(64),
    time timestamp
)

添加一個用戶user1,並讓其有訪問monitor數據庫的權限: sql

grant all privileges on monitor.* to 'user1'@'%' identified by 'Root123';
flush privileges

在被監控服務器server1和server2上執行如下命令,看可否正常鏈接的到監控服務器serverM的數據庫 shell

mysql -h60.11.232.17  -uuser1 -pRoot123 monitor

接下來是被監控服務器上的shell監控腳本,和email篇中的腳本大致類似,多了一個入庫的操做: 數據庫

#!/bin/bash
#Server status monitor
#by caishzh 2013
 
#初始化變量及設置閥值
MYSQL="mysql -h60.11.232.17 -uuser1 -pRoot123 monitor -e"     #數據庫鏈接語句
DIR="/tmp"
NOW=$(date "+%F %T")
>${DIR}/messages.txt
 
ADMIN="xxx@qq.com" #你的郵箱地址
HOSTNAME=$(hostname) #這裏也能夠手動執行服務器名  如:HOSTNAME="Server1"
IP=$(ifconfig eth0|grep 'inet addr'|sed 's/.*addr:\(.*\) Bcast:.*/\1/')
 
UPTIME_MAX=3 #系統負載
DISK_MAX=90 #磁盤使用率
 
#系統負載
UPTIME=$(uptime|sed 's/^.*age: \(.*\)$/\1/')
UPTIME_NOW=$(echo $UPTIME|awk -F',' '{print $1}')
if echo "$UPTIME_NOW>$UPTIME_MAX"|bc >/dev/null;then
     echo "UPTIME: $UPTIME" >>${DIR}/messages.txt
fi
 
#根分區
DISK=$(df -h|grep /$|awk '{print $5,$2,$4}')
DISK_USAGE=$(echo $DISK|awk '{print $1}'|tr -d '%')
[ "$DISK_USAGE" -ge "$DISK_MAX" ] && $(echo "DISK: $DISK" >> ${DIR}/messages.txt)
 
#若是messages.txt文件不爲空則發送警報信
if [ -s ${DIR}/messages.txt ];then
     mail -s "system monitor: $NOW  $IP  $HOSTNAME" "$ADMIN" <${DIR}/messages.txt
fi
 
#將服務器運行狀態數據入到mysql數據庫中
#第一次執行插入一條新記錄,後續則更新記錄
if [ -n "$1" ];then
     $MYSQL "insert into servers(hostname,ip,rootpartion,uptime,time) values('$HOSTNAME','$IP','$DISK','$UPTIME',now())"
else
     $MYSQL "update servers set rootpartion='$DISK',uptime='$UPTIME',time=now() where hostname='$HOSTNAME'"
fi

將腳本放到被監控服務器/root/tool目錄下,給予執行權限: 瀏覽器

chmod 755 /root/tool/system_monitor.sh

放入crontab中,每3分鐘執行一次:

echo "*/3 * * * * root /root/tool/system_monitor.sh" >>/etc/crontab

第一次須要手動執行以下命令,命令後加任意參數,這樣能夠在數據庫插入一條新記錄:

/root/tool/system_monitor.sh 1

此時,數據庫的監控數據以下:

mysql> use monitor;
Database changed
mysql> select * from servers;
+----+----------+--------------+--------------+------------------+---------------------+
| id | hostname | ip           | rootpartion  | uptime           | time                |
+----+----------+--------------+--------------+------------------+---------------------+
|  1 | Server1  | 199.83.55.39 | 40% 20G 12G  | 0.45, 0.23, 0.28 | 2013-05-21 21:39:06 |
|  2 | Server2  | 59.66.7.124  | 34% 101G 64G | 4.84, 4.35, 3.76 | 2013-05-21 21:39:22 |
+----+----------+--------------+--------------+------------------+---------------------+
2 rows in set (0.00 sec)

到監控服務器serverM,下載安裝web.py框架( web.py 是一個輕量級Python web框架,它簡單、方便並且功能大):

wget http://webpy.org/static/web.py-0.37.tar.gz
tar zxvf web.py-0.37.tar.gz
cd web.py-0.37
python setup.py install

新建編輯code.py文件(代碼很簡單,就不註釋了,不清楚的建議先看下web.py的新手指南):

import web
 
urls=(
     '/','index'
)
render = web.template.render('templates/')
 
db = web.database(
     host = '127.0.0.1' , 
     dbn = 'mysql', 
     user = 'user1', 
     pw = 'Root123', 
     db = 'monitor'
)
 
class index:
     def GET(self):
          servers=db.select('servers')
          return render.index(servers)
 
if __name__ == "__main__":
     app = web.application(urls,globals())
     app.run()
新建一個模版目錄templates,在該目錄下新建index.html
$def with(servers)
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
        <title>my servers</title>
    </head>
 
     <body>
          <span>
            <h2>My servers</h2>
        </span>  
 
          <table border='1'>
               <tr>
                    <th>id</th>
                    <th>hostname</th>
                    <th>ip</th>
                    <th>rootpartion</th>
                    <th>uptime</th>
                    <th>time</th>
               </tr>
 
               $for server in servers:
               <tr>
                    <td>$server.id</td>
                    <td>$server.hostname</td>
                    <td>$server.ip</td>
                    <td>$server.rootpartion</td>
                    <td>$server.uptime</td>
                    <td>$server.time</td>
               </tr>
          </table>
     </body>
</html>

是否是很簡單,加起來還不到100行的代碼^_^

啓動web服務:

python code.py

默認啓動在8080端口,若是不想使用默認端口,使用如下命令:

python code.py 1234

若是提示ImportError: No module named MySQLdb,表示沒有安裝MySQLdb模塊,使用apt-get安裝下就好了:

apt-get install python-mysqldb

最後使用瀏覽器訪問,效果以下:
monitor_myservers

最後,配合css樣式表,能夠作出漂亮的界面,如下截圖是本人部分服務器的監控界面,給你們參考。
正常狀況下的監控數據是綠色背景,若是超過了閥值則變成紅色;點擊監控項目名能夠按大小排序:
monitor_myserver2

參考:
簡明python教程
http://webpy.org/

相關文章
相關標籤/搜索