shell指令碼整合json數值輸出從而獲取硬體資訊
檢視硬體資訊,並將資訊整合成json數值,然後傳給前段進行分析,最後再進行相應的處理。在裝系統的時候,或是進行監控時,都是一個標準的自動化運維流程。使用 直接生成好json資料再進行傳輸,會變得非常方便。所以抽時間寫了這個小 ,供大家參考,裡面還有很多不完善的地方,有興趣的朋友可以自行更改 |
環境
需要安裝必要的軟體,這裡我為了保障 合理的進行,使用的是真機環境,沒有使用虛擬機器
[root@sys-idc-pxe01 ~]# yum install jq lsscsi MegaCli Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile Setting up Install Process Package jq-1.3-2.el6.x86_64 already installed and latest version Package lsscsi-0.23-3.el6.x86_64 already installed and latest version Package MegaCli-8.00.40-1.i386 already installed and latest version Nothing to do
指令碼內容
我的 風格比較偏向模組化,所以使用函式會多一些,這樣方便理解,相信大家也能看得懂。
我不太喜歡python風格的程式碼格式(雖然我python寫的也很不錯),看起來給人的感覺太緊湊,太亂。據說是前輩們出版書籍的時候為了省紙,才出現的那種風格,後輩懷著對前輩的敬仰就延續了下來,其實前輩也沒有那麼寫過那種風格的程式碼,不知道是不是真的。
[root@sys-idc-pxe01 ~]# cat ./get_server_info.sh #!/bin/sh #description: get server hardware info #author: liuxin #date: 20180122 #需要安裝jq工具 yum install jq #用於存放該伺服器的所有資訊,個人喜歡把全域性變數寫到外面 #寫到函式里面,沒有加local的變數也是全域性變數 INFO="{}" #定義一個工具函式,用於生成json數值,後面將會頻繁用到 function create_json() { #utility function local key=$1 local value="$2" local json="" #if value is string if [ -z "$(echo "$value" |egrep "\[|\]|\{|\}")" ] then json=$(jq -n {"$key":"\"$value\""}) #if value is json, object elif [ "$(echo "$value" |jq -r type)" == "object" ] then json=$(jq -n {"$key":"$value"}) #if value is array elif [ "$(echo "$value" |jq -r type)" == "array" ] then json=$(jq -n "{$key:$value}") else echo "value type error..." exit 1 return 0 fi echo $json return 0 } #獲取CPU資訊 function get_cpu() { #獲取cpu資訊,去掉空格和製表符和空行,以便於for迴圈 local cpu_model_1=$(dmidecode -s processor-version |grep '@' |tr -d " " |tr -s "\n" |tr -d "\t") local cpu_info="{}" local i=0 #因為去掉了空格和製表符,以下預設使用換行符分隔 for line in $(echo "$cpu_model_1") do local cpu_model="$line" local cpu1=$(create_json "cpu_model" "$cpu_model") #獲取每塊cpu的資訊,這裡只記錄了型號 local cpu=$(create_json "cpu_$i" "$cpu1") local cpu_info=$(jq -n "$cpu_info + $cpu") i=$[ $i + 1] done #將cpu的資訊整合成一個json,key是cpu local info=$(create_json "cpu" "$cpu_info") #將資訊加入到全域性變數中 INFO=$(jq -n "$INFO + $info") return 0 } function get_mem() { #generate json {Locator:{sn:sn,size:size}} local mem_info="{}" #獲取每個記憶體的資訊,包括Size:|Locator:|Serial Number: local mem_info_1=$(dmidecode -t memory |egrep 'Size:|Locator:|Serial Number:' |grep -v 'Bank Locator:' |awk ' { if (NR%3==1 && $NF=="MB") { size=$2; getline (NR+1); locator=$2; getline (NR+2); sn=$NF; printf("%s,%s,%s\n",locator,size,sn) } }') #根據上面的資訊,將資訊過濾並整合成json local i=0 for line in $(echo "$mem_info_1") do local locator=$(echo $line |awk -F , '{print $1}') local sn=$(echo $line |awk -F , '{print $3}') local size=$(echo $line |awk -F , '{print $2}') local mem1=$(create_json "locator" "$locator") local mem2=$(create_json "sn" "$sn") local mem3=$(create_json "size" "$size") local mem4=$(jq -n "$mem1 + $mem2 + $mem3") #每條記憶體的資訊,key是記憶體從0開始的序號 local mem=$(create_json "mem_$i" "$mem4") #將這些記憶體的資訊組合到一個json中 mem_info=$(jq -n "$mem_info + $mem") i=$[ $i + 1 ] done #給這些記憶體的資訊設定key,mem local info=$(create_json "mem" "$mem_info") INFO=$(jq -n "$INFO + $info") return 0 } function get_megacli_disk() { #設定megacli工具的路徑,此條可以根據情況更改 local raid_tool="/opt/MegaRAID/MegaCli/MegaCli64" #將硬碟資訊獲取,儲存下來,省去每次都執行的操作 $raid_tool pdlist aall >/tmp/megacli_pdlist.txt local disk_info="{}" #獲取硬碟的必要資訊 local disk_info_1=$(cat /tmp/megacli_pdlist.txt |egrep 'Enclosure Device ID:|Slot Number:|PD Type:|Raw Size:|Inquiry Data:|Media Type:'|awk ' { if(NR%6==1 && $1$2=="EnclosureDevice") { E=$NF; getline (NR+1); S=$NF; getline (NR+2); pdtype=$NF; getline (NR+3); size=$3$4; getline (NR+4); sn=$3$4$5$6; getline (NR+5); mediatype=$3$4$5$6; printf("%s,%s,%s,%s,%s,%s\n",E,S,pdtype,size,sn,mediatype) } }') #將獲取到的硬碟資訊進行整合,生成json local i=0 for line in $(echo $disk_info_1) do #local key=$(echo $line |awk -F , '{printf("ES%s_%s\n",$1,$2)}') local E=$(echo $line |awk -F , '{print $1}') local S=$(echo $line |awk -F , '{print $2}') local pdtype=$(echo $line |awk -F , '{print $3}') local size=$(echo $line |awk -F , '{print $4}') local sn=$(echo $line |awk -F , '{print $5}') local mediatype=$(echo $line |awk -F , '{print $6}') local disk1=$(create_json "pdtype" "$pdtype") local disk1_1=$(create_json "enclosure_id" "$E") local disk1_2=$(create_json "slot_id" "$S") local disk2=$(create_json "size" "$size") local disk3=$(create_json "sn" "$sn") local disk4=$(create_json "mediatype" "$mediatype") local disk5=$(jq -n "$disk1 + $disk1_1 + $disk1_2 + $disk2 + $disk3 + $disk4") local disk=$(create_json "disk_$i" "$disk5") disk_info=$(jq -n "$disk_info + $disk") i=$[ $i + 1 ] done #echo $disk_info local info=$(create_json "disk" "$disk_info") INFO=$(jq -n "$INFO + $info") return 0 } function get_hba_disk() { #對於hba卡的硬碟,使用smartctl獲取硬碟資訊 local disk_tool="smartctl" local disk_info="{}" #lsscsi 需要使用yum install lsscsi 安裝 local disk_info_1=$(lsscsi -g |grep -v 'enclosu' |awk '{printf("%s,%s,%s,%s\n",$1,$2,$(NF-1),$NF)}') local i=0 for line in $(echo $disk_info_1) do local E=$(echo $line |awk -F , '{print $1}' |awk -F ':' '{print $1}' |tr -d '\[|\]') local S=$(echo $line |awk -F , '{print $NF}' |egrep -o [0-9]*) local sd=$(echo $line |awk -F , '{print $(NF-1)}') $disk_tool -i $sd >/tmp/disk_info.txt local pdtype="SATA" if [ "$(cat /tmp/disk_info.txt |grep 'Transport protocol:' |awk '{print $NF}')" == "SAS" ] then local pdtype="SAS" fi local size=$(cat /tmp/disk_info.txt |grep 'User Capacity:' |awk '{printf("%s%s\n",$(NF-1),$NF)}' |tr -d '\[|\]') local sn=$(cat /tmp/disk_info.txt |grep 'Serial Number:' |awk '{print $NF}') local mediatype="disk" local disk1=$(create_json "pdtype" "$pdtype") local disk1_1=$(create_json "enclosure_id" "$E") local disk1_2=$(create_json "slot_id" "$S") local disk2=$(create_json "size" "$size") local disk3=$(create_json "sn" "$sn") local disk4=$(create_json "mediatype" "$mediatype") local disk5=$(jq -n "$disk1 + $disk1_1 + $disk1_2 + $disk2 + $disk3 + $disk4") local disk=$(create_json "disk_$i" "$disk5") disk_info=$(jq -n "$disk_info + $disk") i=$[ $i + 1 ] done #echo $disk_info local info=$(create_json "disk" "$disk_info") INFO=$(jq -n "$INFO + $info") return 0 } function get_disk() { #根據獲取到的硬碟控制器型別,來判斷使用什麼工具採集硬碟資訊 if [ "$(echo "$INFO" |jq -r .disk_ctrl.disk_ctrl_0.type)" == "raid" ] then get_megacli_disk elif [ "$(echo "$INFO" |jq -r .disk_ctrl.disk_ctrl_0.type)" == "hba" ] then get_hba_disk else local info=$(create_json "disk" "error") INFO=$(jq -n "$INFO + $info") fi #hp機器比較特殊,這裡我沒有做hp機器硬碟資訊採集,有興趣的朋友可以自行新增上 #if hp machine return 0 } function get_diskController() { local disk_ctrl="{}" #if LSI Controller local disk_ctrl_1="$(lspci -nn |grep LSI)" local i=0 #以換行符分隔 IFS_OLD=$IFS && IFS=$'\n' for line in $(echo "$disk_ctrl_1") do #echo $line local ctrl_id=$(echo "$line" |awk -F ']:' '{print $1}' |awk '{print $NF}' |tr -d '\[|\]') case "$ctrl_id" in #根據控制器的id或進行判斷是raid卡還是hba卡,因為品牌比較多,後續可以在此處進行擴充套件新增 0104) # 獲取Logic以後的字串,並進行拼接 local ctrl_name=$(echo "${line##*"Logic"}" |awk '{printf("%s_%s_%s\n",$1,$2,$3)}') local ctrl1=$(create_json "id" "$ctrl_id") local ctrl2=$(create_json "type" "raid") local ctrl3=$(create_json "name" "$ctrl_name") ;; 0100|0107) local ctrl_name=$(echo "${line##*"Logic"}" |awk '{printf("%s_%s_%s\n",$1,$3,$4)}') local ctrl1=$(create_json "id" "$ctrl_id") local ctrl2=$(create_json "type" "hba") local ctrl3=$(create_json "name" "$ctrl_name") ;; *) local ctrl1=$(create_json "id" "----") local ctrl2=$(create_json "type" "----") local ctrl3=$(create_json "name" "----") ;; esac local ctrl_tmp=$(jq -n "$ctrl1 + $ctrl2 + $ctrl3") local ctrl=$(create_json "disk_ctrl_$i" "$ctrl_tmp") disk_ctrl=$(jq -n "$disk_ctrl + $ctrl") i=$[ $i + 1 ] done IFS=$IFS_OLD local info=$(create_json "disk_ctrl" "$disk_ctrl") INFO=$(jq -n "$INFO + $info") return 0 } function get_netcard() { local netcard_info="{}" local netcard_info_1="$(lspci -nn |grep Ether)" local i=0 #echo "$netcard_info_1" IFS_OLD=$IFS && IFS=$'\n' for line in $(echo "$netcard_info_1") do local net_id=$(echo $line |egrep -o '[0-9a-z]{4}:[0-9a-z]{4}') local net_id_1=$(echo $net_id |awk -F : '{print $1}') case "$net_id_1" in 8086) local net_name=$(echo "${line##*": "}" |awk '{printf("%s_%s_%s_%s\n",$1,$3,$4,$5)}') local type=$(echo $line |egrep -o SFP || echo "TP") local net1=$(create_json "id" "$net_id") local net2=$(create_json "name" "$net_name") local net3=$(create_json "type" "$type") ;; 14e4) local net_name=$(echo "${line##*": "}" |awk '{printf("%s_%s_%s_%s\n",$1,$3,$4,$5)}') local type=$(echo $line |egrep -o SFP || echo "TP") local net1=$(create_json "id" "$net_id") local net2=$(create_json "name" "$net_name") local net3=$(create_json "type" "$type") ;; *) local net_name=$(echo "${line##*": "}" |awk '{printf("%s_%s_%s_%s\n",$1,$3,$4,$5)}') local type=$(echo $line |egrep -o SFP || echo "TP") local net1=$(create_json "id" "$net_id") local net2=$(create_json "name" "$net_name") local net3=$(create_json "type" "$type") ;; esac local net1=$(jq -n "$net1 + $net2 + $net3") #echo $net local net2=$(create_json "net_$i" "$net1") netcard_info=$(jq -n "$netcard_info + $net2") i=$[ $i + 1 ] done IFS=$IFS_OLD local info=$(create_json "net" "$netcard_info") INFO=$(jq -n "$INFO + $info") return 0 } function get_server() { local product=$(dmidecode -s system-product-name |grep -v '^#' |tr -d ' ' |head -n1) local manufacturer=$(dmidecode -s system-manufacturer |grep -v '^#' |tr -d ' ' |head -n1) local server1=$(create_json "manufacturer" "$manufacturer") local server2=$(create_json "product" "$product") local server3=$(jq -n "$server1 + $server2") local info=$(create_json "basic_info" "$server3") INFO=$(jq -n "$INFO + $info") return 0 } ALL_INFO="" function get_all() { #因為硬碟資訊的獲取依賴硬碟控制器的資訊,所以get_diskController要放到get_disk前面 get_server get_cpu get_mem get_diskController get_disk get_netcard local sn=$(dmidecode -s system-serial-number |grep -v '^#' |tr -d ' ' |head -n1) ALL_INFO=$(create_json "$sn" "$INFO") return 0 } function main() { get_all echo $ALL_INFO return 0 } #------------------------------------------------- main
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2650757/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux c程式中獲取shell指令碼輸出(如獲取system命令輸出)LinuxC程式指令碼
- shell指令碼獲取函式返回值指令碼函式
- DELL伺服器硬體資訊採集SHELL指令碼伺服器指令碼
- Shell指令碼中獲取SELECT結果值的方法指令碼
- 【資訊採集】IBM AIX系統硬體資訊檢視命令(shell指令碼)IBMAI指令碼
- Android獲取硬體裝置資訊Android
- C++獲取硬體相關資訊C++
- c#獲取機器硬體資訊C#
- vmi:獲取 windows 系統硬體資訊Windows
- shell指令碼(3)-格式化輸出指令碼
- shell指令碼中如何報錯即刻退出以及如何獲取子shell指令碼的錯誤資訊:set -o errexit指令碼
- 用C#獲取電腦硬體資訊C#
- Shell 指令碼 ,, 根據程式號退出 從而關機指令碼
- shell指令碼中main函式中$#獲取不到指令碼傳入引數個數淺析指令碼AI函式
- shell指令碼獲取時間格式化指令碼
- python 呼叫 shell ,獲取返回值和返回資訊Python
- shell請求api,獲取json返回值,做判斷APIJSON
- Python 指令碼之獲取CPU資訊Python指令碼
- golang gopsutil 程式 系統硬體資訊 獲取Golang
- java獲取當前秒數輸出Java
- javascript獲取url引數值出現亂碼解決JavaScript
- js獲取瀏覽器資訊和客戶端硬體資訊(一)JS瀏覽器客戶端
- 常用指令碼:獲取隱含引數指令碼
- Inxi:獲取Linux系統和硬體資訊的神器Linux
- vbs指令碼獲取Am註冊路徑資訊指令碼
- 獲取linux伺服器基本資訊指令碼Linux伺服器指令碼
- 從一個shell指令碼執行出錯聊起指令碼
- Linux Shell指令碼中獲取本機ip地址方法Linux指令碼
- 【VMware ESXi】使用 smbiosDump 命令獲取伺服器硬體資訊。iOS伺服器
- phpcheckbox核取方塊值的獲取與checkbox預設值輸出方法PHP
- 【DataGuarad】獲取standby 庫的配置資訊的指令碼指令碼
- 獲取top N cpu pid的sql資訊指令碼SQL指令碼
- 前端釋出shell指令碼前端指令碼
- 透過硬體識別符號獲取過程映像輸入符號
- Shell 系統資訊監控指令碼指令碼
- hyperic-sigar-1.6.4 java獲取軟硬體相關資訊Java
- C/C++獲取變數型別並輸出C++變數型別
- oracle獲取ddl指令碼Oracle指令碼