【shell】利用shell脚本实现监视远程主机磁盘的健康状态

最近买了一本书:《Linux shell 脚本攻略》,人民邮电出版社的。
看了几天有点儿感觉了,目前应用linux授课时间比较多,看了很多书,发现计算机技术类的书基本分为两大类:入门类和实战类
入门的书,多是从最基础,最简单的内容开始,循序渐进,由浅入深地展开,旨在引导读者完成一个从“无”到“有”的过程。
而实战类的书,则是假定读者已经有了一定的基础,将重点放在特定情境下展开,帮助读者完成从“有”到“精”的过程。
很多人都能很快的在网上看到一些关于shell入门的资料,而就如何利用shell解决平时运行linux系统遇到的问题,相关的技巧大多散落在各个linux论坛,博客中,不易查找和归纳总结。
老外常常写的一种书叫做cookbook,就是像菜谱一样,你照着做,就能完成相应的功能。很实用,很简单。可以这样认为:
菜谱—-亟待解决的问题。
做法—-具体的命令或者脚本
在学习了一段时间后,我发现通过这本书,学到了很多小技巧,其中一个就是身边正好要用到的实例:
最近朋友做个一个linux系统的管理工作,想监视远程磁盘的健康情况:
由于linux主机数量多,一台台看日志肯定是很低效率的,所以作为网络管理员,他得每天记录网络中所有主机的磁盘使用情况。日志的每一行应该包含日期、主机IP地址、设备、设备容量、已用空间、剩余空间、使用比例、健康状况等细节信息。如果任何远程主机中的任意分区使用率超过了80%,那么就应该将健康状况设置为ALERT,否则就设置为SAFE。
下面就演示一下如何编写一个可以收集远程网络主机详细信息的脚本,当然了,如果不愿意折腾的朋友可以选择nagios或者别的软件来实现监控。
思路:
1.分别从网络中的每台主机收集磁盘使用情况的统计信息,并写入中央主机的日志文件中。
2.将负责收集信息并写入日志的脚本调度为每天执行。
PS:其中ssh可以用于登陆远程系统收集磁盘数据
实战操作:
1.首先,我们得在所有网络中的远程主机上设置一个公用的账户。这个账户供脚本yoyodiskchecklog登陆系统使用。同时需要为这个账户配置ssh自动登陆。
#useradd diskcheck
#echo “mypassword” | passwd –stdin diskcheck
2. 设置ssh自动化登陆认证
2.1 创建ssh密钥,这需要登陆到远程主机。
#ssh -keygen -t rsa

ssh-keygen -t rsa

ssh-keygen -t rsa 创建秘钥


创建过程中需要输入口令来成一对公钥和私钥。但是我们是需要利用自动登陆来登陆多个主机来执行监控脚本,因此这里不要填入口令了,可以避免在脚本运行时向你索要口令了。现在,你已经有~/.ssh/id_rsa.pub和~/.ssh/id_rsa两个文件了,一个是公钥,一个是私钥。
其中公钥必须要添加到远程服务器~/.ssh/authorized_keys文件中去,这台服务器也就是我们想从当前主机自动登入的那台服务器。
2.2 将生成的公钥传输到远程主机,并将其加入到文件: ~/.ssh/authorized_keys中。
#ssh diskcheck@远程主机的IP “cat >> ~/.ssh/authorized_keys” $logfile
fi

IP_list=”192.168.10.200″
#提供远程主机的IP列表
for ip in $IP_list;
do
ssh root@$ip “df -Ph | grep ^/dev/ | cut -d’-’ -f2″ > /tmp/$$.df
while read line;
do
cur_date=$(date +%D)
printf “%-10s%-16s ” $cur_date $ip
echo $line | awk ‘{ printf(“%-10s%-8s%-8s%-8s%-8s”,$1,$2,$3,$4,$5);}’
pusg=$(echo $line | egrep -o “[0-9]+%”)
pusg=${pusg/\%/};

if [ $pusg -lt 80 ]
then
echo -e “33[32mSAFE33[0m"
else
echo -e "33[31mALERT33[0m"
fi
done> $logfile
[root@yoyo ~]#
执行结果如下:
[root@yoyo ~]# yoyodiskchecklog.sh
+ logfile=diskusage.log
+ [[ -n '' ]]
+ ‘[' '!' -e diskusage.log ']‘
+ IP_list=192.168.10.200
+ for ip in ‘$IP_list’
+ ssh root@192.168.10.200 ‘df -Ph | grep ^/dev/ |cut -d’-’ -f2′
+ read line
++ date +%D
+ cur_date=02/01/13
+ printf ‘%-10s %-16s ‘ 02/01/13 192.168.10.200
+ echo /dev/mapper/VolGroup00-LogVol00
+ awk ‘{ printf(“%-10s%-8s%-8s%-8s%-8s”,$1,$2,$3,$4,$5);}’
++ echo /dev/mapper/VolGroup00-LogVol00
++ egrep -o ‘[0-9]+%’
+ pusg=
+ pusg=12
+ ‘[' 12 -lt 80 ']‘
+ echo -e ’33[32mSAFE33[0m'
+ read line
++ date +%D
+ cur_date=02/01/13
+ printf '%-8s %-14s ' 02/01/13 192.168.10.200
+ echo /dev/sdc6 190M 8.2M 172M 5% /data2
+ awk '{ printf("%-9s %-8s %-6s %-6s %-8s",$1,$2,$3,$4,$5);}'
++ echo /dev/sdc6 190M 8.2M 172M 5% /data2
++ egrep -o '[0-9]+%’
+ pusg=5%
+ pusg=5
+ ‘[' 5 -lt 80 ']‘
+ echo -e ’33[32mSAFE33[0m'
+ read line
因为我在执行过程中开启了debug模式,就是在我#!/bin/bash 后面加上了一个参数-x,所以过程会显示在终端上,可以进行排错。
这个脚本调试了好几次才完成。最终生成的diskusage.log如下:

diskusage.log

diskusage.log


再在crontab里面加入如下内容定期执行就好啦!
#crontab -e
0 23 * * * /scripts/yoyodiskchecklog.sh
10 9 * * * mail -s “Disk Report” yoyojacky2009@gmail.com < /scripts/diskusage.log
每天11点执行脚本,然后每天早上9点10分发邮件给管理员,哈哈,一切都可以自动监控啦!

About 李 伟斌

Just K.I.S.S To Be Or Not To Be, It's Your Qustion. --Keep It Simple & Stupid.
This entry was posted in Linux, 操作系统 and tagged , , , , , , , , . Bookmark the permalink.

发表评论