CMDB可插拔式專案架構(一)

2021-09-24 18:02:55 字數 4634 閱讀 8911

----bin

----start.py

----conf

----setting.py (使用者自定義部分)

----files

----board.text

----……………

----disk.text

(一些死資料,debug模式下使用)

----lib (用於存放類庫檔案,常見內外部工具包)

----config

----global_settings.py (預設全域性配置)

----settings.py (配置類物件)

----src (原始碼目錄)

----plugins (外掛程式目錄,可插拔元件)

----init.py

----basic.py

----cpu.py

----disk.py

----memory.py

----nic.py

----test

—test1 (存放測試檔案的目錄)

start.py

from lib.config.settings import  settings

from src.plugins import basic,cpu,disk,memory,nic

from src.plugins import pluginsmanager #會自動執行__init__檔案

if __name__ ==

'__main__'

: pluginsmanagerobj = pluginsmanager(

) result = pluginsmanagerobj.excute(

)print

(result)

setting.py

### 自定義的配置

mode =

'ssh'

debug =

true

#可插拔式

plugins_dict =

#ssh專用

ssh_user =

'root'

ssh_pwd =

'1'ssh_port =

22

settings.py

from conf import setting

from

.import global_settings

class

settings()

:def

__init__

(self)

:### 整合預設配置檔案中的配置

for key in

dir(global_settings)

:if key.isupper():

v =getattr

(global_settings, key)

setattr

(self, key, v)

#把符合條件的key和value繫結到self上

### 整合自定義配置檔案中的配置

for key in

dir(setting)

:if key.isupper():

v =getattr

(setting, key)

setattr

(self, key, v)

@staticmethod

defhostname

(self)

:if setting.mode ==

'ssh'

: self.hostname =

['mypc'

]return self.hostname

settings = settings(

)

__init__.py (採集配置檔案中的外掛程式)

from lib.config.settings import settings  #例項化的settings配置類物件

import importlib

class

pluginsmanager

(object):

def__init__

(self,hostname=

none):

self.response =

self.plugins_dict = settings.plugins_dict

self.mode =settings.mode

self.debug = settings.debug

if self.mode ==

'ssh'

: self.hostname = settings.hostname

self.port = settings.ssh_port

self.username = settings.ssh_user

self.password = settings.ssh_pwd

### 管理配置檔案中採集的外掛程式

defexcute

(self)

:#獲得setting配置中使用者自定義的plugins_dict,檢視有哪些plugin需要遍歷。

for k,v in self.plugins_dict.items():

# print(k,v)

module_name,class_name = v.rsplit(

'.',1)

#以最右邊的"."作分割符,做次數為1的分割。

### 將乙個包以字串形式匯入

module_path = importlib.import_module(module_name)

cls =

getattr

(module_path,class_name)

#獲得 src.plugins.basic下的 basic類物件

collect = cls(

).process(self._cmd_run,self.debug)

#例項化後執行process 進行採集

self.response[k]

= collect

return self.response

def_cmd_run

(self,cmd)

:if self.mode ==

'agent'

:import subprocess

res = subprocess.getoutput(cmd)

ipinfo = res[10:

20]# 省略切割**

return ipinfo

elif self.mode ==

'ssh'

:import paramiko

# 建立ssh物件

ssh = paramiko.sshclient(

)# 允許連線不在know_hosts檔案中的主機

ssh.set_missing_host_key_policy(paramiko.autoaddpolicy())

# 連線伺服器

ssh.connect(hostname=self.hostname, port=self.port, username=self.username, password=self.username)

# 執行命令

stdin, stdout, stderr = ssh.exec_command(cmd)

# 獲取命令結果

result = stdout.read(

)# 關閉連線

ssh.close(

)return result

elif self.mode ==

'salt'

:import subprocess

res = subprocess.getoutput(

"salt '%s' cmd.run 'ifconfig'"

%cmd)

return res

else

:raise exception(

"當前僅支援模式agent、ssh、salt三種模式"

)

basic.py

###採集伺服器基本的資訊,包含《平台、系統版本、主機名》等

from

.base import base

class

basic

(base)

:def

process

(self,command_func,debug)

:#command_func傳入linux 下的cmd命令,debug為是否為除錯模式(除錯模式就用死資料)

if debug:

output =

else

: output =

return output

defparse_response

(self,res)

:### 具體清洗資料

pass

該專案模仿django寫了乙個可插拔式的資料採集系統,實現了以下幾個功能

CMDB可插拔式專案(二)

完善採集功能 post的資料獲取 request.body才會將資料封裝給request.post方法 requests 模組 post 資料的方式 a.requests.post settings.api url,data json.dumps res b.requests.post settin...

可插拔式 元件設計,領略元件開發的奧秘

從乙個confirm元件開始,一步步寫乙個可插拔式的元件。處理乙個正常的支付流程 比如支付寶購買 點選購買按鈕 如果風險等級不匹配則 彈確認框 confirm 使用者確認風險後 彈出支付方式選擇彈窗 dialog 選擇好支付方式後 彈窗呼叫指紋驗證 dialog 如果關閉指紋驗證 提示是否輸入密碼 ...

可復用響應式框架構建

可復用響應式框架構建 你呼叫庫,框架呼叫你。框架控制整個流程。框架的侵入性很高 從頭到尾 使用框架的時候,需要把你的 放到框架合適的地方 在指定事件裡寫你的 框架會在合適的時機呼叫你的 框架通過回叫事件呼叫你的 事件即是回叫函式,回叫函式即是事件。做框架的時候,不要想著怎麼操作介面,而要想著如何運算...