998yty 发表于 2016-10-31 10:21:30

python 收集主机信息

这篇文章是之前几篇的一个小综合。也是通过收集主机的一些参数信息,熟悉python里的文件读取,字符切割,字典存储等知识。

文章结构:
(1) 文章目的,需要收集的信息,并逐个分析如何获取信息。
(2) 给出实现的python 脚本。
(3) 总结。

1. 目的
用python 脚本实现收集主机信息:
(1)主机名(hostname).
当然了,在命令行下,直接使用"hostname" 命令就可以直接输出本机的hostname了。但是我们现在用python 一般是用读取文件的方式获取信息。主机的hostname 在"/etc/sysconfig/network" 文件里。

(2)ip地址.
要求收集第一块网卡的信息,网名,ip地址。在"ifconfig"命令的输出里,获取信息。前面有一篇博客已经介绍过具体的方法。
(3)操作系统版本,osver.
在"/etc/issue" 文件里有系统操作版本号的信息:

我们只需要将第一行的信息取出来就可以了。

(4)服务器厂商(vender)、服务器型号(product)和服务器序列号(sn).前面有一篇介绍收集dmidecode 信息的博客园,已经具体分析过。

(5)cpu型号(cpu_model)和cpu核数(cpu_num).
在"/proc/cpuinfo" 文件里可以获取,一般是一个"process" 就是一个cpu 核,所以通过统计"process" 字段就可以统计cpu 核数了。cpu型号,就是"cpu model" 了。如下:

做实验的机器,只有一个cpu 核数,所以"process" 字段就只有一个字段。通常cpu型号,"model name",只需统计型号和主频。

(6)内存大小.
在"/proc/meminfo" 文件的,"MemTotal" 就是内存的大小,统计的时候按实际将单位转换一下就可以了。


2. 实现方法
先对ip 信息和dmidecode 信息进行处理,因为这两个信息在前面的博客都已经实现过了,比较容易。首先,就是读取"ifconfig" 和 "dmidecode" 命令的输出,然后分割保存成一个列表,再对列表进行分析。它们俩的分析过程基本一样,就一起给出:


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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#!/usr/bin/envpython

"""
file name: collect_info_a.py
"""

fromsubprocessimportPopen, PIPE

defgetIfconfig():
    p = Popen(['ifconfig'], stdout=PIPE, stderr=PIPE)
    data = p.stdout.read()
    return data

defgetDmi():
    p = Popen(['dmidecode'], stdout=PIPE, stderr=PIPE)
    data = p.stdout.read()
    return data


"""
从getIfconfig() 和getDmi() 函数返回的都是一个字符串。下面再定义一个
parseData(data) 的函数,将字符串分割成一个列表,每遇到顶格的行,就是
新的一段信息.
"""
defparseData(data):
    parsed_data = []
    new_line = ''
    data = #将字符串分割,去掉空行的元素
    forlinein data:
      ifline.strip():#当遇到顶格的行,就把new_line 保存的上一段信息,append 到parsed_line
            parsed_data.append(new_line)
            new_line = line+'\n'#重新保存新的一段的信息
      else:
            new_line += line+'\n'
    parsed_data.append(new_line)
    return #去掉空行的元素



"""
parseData(data) 函数返回的就是一个处理过的列表,将收集到的ip 字符串信息和 dmidecode 字符串信息,交给
下面定义的parseIfconfig() 和parseDmi() 函数分别处理,返回ip 信息的字典,和dmidecode 信息的字典。
"""

defparseIfconfig(parsed_data):
    parsed_data = #将"lo" 网卡的信息去掉
    dic = {}
    for lines in parsed_data:
      devname = lines.split('\n').split()
      macaddr = lines.split('\n').split()[-1]
      ipaddr= lines.split('\n').split().split(':')
      break   #由于只需要第一张网卡的信息,所以这里就可以退出循环了
    dic['ip'] = ipaddr
    return dic

defparseDmi(parsed_data):
    dic = {}
    parsed_data = #把这段信息直接整出来
    parsed_data = .split('\n') if i ]
    parsed_data =
    dmi_dic = dict(parsed_data)
    dic = {}
    dic['vender'] = dmi_dic['Manufacturer'].strip()
    dic['product'] = dmi_dic['Product Name'].strip()
    dic['sn']= dmi_dic['Serial Number'].strip()
    return dic


"""
getHostName: 函数
fn : 文件名参数
功能: 通过fn 传入文件名,读取HOSTNAME 信息
"""
def getHostName(fn):
    with open(fn) as fd:
      for line in fd:
            if line.startswith('HOSTNAME'):
                HostName = line.split('=').strip()
                break
    return {'HostName': HostName}


"""
getOSver: 函数
fn : 文件名参数
功能: 打开fn 文件,读取操作系统版本信息
"""
defgetOSver(fn):
    with open(fn) as fd:
      for line in fd:
            osver = line.strip()
            break
    return {'osver': osver}


"""
getCpu: 函数
fn : 文件名参数
功能: 读取fn 文件信息,读取cpu 核数和cpu 型号
"""
def getCpu(fn):
    num = 0
    dic = {}
    with open(fn) as fd:
         for line in fd:
             if line.startswith('processor'):
               num += 1
             if line.startswith('model name'):
               model_name = line.split(':')
               model_name = model_name.split() + ' ' + model_name.split()[-1]
    dic['cpu_num'] = num
    dic['cpu_model'] = model_name
    return dic


"""
getMemory: 函数
fn : 文件名参数
功能: 打开fn 文件,读取系统MemTotal 数值
"""
defgetMemory(fn):
    with open(fn) as fd:
      for line in fd:
            if line.startswith('MemTotal'):
                mem = int(line.split().strip())
                break
    mem = '%s' % int((mem/1024.0)) +'M'
    return {'Memory': mem}


if__name__ == '__main__':
    data_ip = getIfconfig()
    parsed_data_ip = parseData(data_ip)
    ip = parseIfconfig(parsed_data_ip)

    data_dmi = getDmi()
    parsed_data_dmi = parseData(data_dmi)
    dmi = prseDmi(parsed_data_dmi)
    HostName = getHostName('/etc/sysconfig/network')
    osver = getOSver('/etc/issue')
    cpu = getCpu('/proc/cpuinfo')
    mem = getMemory('/proc/meminfo')
    dic = {} #定义空字典,上面收集到的主机信息都是字典形式的,就是为了现在能将它们update 在一个字典
    dic.update(ip)
    dic.update(dmi)
    dic.update(HostName)
    dic.update(osver)
    dic.update(cpu)
    dic.update(mem)
    print dic




测试一下结果:
在字典里保存了,文章开头列出所需的9个主机信息。

3. 总结:
还是熟悉读取文件的方法: 对字符切割,对列表的操作等等。如果需要读取其他的主机信息,再增加函数就可以了。


页: [1]
查看完整版本: python 收集主机信息