• Post author:
  • Post category:python
  • Post comments:0评论
Like
Like Love Haha Wow Sad Angry

脚本内容,主要用来练练手:

#!/usr/bin/env python2
# Author: cp
"""
收集Linux服务器信息:
服务器厂商、型号、序列号、主机名称、IP、系统版本、CPU信息、内存信息、磁盘信息
"""
from subprocess import Popen, PIPE
import os

def get_dmi(keyword):
    """获取服务器厂商、型号、序列号、UUID信息"""
    # p = Popen(["dmidecode", "-s", keyword], stdout=PIPE, encoding="utf-8")
    # data = p.stdout.read()
    # return data.strip()
    dmi = os.popen('dmidecode -s ' + keyword).read()
    return dmi.strip()

def get_hostname():
    """获取主机名"""
    hostname = os.popen('hostname').read()
    return hostname.strip()

def get_os():
    """操作系统信息"""
    os_version = os.popen('hostnamectl | grep "Operating System"').read()
    if "CentOS" in os_version:
        with open('/etc/redhat-release') as f:
            return f.read().strip()
    else:
        with open('/etc/issue') as f:
            return f.read().strip()

def get_cpu(keyword):
    """获取CPU的型号、物理CPU数量和逻辑CPU数量"""
    cpu_info = {}
    cpu_info["cpu_num_p"] = 0
    cpu_info["cpu_num_l"] = 0
    cpu_set = set()
    with open('/proc/cpuinfo') as f:
        for line in f:
            if line.startswith('model name'):
                cpu_info['cpu_model'] = line.split(':')[1].strip()
            if line.startswith('processor'):
                cpu_info['cpu_num_l'] += 1
            if line.startswith('physical id'):
                cpu_set.add(line.split(':')[1].strip())

    cpu_info["cpu_num_p"] = len(cpu_set)
    return str(cpu_info[keyword])

def get_memory():
    """获取内存"""
    with open('/proc/meminfo') as f:
        for line in f:
            if line.startswith('MemTotal'):
                mem = int(line.split()[1].strip())
                break
    mem = '%.3s' % (mem / 1024 / 1024) + ' GB'
    return mem

def get_disk():
    """磁盘统计"""
    disk_list = os.popen("lsblk | grep ^[a-z] | grep -Ev 'sr[0-9]*' | awk '{print$4}'").read().split()
    disk_set = set(disk_list)
    disk_dict = {}

    for i in disk_set:
        c = disk_list.count(i)
        disk_dict[i] = c
    # return disk_dict
    aa = ""
    for k, v in disk_dict.items():
        a = f"{k}*{v}"
        aa += " , " + a
    return aa.strip(" , ")

def get_ip():
    """获取ip信息"""
    # 获取ifconfig命令输出,并根据空行分段
    p = os.popen('ifconfig')
    data = p.read().split('\n\n')
    ip_list = []
    for lines in data:
        line_list = lines.split('\n')
        if ('RUNNING' in line_list[0]) and ('inet ' in line_list[1]) and ("lo" not in line_list[0]):
            ipaddr = line_list[1].strip().split()[1]
            ip_list.append(ipaddr)
    # return ip_list
    a = ""
    for i in ip_list:
        a += " , " + i
    return a.strip(" , ")

def output_format(k, v):
    """定义输出格式"""
    Len = 20
    filling = Len - len(k.encode('gbk'))
    return k + (" " * filling) + v

if __name__ == '__main__':
    dic = {}
    dic["服务器厂商"] = get_dmi("system-manufacturer")
    dic["服务器型号"] = get_dmi("system-product-name")
    dic["服务器序列号"] = get_dmi("system-serial-number")
    dic["服务器UUID"] = get_dmi("system-uuid")
    dic["主机名"] = get_hostname()
    dic["IP"] = get_ip()
    dic["操作系统"] = get_os()
    dic["CPU型号"] = get_cpu("cpu_model")
    dic["物理CPU"] = get_cpu("cpu_num_p")
    dic["逻辑CPU"] = get_cpu("cpu_num_l")
    dic["总内存"] = get_memory()
    dic["磁盘"] = get_disk()

    for k, v in dic.items():
        print(output_format(k+':', v))

执行结果:

[root@cp-3 hard_info]# python3 hard_info.py 
服务器厂商:         Red Hat
服务器型号:         KVM
服务器序列号:       Not Specified
服务器UUID:         5e6c5126-f3d5-4428-b537-d0282362542b
主机名:             cp
IP:                 10.244.0.1 , 10.60.77.22 , 10.244.0.0
操作系统:           CentOS Linux release 7.6.1810 (Core)
CPU型号:            Intel Xeon Processor (Icelake)
物理CPU:            2
逻辑CPU:            2
总内存:             7.5 GB
磁盘:               40G*1
Like
Like Love Haha Wow Sad Angry

发表评论