運維自動化之使用PHP+MYSQL+SHELL打造私有監控系統(七)

技術小胖子發表於2017-11-16
X、create_province.sh指令碼內容

  1. #!binbash  
  2. LANG=“zh_CN.UTF-8” 
  3. LANG=C 
  4. #mysql info  
  5. mysql_ip=`1.1.1.1` 
  6. ##資料庫的ip  
  7. mysql_username=`root` 
  8. ##資料庫的使用者名稱  
  9. mysql_passwd=`****` 
  10. ##資料庫的密碼  
  11. mysql_database=`monitor` 
  12. ##登入的資料庫  
  13. new_here=`shanxi` 
  14. ##需要新增的省份中文拼音  
  15. new_name=`陝西` 
  16. ##需要新增省份的中文名稱  
  17. old_here=`gansu` 
  18. ##已經新增過省份中文拼音  
  19. old_name=`甘肅` 
  20. ##已經新增過的省份中文名字  
  21. memory_table=$new_here`_memory`  
  22. load_table=$new_here`_load`  
  23. io_table=$new_here`_io`  
  24. hardware_table=$new_here`_hardware`  
  25. message_table=$new_here`_message`  
  26. user_table=$new_here`_user`  
  27. disk_table=$new_here`_disk`  
  28. cpu_table=$new_here`_cpu`  
  29. service_table=$new_here`_service`  
  30. monitor_dir=`/tmp/monitor` 
  31. ##當前php監控存放的位置  
  32. test_dir=`/tmp/old` 
  33. ##如果想新增新省份,臨時存放的位置  
  34. #create table module  
  35. create_table ()   
  36. {  
  37. #create table memory  
  38.  mysql -h $mysql_ip -u$mysql_username -p$mysql_passwd $mysql_database -e “create table $memory_table(id int(10) not null primary key auto_increment,province varchar(30) not null,server varchar(30) not null,ip varchar(20) not null,monitor_server varchar(30) not null,service varchar(20) not null,alert int(10) not null,value int(10) not null,status varchar(10) not null,date datetime)ENGINE=InnoDB DEFAULT CHARSET=utf8;”  
  39. #create table load  
  40. mysql -h $mysql_ip -u$mysql_username -p$mysql_passwd $mysql_database -e “create table $load_table(id int(10) not null primary key auto_increment,province varchar(30) not null,server varchar(30) not null,ip varchar(20) not null,monitor_server varchar(30) not null,service varchar(20) not null,alert int(10) not null,value int(10) not null,status varchar(10) not null,date datetime)ENGINE=InnoDB DEFAULT CHARSET=utf8;”  
  41. #create table io  
  42. mysql -h $mysql_ip -u$mysql_username -p$mysql_passwd $mysql_database -e “create table $io_table(id int(10) not null primary key auto_increment,province varchar(30) not null,server varchar(30) not null,ip varchar(20) not null,monitor_server varchar(30) not null,service varchar(20) not null,alert int(10) not null,value int(10) not null,status varchar(10) not null,date datetime)ENGINE=InnoDB DEFAULT CHARSET=utf8;”  
  43. #create table hardware  
  44. mysql -h $mysql_ip -u$mysql_username -p$mysql_passwd $mysql_database -e “create table $hardware_table(id int(10) not null primary key auto_increment,province varchar(30) not null,server varchar(30) not null,ip varchar(20) not null,monitor_server varchar(30) not null,service varchar(20) not null,alert int(10) not null,value int(10) not null,status varchar(10) not null,date datetime)ENGINE=InnoDB DEFAULT CHARSET=utf8;”  
  45. #create table message  
  46. mysql -h $mysql_ip -u$mysql_username -p$mysql_passwd $mysql_database -e “create table $message_table(id int(10) not null primary key auto_increment,province varchar(30) not null,server varchar(30) not null,ip varchar(20) not null,monitor_server varchar(30) not null,service varchar(20) not null,alert int(10) not null,value int(10) not null,status varchar(10) not null,date datetime)ENGINE=InnoDB DEFAULT CHARSET=utf8;”  
  47. #create table user  
  48. mysql -h $mysql_ip -u$mysql_username -p$mysql_passwd $mysql_database -e “create table $user_table(id int(10) not null primary key auto_increment,province varchar(30) not null,server varchar(30) not null,ip varchar(20) not null,monitor_server varchar(30) not null,service varchar(20) not null,alert int(10) not null,value int(10) not null,status varchar(10) not null,date datetime)ENGINE=InnoDB DEFAULT CHARSET=utf8;”  
  49. #create table disk  
  50. mysql -h $mysql_ip -u$mysql_username -p$mysql_passwd $mysql_database -e “create table $disk_table(id int(10) not null primary key auto_increment,province varchar(30) not null,server varchar(30) not null,ip varchar(20) not null,monitor_server varchar(30) not null,service varchar(20) not null,alert int(10) not null,partition varchar(30) not null,value int(10) not null,status varchar(10) not null,date datetime)ENGINE=InnoDB DEFAULT CHARSET=utf8;”  
  51. #create table cpu  
  52. mysql -h $mysql_ip -u$mysql_username -p$mysql_passwd $mysql_database -e “create table $cpu_table(id int(10) not null primary key auto_increment,province varchar(30) not null,server varchar(30) not null,ip varchar(20) not null,monitor_server varchar(30) not null,service varchar(20) not null,alert int(10) not null,value int(10) not null,status varchar(10) not null,date datetime)ENGINE=InnoDB DEFAULT CHARSET=utf8;”  
  53. #create table service  
  54. mysql -h $mysql_ip -u$mysql_username -p$mysql_passwd $mysql_database -e “create table $service_table(id int(10) not null primary key auto_increment,province varchar(30) not null,server varchar(30) not null,ip varchar(20) not null,monitor_server varchar(30) not null,service varchar(20) not null,status varchar(10) not null,date datetime)ENGINE=InnoDB DEFAULT CHARSET=utf8;”  
  55. }  
  56. #create test directory  
  57. if [ ! -d “$test_dir” ];then   
  58.         /bin/mkdir $test_dir  
  59. fi   
  60. #mondiy monitor software module  
  61. mondiy_software ()  
  62. {  
  63. #copy monitor province software  
  64. /usr/bin/rsync -avz $monitor_dir/*$old_here* $test_dir/ >>/dev/null 2>&1  
  65. cd $test_dir  
  66. #rename old_name to here_name  
  67. /usr/bin/rename $old_here $new_here *  
  68. #mondiy old_here and old_name  
  69. sed -i `s/`$old_here`/`$new_here`/g` *$new_here*  
  70. sed -i `s/`$old_name`/`$new_name`/g` *$new_here*  
  71. #mondiy province.php   
  72. sed -i `s/</b>/ | <a href=“`$new_here`.php”>`$new_name`</a></b>/` $monitor_dir/province.php  
  73. #mondiy warn_province.php   
  74. sed -i `s/</b>/ | <a href=“`$new_here`_warn.php”>`$new_name`</a></b>/` $monitor_dir/warn_province.php   
  75. #mondiy view_day_province.php   
  76. sed -i `s/</b>/ | <a href=“`$new_here`_day_view.php”>`$new_name`</a></b>/` $monitor_dir/view_day_province.php   
  77. #mondiy view_month_province.php  
  78. sed -i `s/</b>/ | <a href=“`$new_here`_month_view.php”>`$new_name`</a></b>/` $monitor_dir/view_month_province.php  
  79. #mondiy view_year_province.php  
  80. sed -i `s/</b>/ | <a href=“`$new_here`_year_view.php”>`$new_name`</a></b>/` $monitor_dir/view_year_province.php  
  81. #copy test_dir to monitor_dir  
  82. /usr/bin/rsync -avz $test_dir/*$new_here* $monitor_dir/ >>/dev/null 2>&1  
  83. #delete test_dir file  
  84. /bin/rm -rf $test_dir/*$new_here*  
  85. }  
  86. #check table is or not exist  
  87. /usr/bin/mysql -h $mysql_ip -u$mysql_username -p$mysql_passwd $mysql_database -e “desc $io_table”>>/dev/null 2>&1  
  88. if [ $? -eq 0 ];then  
  89. echo “$io_table is exist!”  
  90. else  
  91. echo “$io_table is not exist!”  
  92. echo “Do you want to create $new_here table?If you want to create $new_here table,please input:(yes|no)”  
  93. read -t 30 -p “Please input you choose:” choose  
  94. case $choose in  
  95.         yes|y)  
  96.                 echo “Now start creaet $new_here table……”  
  97.                 create_table  
  98.         echo “$new_here table crease finish!”  
  99.         echo “Now start to mondiy monitor software……”  
  100.         mondiy_software  
  101.         echo “$new_name has been added monitor software!”  
  102.                 ;;  
  103.         no|n)  
  104.                 echo “Your choose is no,so we will to exit!”  
  105.                 exit  
  106.                 ;;  
  107.         *)  
  108.                 echo “please input:(yes|no)”  
  109.                 ;;  
  110. esac  
  111. fi  
Y、資料檢視化shell指令碼
每個省份都是單獨的一個shell指令碼,指令碼里包含各種省份以年、月、日為時間,以web、交換、引擎、備用、資料庫為伺服器型別,以disk、io、load、memory、user為檢視化的服務。
下面是甘肅省份的資料檢視化指令碼,名字為gansu.sh,執行在php程式的images檔案裡,使用nohup sh gansu.sh &執行
由於指令碼內容非常的多,在word裡超過200頁,所以就不展示了,指令碼我會放到最後一頁的附件裡。
7、如何部署
1)、shell監控指令碼部署
shell監控指令碼存放到/usr/local/monitor/shell目錄,給予755許可權,然後再crontab裡輸入*/3 * * * * /usr/local/monitor/shell/指令碼內容,使每3分鐘輪詢執行指令碼。
2)mysql資料庫部署
可以使用create_database.sh指令碼進行部署,也可以使用create_province.sh指令碼部署。
3)php程式部署
先把php程式部署到伺服器裡,然後新增省份的時候,使用create_province.sh來進行新增,方法為:
1、使用sh create_province.sh執行指令碼
2、如果新增指令碼在資料庫裡資料庫表存在,就會出現以下情況

