1. 程式人生 > >CMDB 資產采集——插件可插拔式、可拓展思想

CMDB 資產采集——插件可插拔式、可拓展思想

資產采集 pat eve nbsp sel one ddp pre ram

功能描述

每個資產采集的插件都是一個獨立的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, }
View Code

啟動資產采集項目後根據配置文件上配置的采集模式,執行響應模式引擎的腳本,這裏以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)
View Code

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))
View Code

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
View Code

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
View Code 技術分享圖片
class Memory(object):
    def process(self, handler, hostname):
        """
        獲取內存信息
        :return:
        """
        result = handler.cmd(wmic memorychip, hostname)   #handler 為模式引擎的類AgentHandler/SaltHandler
        return result
View Code

代碼邏輯調用解析

模式引擎類 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 資產采集——插件可插拔式、可拓展思想