天天看點

利用shell腳本“綜合、集中”檢視linux server常用軟硬體資訊

    作為運維人員,了解每台伺服器的硬體相關資訊以及系統相關配置是必不可少的工作。雖然不難,卻很零散,資訊集中度不高。故而做了做了一套集中展示以上資訊的“平台”(其實談不上平台,收集-整理-展示而已),其原理由一台“監控機”(暫且這麼叫吧)運作主腳本,根據記錄伺服器IP的檔案循環處理每台server;配合“被監控機”上的兩個awk檔案(awk規則),将資訊統一收集到“監控機”然後由web server進行展示,界面大緻如下面圖例。

    #注:web server需開啟目錄通路功能

    首頁頁面,所有的伺服器都會以一個目錄的形式顯示,目錄内包含該server相關資訊

<a href="http://s3.51cto.com/wyfs02/M02/73/66/wKioL1X8McCjRIqFAADoR30YaUA273.jpg" target="_blank"></a>

    選中某台server後,進入二級頁面,分别記錄了任務計劃/硬體資訊/防火牆設定/root-shell為本人習慣存放shell腳本的目錄/sys_conf為系統常用配置檔案

    其中,devinfo.txt為彙總整理後的硬體資訊,如下圖。個人感覺“記憶體”的顯示效果是我比較得意的,可以清楚的看到共有多少插槽、插了幾根、現有記憶體的單條容量/頻率/廠家代号,這些資訊在增加或者更換記憶體的時候是非常有用的。另外磁盤資訊用lsblk指令也更簡潔直覺

<a href="http://s3.51cto.com/wyfs02/M02/73/66/wKioL1X8M13gITmSAAPRibXrMBc252.jpg" target="_blank"></a>

    sys_conf目錄下,保留了三天以來的系統常用配置檔案,包含以下檔案

<a href="http://s3.51cto.com/wyfs02/M02/73/66/wKioL1X8PAfT2yakAAJIPEJLN8k622.jpg" target="_blank"></a>

    看到這裡,如果覺得有點用的同學可以接着往下看如何實作了。這套腳本在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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

<code>#!/bin/sh</code>

<code>#通過将各台server的硬體資訊記入文本,然後通過web-server進行顯示</code>

<code>for</code> <code>server_ip </code><code>in</code> <code>`</code><code>cat</code> <code>/root/shells/ips</code><code>.txt` </code><code>#記錄區域網路的所有主機ip和主機名</code>

<code>  </code><code>do</code>

<code>  </code><code>ip=`</code><code>echo</code> <code>$server_ip|</code><code>awk</code> <code>-F </code><code>'-'</code> <code>'{print $2}'</code><code>`   </code><code>#擷取各server IP</code>

<code>  </code> 

<code>  </code><code>###第一次運作該腳本,最好在以下遠端指令部分再加一條yum -y install dmidecode util-linux-ng &gt; /dev/null</code>

<code>  </code><code>###以防指令不存在</code>

<code>  </code><code>ssh</code> <code>root@$ip "</code><code>cat</code> <code>/etc/issue</code><code>|</code><code>sed</code> <code>-n </code><code>'1p'</code> <code>&gt; </code><code>/devinfo/devinfo</code><code>.txt;</code>

<code>           </code><code>uname</code> <code>-a|</code><code>cut</code> <code>-d </code><code>' '</code> <code>-f 2|</code><code>sed</code> <code>s/^</code><code>/HostName</code><code>:</code><code>' '</code><code>/ &gt;&gt; </code><code>/devinfo/devinfo</code><code>.txt;</code>

<code>           </code><code>uname</code> <code>-a|</code><code>cut</code> <code>-d </code><code>' '</code> <code>-f 3|</code><code>sed</code> <code>s/^</code><code>/Kernel</code><code>:</code><code>' '</code><code>/ &gt;&gt; </code><code>/devinfo/devinfo</code><code>.txt;</code>

<code>           </code><code>dmidecode -t system|</code><code>awk</code> <code>-f </code><code>/root/shells/servername</code><code>.</code><code>awk</code> <code>&gt;&gt; </code><code>/devinfo/devinfo</code><code>.txt;</code>

<code>           </code><code>echo</code> <code>-e </code><code>'\n--------CPU:-------'</code> <code>&gt;&gt; </code><code>/devinfo/devinfo</code><code>.txt;</code>

<code>           </code><code>lscpu |</code><code>egrep</code> <code>-</code><code>v</code> <code>'Order|Vendor|Model|Stepping|BogoMIPS|family|On-line|op-mode|CPU\ socket|NUMA\ node0'</code> <code>&gt;&gt; </code><code>/devinfo/devinfo</code><code>.txt;</code>