如果不存在

你可以輸入yes或no來選擇是否建立資料庫表與進行新增相應省份的php檔案(注意只有10秒鐘的等待時間,為了節省伺服器資源,我使用了read -n引數)
輸入完yes後,結果如下

可以看到資料庫表建立完成,php監控的省份新增完成
之後你在web裡就能直接觀看新增省份的監控
新增省份的資料檢視化的shell檔案,可以使用create_gnuplot.sh來進行新增,內容如下

  1. #!/bin/bash  
  2. old_dir=`/tmp/old_dir` 
  3. ##當前已經存在的資料實體化指令碼目錄  
  4. new_dir=`/tmp/new_dir` 
  5. ##臨時存放省份的資料實體化指令碼目錄  
  6. if [ ! -d “$new_dir” ];then  
  7.         mkdir $new_dir  
  8. fi  
  9. for i in gansu tianjin guangxi guizhou hainan hebei hunan qinghai xinjiang henan xizang baotou hubei jiangxi ningxia shanxi  
  10. ##在這裡輸入你想新增省份的中午拼音  
  11. do  
  12. ls $i.sh>>/dev/null 2>&1  
  13. if  [ $? -eq 0 ];then  
  14.         echo “$i.sh is exist!”  
  15. else  
  16.         echo “$i.sh is not exist!”  
  17.         echo “Start to create $i.sh…”  
  18. /usr/bin/rsync -avz $old_dir/gansu.sh $new_dir/$i.sh>>/dev/null 2>&1  
  19. sed -i `s/gansu/`$i`/g` $new_dir/$i.sh  
  20. /usr/bin/rsync -avz $new_dir/$i.sh $old_dir/$i.sh>>/dev/null 2>&1  
  21. fi  
  22. done  
