前言:人工去对每一台服务器的硬件信息并记录早已经过去了,无论通过脚本还是自动化工具都是可以进行一次编写到处抓取的,本文主要使用saltstack作为使用工具,然后利用其提供的APi编写所需的Python脚本~~
需求如下:生成服务器主机名,IP地址,内存,CPU核数,操作系统,数据盘配额,主要运行服务
saltstack快速入门,可参考:http://youerning.blog.51cto.com/10513771/1708964
这里主要用到saltstack的grains,就是saltstack minion端生成的一些静态信息,比如CPU,内存,主机名什么的,而这些就是我们所需要的
执行salt \* grains.items,会打印一大堆的默认抓取的信息,其中一部分,如下
我们当然只挑我们需要的,操作如下
获取主机名
1
|
salt H-T-4 grains.item host
|
获取IP地址
1
|
salt zabbix grains.item ipv4
|
获取CPU核数
1
|
salt \* grains.item num_cpus
|
以此类推,根据自己所需,提取~~~
值得注意的是,grains信息里面并没有硬盘信息,所以还需通过disk.usage这个选项,得到我们所需的硬盘信息
执行salt zabbix disk.usage,得到结果如下
其中1K-blocks即我们所需的硬盘信息,根据需求只需要数据盘/data,所以后面就会计算这个盘的配额
最终脚本如下
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#coding=utf-8
import
salt.client as sc
import
json
###salt调用
local
=
sc.LocalClient()
###目标主机指定
tgt
=
"*"
###获取grains,disk信息
grains
=
local.cmd(tgt,
"grains.items"
)
diskusage
=
local.cmd(tgt,
"disk.usage"
)
###主要应用列表即文件开头
app_name
=
[
"tomcat"
,
"zookeeper"
,
"redis"
,
"mysql"
,
"nginx"
]
cols
=
"主机名,IP地址,内存(GB),CPU核数,操作系统,数据盘/data(GB),所属项目,主要应用"
###打开一个.csv文件,以便写入
ret_file
=
open
(
"ret.csv"
,
"w"
)
###首先写入开头,有点字段名的意思
ret_file.write(cols
+
"\n"
)
try
:
for
i
in
grains.keys():
###打印信息可注释掉
print
grains[i][
"nodename"
]
print
"ipv4"
+
":"
,grains[i][
"ipv4"
]
print
"mem_total"
+
":"
, grains[i][
"mem_total"
]
/
1024
+
1
print
"num_cpus"
+
":"
, grains[i][
"num_cpus"
]
print
"osfullname"
+
":"
, grains[i][
"osfullname"
]
print
"release"
+
":"
, grains[i][
"lsb_distrib_release"
]
###可能一些主机没有/data数据盘1048576是1024x1024
if
"/data"
not
in
diskusage[i]:
print
"diskusage"
+
":"
+
"have no /data disk"
else
:
data_vol
=
int
(diskusage[i][
"/data"
][
"1K-blocks"
])
print
"diskusage"
+
":"
, data_vol
/
1048576
###去掉127.0.0.1这个地址
ipv4
=
str
(grains[i][
"ipv4"
]).replace(
", '127.0.0.1'"
,"")
###因为一些历史遗留问题,这里取得不是主机名,而是salt-minion的id名,用以判断主要应用
hostname
=
grains[i][
"id"
]
ipv4
=
str
(grains[i][
"ipv4"
]).replace(
", '127.0.0.1'"
,"")
ipv4
=
ipv4.replace(
","
,
"and"
)
mem
=
grains[i][
"mem_total"
]
/
1024
+
1
num_cpu
=
grains[i][
"num_cpus"
]
OS
=
grains[i][
"osfullname"
]
+
grains[i][
"lsb_distrib_release"
]
if
"/data"
not
in
diskusage[i]:
disk_data
=
"None"
else
:
disk_data
=
data_vol
/
1048576
###项目名为空
project
=
""
###通过minion ID名来判断主要运行服务,比如xx-mysql-1,则运行mysql
for
j
in
app_name:
if
j
in
hostname.lower():
app
=
j
break
else
:
app
=
"undefined"
c
=
","
###连接并写入
line
=
hostname
+
c
+
ipv4
+
c
+
str
(mem)
+
c
+
str
(num_cpu)
+
c
+
str
(OS)
+
c
+
str
(disk_data)
+
c
+
project
+
c
+
app
ret_file.write(line
+
"\n"
)
except
Exception,e:
print
"Exception:\n"
,e
finally
:
ret_file.close()
|
用记事本打开应该是这样
用Excel打开应该是这样
本文转自 youerning 51CTO博客,原文链接:http://blog.51cto.com/youerning/1746075