查看硬件信息,并将信息整合成json数值,然后传给前段进行分析,最后再进行相应的处理。在装系统的时候,或是进行监控时,都是一个标准的自动化运维流程。使用shell直接生成好json数据再进行传输,会变得非常方便。
环境
[root@sys-idc-pxe01 ~]# yum install jq lsscsi MegaCli
脚本内容
#!/bin/sh
#description: get server hardware info
#author: liuzhijie
#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