作为运维人员,了解每台服务器的硬件相关信息以及系统相关配置是必不可少的工作。虽然不难,却很零散,信息集中度不高。故而做了做了一套集中展示以上信息的“平台”(其实谈不上平台,收集-整理-展示而已),其原理由一台“监控机”(暂且这么叫吧)运行主脚本,根据记录服务器IP的文件循环处理每台server;配合“被监控机”上的两个awk文件(awk规则),将信息统一收集到“监控机”然后由web server进行展示,界面大致如下面图例。
#注:web server需开启目录访问功能
首页页面,所有的服务器都会以一个目录的形式显示,目录内包含该server相关信息
选中某台server后,进入二级页面,分别记录了任务计划/硬件信息/防火墙设置/root-shell为本人习惯存放shell脚本的目录/sys_conf为系统常用配置文件
其中,devinfo.txt为汇总整理后的硬件信息,如下图。个人感觉“内存”的显示效果是我比较得意的,可以清楚的看到共有多少插槽、插了几根、现有内存的单条容量/频率/厂家代号,这些信息在增加或者更换内存的时候是非常有用的。另外磁盘信息用lsblk命令也更简洁直观
sys_conf目录下,保留了三天以来的系统常用配置文件,包含以下文件
看到这里,如果觉得有点用的同学可以接着往下看如何实现了。这套脚本在centos6和7上都试验过。
我的“监控机”是在内网,通过ssh免秘钥方式可以登到线上各台server(因为免不了要读线上多台server进行批量操作,所以有必要在内网配置一台能免秘钥登录线上server的)。
主脚本在“监控机”定时运行,通过ips.txt文件获取到线上server的主机名和IP。ips.txt是通过其他方式统计而来(这个就多种多样,最不济就是手动编辑这个)格式如下:web1-x.x.x.x;每行一台。主脚本同过远程执行命令获取相应信息,这里需要在各台“被监控机”上放置两个awk文件servername.awk和mem.awk(通过awk -f 调用,用于获取并格式化输出“机器型号 串号”和“内存”信息)。至于如何将这俩文件批量上传到服务器,不在本文讨论范围。
最终将所有信息都汇总于“监控机”的/server_info目录下,将web server根目录指向其便可。
主脚本内容:cat /root/shells/serverinfo.sh
#!/bin/sh #通过将各台server的硬件信息记入文本,然后通过web-server进行显示 for server_ip in `cat /root/shells/ips.txt` #记录局域网的所有主机ip和主机名 do ip=`echo $server_ip|awk -F '-' '{print $2}'` #获取各server IP ###第一次运行该脚本,最好在以下远程命令部分再加一条yum -y install dmidecode util-linux-ng > /dev/null ###以防命令不存在 ssh root@$ip "cat /etc/issue|sed -n '1p' > /devinfo/devinfo.txt; uname -a|cut -d ' ' -f 2|sed s/^/HostName:' '/ >> /devinfo/devinfo.txt; uname -a|cut -d ' ' -f 3|sed s/^/Kernel:' '/ >> /devinfo/devinfo.txt; dmidecode -t system|awk -f /root/shells/servername.awk >> /devinfo/devinfo.txt; echo -e '\n--------CPU:-------' >> /devinfo/devinfo.txt; lscpu |egrep -v 'Order|Vendor|Model|Stepping|BogoMIPS|family|On-line|op-mode|CPU\ socket|NUMA\ node0' >> /devinfo/devinfo.txt; echo -e '\n------内存:------' >> /devinfo/devinfo.txt; dmidecode -t memory|grep -A7 Physical >> /devinfo/devinfo.txt; dmidecode -t memory|grep -e "Size.*[0-9]" -A8|awk -f /root/shells/mem.awk >> /devinfo/devinfo.txt; echo -e '\n-------磁盘:-------' >> /devinfo/devinfo.txt; lsblk >> /devinfo/devinfo.txt; crontab -l > /devinfo/crontab.txt; iptables -L -n > /devinfo/iptables.txt" mkdir /server_info/$server_ip &> /dev/null scp root@$ip:/devinfo/* /server_info/$server_ip/ ###从/tmp/$ip 下拷贝系统级配置文件 备份至此 time=`date +%F` mkdir -p /server_info/$server_ip/sys_conf/$time cp /tmp/$ip/* /server_info/$server_ip/sys_conf/$time/ ###保留两天的sys_conf即可 find /server_info/$server_ip/sys_conf -type d -mtime +1|xargs rm -rf ###将生产各server/root/shells 下的脚本同步做备份 rsync -av --delete root@$ip:/root/shells/ /server_info/$server_ip/root-shells echo -e "\e[1;31m $server_ip is done \e[0m" done主脚本中引用的两个awk文件内容如下
[root@web1 ~]# cat shells/servername.awk $0~ /Product.*/ {printf "%s","\nserver型号: "$(NF-1)" "$NF} $0~ /Serial.*/ {printf "%s",$0"\n"} [root@web1 ~]# cat shells/mem.awk $0~ /Size.*[0-9]/ {printf "%s",$0"\t"} $0~ /Speed.*[0-9]/ {printf "%s",$0"\t\t"} $0~ /Manufacturer.*/ {print "厂家代号: "$2}希望这套脚本能给其他同学带来些许的帮助,也不枉了开源的精神。
其实这只是本着“让运维简单化”大思想的一个小体现,这套小平台可独立存在,也可与其他平台集成起来。例如我现在就在做一个公司内部的运维平台(技术有限,比较简陋那种~),把日常从Dev到test环境的上线、日志分析平台、以及上文分享的这个server_info平台集成在一起。