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)