CMDB项目实战二

1.收集服务器信息的代码

    代码可能出现的问题:
            - 代码重复
               a. 可以写一个公共的方法:
               b. 可以写一个父类方法
            - 代码 高内聚 低耦合

    收集的信息:
            - 主板信息 (hostname, sn号)
            - cpu信息(型号, 几个cpu等)
            - disk磁盘信息 (大小,几块)
            - 内存memory信息
            - 网卡信息

    可插拔式的插件收集上述信息:
            - 配置文件
                PLUGINS_DICT = {
                    'basic': 'src.plugins.basic.Basic',
                    'cpu': 'src.plugins.cpu.Cpu',
                    'disk': 'src.plugins.disk.Disk',
                    'memory': 'src.plugins.memory.Memory',
                    'nic': 'src.plugins.nic.Nic',
                }
  

        - 插件的两种解决方案:
            a. 写一个公共的类
                让其他的所有的类取继承Base这个基类

            b. 高度进行抽象封装

        实现当初的梦想:
            1. 可插拔式的插件
            2. 插件的__init__文件进行升级

2.唯一标识问题(agent的大坑)

问题是:
            实体机的SN号和我们虚拟机的sn号,共用一个
            
        解决:
            如果公司不采集虚拟机的信息, 可以用SN做唯一标识,来进行更新
            else
            如果公司要采集虚拟机的信息, sn号此时不能使用
            
        标准流程:
            - 服务器放置的机房,机架,几层
            - 设置每台服务器的主机名
            
        db:
            第一次采集数据:
                hostname: c1.com   disk: 128G 
        
            第N天提交数据:
                hostname: c111.com   disk: 256G
        
        解决方案:
            将第一次采集的主机名写入到文件中,此后永远以文件中的主机名为准
代码:

 hostname = server_info['basic']['data']['hostname']
        res = open(os.path.join(setting.BASEDIR, 'config/cert'), 'r', encoding='utf-8').read()
        if not res.strip():
            with open(os.path.join(setting.BASEDIR, 'config/cert'), 'w', encoding='utf-8') as fp:
                fp.write(hostname)
        else:
            server_info['basic']['data']['hostname'] = res

        使用进程池和线程池解决并发的问题:

from concurrent.futures import ThreadPoolExecutor
p = ThreadPoolExecutor(10)
for hostname in hostnames:
    p.submit(self.run, hostname)

猜你喜欢

转载自blog.csdn.net/qq_17513503/article/details/88179591