设为首页 收藏本站
查看: 4045|回复: 0

[经验分享] python 收集主机信息

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-10-31 10:21:30 | 显示全部楼层 |阅读模式
这篇文章是之前几篇的一个小综合。也是通过收集主机的一些参数信息,熟悉python里的文件读取,字符切割,字典存储等知识。

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

1. 目的
  用python 脚本实现收集主机信息:
  (1)主机名(hostname).
  当然了,在命令行下,直接使用"hostname" 命令就可以直接输出本机的hostname了。但是我们现在用python 一般是用读取文件的方式获取信息。主机的hostname 在"/etc/sysconfig/network" 文件里。
   wKiom1gTUzuzSRbjAAAuRikFJYw284.jpg
  (2)ip地址.
  要求收集第一块网卡的信息,网名,ip地址。在"ifconfig"命令的输出里,获取信息。前面有一篇博客已经介绍过具体的方法。
  (3)操作系统版本,osver.
  在"/etc/issue" 文件里有系统操作版本号的信息:
   wKiom1gTVBXRnU4sAAAaDxhBJ_s009.jpg
  我们只需要将第一行的信息取出来就可以了。

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

  (5)cpu型号(cpu_model)和cpu核数(cpu_num).
  在"/proc/cpuinfo" 文件里可以获取,一般是一个"process" 就是一个cpu 核,所以通过统计"process" 字段就可以统计cpu 核数了。cpu型号,就是"cpu model" 了。如下:
   wKioL1gTVaqxvvKVAABsrLzykh8825.jpg
  做实验的机器,只有一个cpu 核数,所以"process" 字段就只有一个字段。通常cpu型号,"model name",只需统计型号和主频。

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

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/env  python

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

from  subprocess  import  Popen, PIPE

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

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


"""
从getIfconfig() 和getDmi() 函数返回的都是一个字符串。下面再定义一个
parseData(data) 的函数,将字符串分割成一个列表,每遇到顶格的行,就是
新的一段信息.
"""
def  parseData(data):
    parsed_data = []
    new_line = ''
    data = [i for i in data.split('\n')  if i] #将字符串分割,去掉空行的元素
    for  line  in data:
        if  line[0].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 [i for i in parsed_data if i]  #去掉空行的元素



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

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

def  parseDmi(parsed_data):
    dic = {}
    parsed_data = [i for i in parsed_data if  i.startswith('System Information')] #把这段信息直接整出来
    parsed_data = [i for i in parsed_data[0].split('\n')[1:] if i ]
    parsed_data = [i.strip().split(':') for i in parsed_data if i]
    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('=')[1].strip()
                break
    return {'HostName': HostName}


"""
getOSver: 函数
fn : 文件名参数
功能: 打开fn 文件,读取操作系统版本信息
"""
def  getOSver(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(':')[1]
                 model_name = model_name.split()[0] + ' ' + model_name.split()[-1]
    dic['cpu_num'] = num
    dic['cpu_model'] = model_name
    return dic


"""
getMemory: 函数
fn : 文件名参数
功能: 打开fn 文件,读取系统MemTotal 数值
"""
def  getMemory(fn):
    with open(fn) as fd:
        for line in fd:
            if line.startswith('MemTotal'):
                mem = int(line.split()[1].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



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

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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-293748-1-1.html 上篇帖子: python paramiko 下篇帖子: python paramiko 执行命令 python 信息 主机
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表