作為運維人員,了解每台服務器的硬件相關信息以及系統相關配置是必不可少的工作。雖然不難,卻很零散,信息集中度不高。故而做了做了一套集中展示以上信息的“平台”(其實談不上平台,收集-整理-展示而已),其原理由一台“監控機”(暫且這麼叫吧)運行主腳本,根據記錄服務器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
# by ljk
#通過將各台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平台集成在一起。