文/刘志权
如何利用Cacti监控机房温度
文/刘志权
本文基于Cacti监控软件,针对在无人值守的情况下,对机房的温度进行实时的监控和图形显示,并容许设定报警温度,机房超温发送给机房管理人员。
为了实时监控机房的温度,本文基于Cacti监控软件,对机房的温度进行实时的监控和图形显示,并容许设定报警温度,机房超温则发送报警信息至机房管理人员。
Cacti是一套基于php、mysql、snmp及rrdtool开发的网络流量监测图形分析工具,利用Cacti的SNMP信息轮询机制,实时获取各种信息,并显示在Cacti监控界面。Cacti同时具有强大的插件功能,比如具备阈值报警功能的thold插件,可以发送邮件,还可以后台编程发送短信至网络管理人员的手机终端。
系统在一台服务器上采集温度,在Cacti服务器上使用ftp获取到该数据,Cacti使用snmp获取到该数据放入rrd数据库,最后在Web上图形显示。
温度采集
购买一款USB接口的温度计,该温度计必须支持将温度记录保存至文本文件的功能。
系统每次重启温度计监控软件都会新建一个以创建时间为文件名的日志文件,温度计监控软件还会每天新建一个日志文件。日志文件以如下的格式为记录,每行一条:
1,35.63,2012-4-2 16∶13∶39
为了使Cacti服务器读取到最后的温度记录,将在Windows服务器上编写一个计划任务,该任务定时执行,将日志文件的最后一条温度记录读取到特定的文本文件,以供Cacti服务器采集。该批处理的脚本如下:@echo off
cd H: emper
dir /B /OD 〉H:filelist.txt
setlocal enabledelayedexpansion
for /f "delims=" %%i in (H:filelist.txt) do (
set a=%%i
)
cd H: emper
@copy "%a%" H: emp.txt
set d=H: emp.txt
for /f"usebackq delims="%%i in (%d%) do (
set d=%%i
)
if NOT "%d%"=="H: emp.txt" (@echo %d% 〉H: ftpfortemperlastline.txt)
上述脚本的功能大概描述如下:读取日志文件所在目录的所有文件,按照日期排序写入filelist.txt文件,然后读取filelist.txt文件最后一条记录,该记录为温度计软件目前在读写的日志文件,赋值给变量a,然后读取该日志文件copy给temp. txt以供读取(防止文件读取的时候温度计软件需要进行访问),最后读取temp.txt,如果temp. txt文件为空,则将最后一条记录即温度计最后读取到的温度写入到lastline.txt。
添加计划任务,每4分钟运行一次:
schtasks /create /sc minute /mo 4 /tn "temper" /tr H∶ftpfortemperfilelist.bat
最后,在Windows服务器上开启ftp服务,设置账号和密码,访问目录为拥有lastline.txt文件的文件夹。
Cacti监控的实现
1.编写脚本ftp.sh以便snmp读取温度信息。
#!/bin/bash
ftp -i 222.201.131.230 2121 〉/dev/null 2〉&1
errorline='0'
prevtemper=`tail -n 1 /home/zqliu/temper/temper_ log`
lastline=`tail -n 1 /lastline.txt`
if [ "$prevtemper" = "$errorline" ];then
prevtemper=`tail -n 1 /home/zqliu/temper/errorline` fi
if [ "$prevtemper" = "$lastline" ];then
echo $errorline〉〉/home/zqliu/temper/temper_log tail -n 1 /lastline.txt〉/home/zqliu/temper/errorline echo 0else
图1 设置OID
图2 图形模板
tail -n 1 /lastline.txt〉〉/home/zqliu/temper/temper_ log
awk -F "," '{print $2}' /lastline.txt
fi
2.设定.netrc文件,使服务器可以不用密码从温度采集服务器下载lastline.txt文件。
3.修改snmp配置文件#vi /etc/snmp/ snmpd.conf,增加如下一行:
exec .1.3.6.1.4.1.2021.54 ftp.sh /bin/bash /root/ftp. sh
重启snmpd服务。
4.测试新的oid:
# s n m p w a l k -c p u b l i c -v 2 c localhost.1.3.6.1.4.1.2021.54
UCD-SNMP-MIB::ucdavis.54.1.1 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.54.2.1 = STRING: "ftp. sh"
UCD-SNMP-MIB::ucdavis.54.3.1 = STRING: "/bin/ bash /root/ftp.sh"
UCD-SNMP-MIB::ucdavis.54.100.1 = INTEGER: 0 UCD-SNMP-MIB::ucdavis.54.101.1 = STRING: "31.5"
UCD-SNMP-MIB::ucdavis.54.102.1 = INTEGER: 0 UCD-SNMP-MIB::ucdavis.54.103.1 = ""
那么OID.1.3.6.1.4.1.2021.54.101.1,即为所需要的获取到的温度数据。
图形监控
1.增加数据模板
在Cacti界面中console->Templates->Data Templates,按照步骤逐一添加数据模板。设置完毕以后点击create,然后下面会多出一些选项,我们只需填写一项就可以,就是OID那一项,把上面记下来的OID填写进去,如图1所示。
2.增加图形模板
在Cacti界面中console->Templates->Graph Templates,按照步骤逐一添加设置,添加完成后结果,如图2所示。
3.创建图形
添加完数据和图形模板后,我们就可以在本地服务器上添加新的图形了。
图3 温度监控
在New Graphs中选择主机然后在Graph Templates中的下拉表拉选我们添加的模板,点击create就完成了。
最后的监控图形,如图3所示。
短信报警
首先安装thold插件,Cacti插件可以在http∶//docs.Cacti.net/plugins这个网站下载。并且在Cacti界面中console->Management->Thresholds,按照步骤设置监控图的上下阈值,
然后找到thold目录下的thold_ functions.php文件,在function thold_ mail函数下添加:
file_put_contents('/usr/local/apache/htdocs/Cacti/ log/changed.log',$subject);
exec("/usr/local/apache/htdocs/Cacti/plugins/thold/ sendsms.sh");
该代码的意思是将告警变量(标题)$subject写入changed.log,然后执行sendsms.sh脚本。sendsms.sh为发短信的脚本。
在这里我们采取两种方式进行短信报警,一个是使用飞信报警,二是使用短信猫报警。
飞信报警我们使用PHP飞信发送类(PHPFetion)发送短信。按照如下代码发信:
require‘PHPFetion.php’;
$fetion=new PHPFetion('136xx', '密码');
$fetion-〉send('135xx', 'Hello Fetion1!');
使用短信猫报警的时候,需要购置一款usb短信猫,然后在服务器上安装gnokii. gnokii提供了在不同操作系统下移动电话使用的工具和用户空间的驱动程序,支持以命令行形式直接向手机发送短信。
if [ -s "/usr/local/apache/htdocs/Cacti/log/changed. log" ]
then
cat /usr/local/apache/htdocs/Cacti/log/changed.log|/ usr/bin/gnokii --sendsms 188xxx 〉/dev/null 2〉&1 rm -f /usr/local/apache/htdocs/Cacti/log/changed. log 〉/dev/null 2〉&1
fi
至此,机房温度监控和短信报警设置完成。
(作者单位为华南理工大学信息网络工程研究中心)