8、維護與升級
1、維護
       由於採用了時間方法的日誌分鐘,每3分鐘檢測一次 ,所以日常維護非常的方便,只要各位在目錄的logs裡,檢視到有當天日誌檔案產生,在檢視當天日誌檔案是否為每3分鐘檢測一次,如果滿足上述條件,則此指令碼正常執行。
2、升級
       在升級的時候,為了避免部署新的程式時監控系統檢測不到相應的應用服務,而且還收到了服務宕掉的郵件提示,各位在部署新程式時,應在相應使用者裡(部署監控系統crontab -e所在的使用者)裡,在監控系統自動啟動檢測的那一行裡,在前面加上#,例如,在交換伺服器裡部署新的程式,需要在root使用者下,輸入crontab -e,然後在*/3 * * * * /usr/local/monitor/shell/監控指令碼內容的最前面,加上#,最後的結果為#*/3 * * * * /usr/local/monitor/shell/監控指令碼。
9、完整監控系統頁面展示
1)shell部分
各省都有各自的shell監控指令碼,我以甘肅web為例

2)mysql資料庫部分
我截圖所有mysql資料表

3)php程式部分
由於在首頁裡已經有了php介面展示,所以現在就不展示了。
現在這個php+mysql+shell已經成功的對生產平臺監控了3個月,符合我之前的監控要求,能節省我更多的時間去做更多有用的事,現在檢視平臺也不需要在進入後臺一個一個的檢視了,可以檢視各省的監控詳情與監控檢視,更方便的瞭解平臺應用服務與資源的執行情況,希望我這個監控系統能對大家有更好的啟發,如果您有疑問或者好的觀點,希望您能留言給我,謝謝!


 本文轉自 reinxu 51CTO部落格,原文連結:http://blog.51cto.com/dl528888/1035335,如需轉載請自行聯絡原作者



相關文章