CMDB 资产采集——插件可插拔式可拓展思想
Posted fanggege
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMDB 资产采集——插件可插拔式可拓展思想相关的知识,希望对你有一定的参考价值。
功能描述
每个资产采集的插件都是一个独立的py脚本统一放在一个目录下,所有插件的路径统一配置在settings.py 配置文件中,以字典形式配置。通过for 循环字典中插件逐个执行插件采集数据。增加新的插件时编写脚本放入,在配置文件中增加响应路径配置,当有些数据不需要采集时注释掉settings.py中配置即可。此为可插拔、可拓展方式。
config/settings.py 配置文件中插件注册配置
PLUGIN_DICT = { ‘disk‘:‘src.plugins.disk.Disk‘, #对应value 为采集disk 的类的路径 ‘memory‘:‘src.plugins.memory.Memory‘, ‘network‘:‘src.plugins.network.Network‘, }
启动资产采集项目后根据配置文件上配置的采集模式,执行响应模式引擎的脚本,这里以agent /ssh 模式为例
src/engin/agent.py
from .base import BaseHandler from ..plugins import get_server_info class AgentHandler(BaseHandler): def cmd(self,command,hostname=None): import subprocess return subprocess.getoutput(command) #command 为资产采集的命令例如内存采集“free -m”,采集后的数据通过getouput 收集 def handler(self): """ 处理Agent模式下的资产采集:网卡、内存、硬盘 :return: """ # 通过调用get_server_info获取所有的资产信息:网卡、内存、硬盘,把AgentHandler 类通过self 作为参数传递给get_server_info最终传递给资产采集插件 info = get_server_info(self) print(‘agent‘,info)
src/engin/ssh.py ssh 模式下代码
from config import settings from .base import BaseHandler from ..plugins import get_server_info class SSHHandler(BaseHandler): #cmd 函数为ssh 模式的远程登录命令,需要远程登录的主机名与登陆后执行的命令作为参数 def cmd(self, command, hostname=None): """ 调用paramiko远程连接主机并执行命令,依赖rsa :param hostname:主机名 :param command: 要执行的命令 :return: """ import paramiko private_key = paramiko.RSAKey.from_private_key_file(settings.SSH_PRIVATE_KEY) ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=hostname, port=settings.SSH_PORT, username=settings.SSH_USER, pkey=private_key) stdin, stdout, stderr = ssh.exec_command(command) result = stdout.read() ssh.close() return result # def handler(self): """ 处理SSH模式下的资产采集 :return: """ print(‘ssh模式‘,get_server_info(self))
src/plugins/__init__.py get_server_info 函数循环资产采集插件字典,逐个执行插件采集数据存入字典并返回信息
from config import settings from lib.module_string import import_string def get_server_info(handler,hostname=None): #hostname=None 默认为空,传递参数时可以不传递,也不会报错 """ 循环所有的插件,获取所有的资产信息,然后返回 :param handler: :return: """ info = {} for name,path in settings.PLUGIN_DICT.items(): cls = import_string(path) #import_string 为通过importlib getattr 导入类的函数 obj = cls() # obj 为资产采集插件,每个插件都有一个process 方法进行资产采集;handler 为AgentHandler/SSHHandler类 result = obj.process(handler,hostname) info[name] = result #{‘disk‘:100G,‘memory‘:16G,‘network‘:xxxxxx} return info
src/plugins/disk.py memory.py 资产采集插件
class Disk(object): def process(self,handler,hostname): """ 获取硬盘信息 :return: """ result = handler.cmd(‘dir‘,hostname) #handler 为模式引擎的类AgentHandler/SaltHandler return result
class Memory(object): def process(self, handler, hostname): """ 获取内存信息 :return: """ result = handler.cmd(‘wmic memorychip‘, hostname) #handler 为模式引擎的类AgentHandler/SaltHandler return result
代码逻辑调用解析
模式引擎类 AgentHandler/SaltHandler 中定义了两个方法1、函数cmd 为各个模式资产采集命令执行前的登录等前期操作 2、函数handler 为调用 get_server_info(self) ,通过get_server_info 读取配置文件中插件注册信息,
for 循环逐个执行插件,采集信息以字典形式返回。通过 self 参数把AgentHandler等类在get_server_info 调用disk.py 插件时传递给disk.py 中的process 函数.在执行每个插件时,每个插件的process中都是通过handler 接收
AgentHandler 等类,在执行类中的远程登录函数,远程等候后执行信息查询命令。
以上是关于CMDB 资产采集——插件可插拔式可拓展思想的主要内容,如果未能解决你的问题,请参考以下文章