1. 程式人生 > >cmdb第二天

cmdb第二天

方法 ict 獲取 result execute rom bug display policy

要點:

技術分享圖片
import importlib
import traceback

from lib.config.settings import settings


##插件管理類
class PluginsManager():
    def __init__(self, hostname=None):
        self.pluginSettings = settings.PLUGINS_DICT
        self.mode = settings.MODE
        self.hostname = hostname
        self.debug 
= settings.DEBUG if self.mode == ssh: self.ssh_port = settings.SSH_PORT self.ssh_username = settings.SSH_USERNAME self.ssh_pwd = settings.SSH_PWD self.ssh_hostname = settings.SSH_HOSTNAME def execute(self): # 1. 獲取配置 #
2. 循環執行 response = {} #獲取PLUGINS_DICT這個字典的 key與 values的值 for k,v in self.pluginSettings.items(): ret = {code: 1000, data: None} try: #k:basic v: src.plugins.basic.Basic module_name , class_name = v.rsplit(.
,1) #因為得到的是字符串,吧字符串當作模塊導入 m = importlib.import_module(module_name) cls = getattr(m,class_name) res = cls().process(self.command, self.debug) ret[data] =res response[k]=ret except Exception as e: ret[code] =1001 #註意traceback模塊可以直接顯示報錯的位置和內容,更直觀 ret[data] ="[%s] 模式下的主機 [%s] 采集[%s]出錯,出錯信息是:[%s]" % (self.mode, self.hostname if self.hostname else agent, k, traceback.format_exc()) response[k] = ret return response def command(self,cmd): if self.mode == agent: return self.__agent(cmd) elif self.mode == ssh: return self.__ssh(cmd) elif self.mode == salt: return self.__salt(cmd) else: return 只支持采集模式為:agent/ssh/salt模式 def __agent(self,cmd): import subprocess res = subprocess.getoutput(cmd) return res def __ssh(self,cmd): import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=self.ssh_hostname,port=self.ssh_port,username=self.ssh_username, password=self.ssh_pwd) stdin, stdount, stderr = ssh.exec_command(cmd) result = stdount.read() ssh.close() return result def __salt(self,cmd): import subprocess res_cmd = "salt ‘%s‘ cmd.run ‘%s‘" %(self.hostname,cmd) res = subprocess.getoutput(res_cmd) return res
__init__.py 文件是插片是管理的要點 技術分享圖片
class Basic(object):
    def __init__(self):
        pass

    
    #這裏執行就是__init__文件內的 res = cls().process(self.command, self.debug)
    #其實就是運行了 Basci().process方法
    def process(self,command_func,debug):
        if debug:
            output = {
                os_platform: linux,
                os_version: CentOS release 6.6 (Final)\nKernel \r on an \m,
                hostname: nod1.com
            }

        else:
            output = {
                os_platform: command_func("uname").strip(),
                os_version: command_func("cat /etc/issue").strip().split(\n)[0],
                hostname: command_func("hostname").strip(),
            }

        return output
收集基礎的信息 技術分享圖片
import os
from  lib.config.settings import settings

class Board(object):
    def __init__(self):
        pass
    @classmethod
    def initial(cls):
        return cls()

    def process(self,command_func,debug):
        if debug:
            output = open(os.path.join(settings.BASEDIR, files/board.out), r,encoding=utf-8).read()

        else:
            output = command_func("sudo dmidecode -t1")
        return  self.parse(output)

    def parse(self,content):
        result ={}
        key_map = {
            Manufacturer: manufacturer,
            Product Name: model,
            Serial Number: sn,
        }

        for item in content.split(\n):
            #進行切片,成為列表形式
            row_data = item.strip().split(:)
            #過濾,顯示想要的,當列表中有2個值說明是我們想要的
            if len(row_data) ==2:
                #如果索引1的key值是在key_map中,進行過濾
                if row_data[0] in key_map:
                    result[key_map[row_data[0]]] = row_data[1].strip() if row_data[1] else row_data[1]

        return  result
收集主板的信息,然後進行清洗拿到想要的數據

cmdb第二天