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__文件进行升级

遇到的问题:

唯一标识问题(这个仅限于第一个agent方案):

问题是:
        实体机的SN号和我们虚拟机的sn号,共用一个
            
        解决:
            如果公司不采集虚拟机的信息, 可以用SN做唯一标识,来进行更新
            else
            如果公司要采集虚拟机的信息, sn号此时不能使用

我们应该制定标准流程:

第一次录入主机名和资产信息是唯一的
- 服务器放置的机房,机架,几层 - 设置每台服务器的主机名
db:
    第一次采集数据:
    hostname: c1.com   disk: 128G 
        
    第N天提交数据:
    hostname: c111.com   disk: 256G
解决方案:
       将第一次采集的主机名写入到文件中,此后永远以文件中的主机名为准

 

使用进程池和线程池解决并发的问题,提高效率:

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

 

 

1.服务端API验证:

第一关:设置超时时间

第二关:通过MD5验证TOKEN是否被修改

第三关:验证是否重复,(维护了一个列表,防止列表过大,可以删除一些超时的key)

 

ps:为了再次防止安全性问题,使用AES加密数据 

 

2.服务器表的设计:

 

posted @ 2019-01-09 21:16  粗糙的丸子  阅读(118)  评论(0)    收藏  举报