<code>           </code><code>echo</code> <code>-e </code><code>'\n------記憶體:------'</code> <code>&gt;&gt; </code><code>/devinfo/devinfo</code><code>.txt;</code>

<code>           </code><code>dmidecode -t memory|</code><code>grep</code> <code>-A7 Physical &gt;&gt; </code><code>/devinfo/devinfo</code><code>.txt;</code>

<code>           </code><code>dmidecode -t memory|</code><code>grep</code> <code>-e </code><code>"Size.*[0-9]"</code> <code>-A8|</code><code>awk</code> <code>-f </code><code>/root/shells/mem</code><code>.</code><code>awk</code> <code>&gt;&gt; </code><code>/devinfo/devinfo</code><code>.txt;</code>

<code>           </code><code>echo</code> <code>-e </code><code>'\n-------磁盤:-------'</code> <code>&gt;&gt; </code><code>/devinfo/devinfo</code><code>.txt;</code>

<code>           </code><code>lsblk &gt;&gt; </code><code>/devinfo/devinfo</code><code>.txt;</code>

<code>           </code><code>crontab</code> <code>-l &gt; </code><code>/devinfo/crontab</code><code>.txt;</code>

<code>           </code><code>iptables -L -n &gt; </code><code>/devinfo/iptables</code><code>.txt"</code>

<code>  </code><code>mkdir</code> <code>/server_info/</code><code>$server_ip &amp;&gt; </code><code>/dev/null</code>

<code>  </code><code>scp</code> <code>root@$ip:</code><code>/devinfo/</code><code>* </code><code>/server_info/</code><code>$server_ip/</code>

<code>  </code><code>###從/tmp/$ip 下拷貝系統級配置檔案 備份至此</code>

<code>  </code><code>time</code><code>=`</code><code>date</code> <code>+%F`</code>

<code>  </code><code>mkdir</code> <code>-p </code><code>/server_info/</code><code>$server_ip</code><code>/sys_conf/</code><code>$</code><code>time</code>

<code>  </code><code>cp</code>  <code>/tmp/</code><code>$ip/* </code><code>/server_info/</code><code>$server_ip</code><code>/sys_conf/</code><code>$</code><code>time</code><code>/</code>

<code>  </code><code>###保留兩天的sys_conf即可</code>

<code>  </code><code>find</code> <code>/server_info/</code><code>$server_ip</code><code>/sys_conf</code> <code>-</code><code>type</code> <code>d -mtime +1|</code><code>xargs</code> <code>rm</code> <code>-rf</code>

<code>  </code><code>###将生産各server/root/shells 下的腳本同步做備份</code>

<code>  </code><code>rsync</code> <code>-av --delete root@$ip:</code><code>/root/shells/</code> <code>/server_info/</code><code>$server_ip</code><code>/root-shells</code>

<code>  </code><code>echo</code> <code>-e </code><code>"\e[1;31m $server_ip is done \e[0m"</code>

<code>done</code>

    主腳本中引用的兩個awk檔案内容如下

<code>[root@web1 ~]</code><code># cat shells/servername.awk </code>

<code>$0~ </code><code>/Product</code><code>.*/ {</code><code>printf</code> <code>"%s"</code><code>,</code><code>"\nserver型号: "</code><code>$(NF-1)</code><code>" "</code><code>$NF}</code>

<code>$0~ </code><code>/Serial</code><code>.*/ {</code><code>printf</code> <code>"%s"</code><code>,$0</code><code>"\n"</code><code>}</code>

<code>[root@web1 ~]</code><code># cat shells/mem.awk </code>

<code>$0~ </code><code>/Size</code><code>.*[0-9]/ {</code><code>printf</code> <code>"%s"</code><code>,$0</code><code>"\t"</code><code>} </code>

<code>$0~ </code><code>/Speed</code><code>.*[0-9]/ {</code><code>printf</code> <code>"%s"</code><code>,$0</code><code>"\t\t"</code><code>} </code>

<code>$0~ </code><code>/Manufacturer</code><code>.*/ {print </code><code>"廠家代号: "</code><code>$2}</code>

    希望這套腳本能給其他同學帶來些許的幫助,也不枉了開源的精神。

    其實這隻是本着“讓運維簡單化”大思想的一個小展現,這套小平台可獨立存在,也可與其他平台內建起來。例如我現在就在做一個公司内部的運維平台(技術有限,比較簡陋那種~),把日常從Dev到test環境的上線、日志分析平台、以及上文分享的這個server_info平台內建在一起。 

     本文轉自kai404 51CTO部落格,原文連結:http://blog.51cto.com/kaifly/1696203,如需轉載請自行聯系原作者