CMDB - 配置管理數據庫 資產管理python
自動化相關的平臺(基礎 CMDB):
1. 發佈系統
2. 監控
3. 配管系統、裝機
4. 堡壘機
CMDB的目的:
1. 替代EXCEL資產管理 —— 資產不許確
2. 與監控系統聯動
3. 自動裝機
指望:資產管理 數據庫
實現原理:
1. agent 機器多的時候
2. ssh
3. saltjson
實現兼容三種模式,可擴展性
基礎的架構:
1. 資產採集的代碼
2. API
3. 管理平臺
################
今天的目標:
資產採集:
- 資產採集代碼
python的腳本
- api
Django api
建立項目:
資產採集
auto_clent:
agent模式:
1. 採集資產信息
2. 使用requests模塊發POST請求提交的資產信息,交給api,持久化
ssh模式:
1. 獲取未採集的主機列表
2. 遠程鏈接(ssh)上指定的主機,執行命名採集資產信息
3. 使用requests模塊發POST請求提交的資產信息服務器
salt模式:
1. 獲取未採集的主機列表
2. 遠程鏈接(salt)上指定的主機,執行命名採集資產信息
3. 使用requests模塊發POST請求提交的資產信息
知識點:
1. csrf_exempt 某個視圖不須要檢驗CSRF
2. requests模塊 data={} url編碼 Django中取 request.POST
data = json字符串 request.POST沒有值 ——》 request.body
3. 處理錯誤信息:
不要用e traceback.format_exc() 錯誤堆棧
4. 惟一標識:
物理機 s/n號
物理機 + 虛擬機:
主機名 + 文件
規則:
1. 新的機器 以主機名的一個空的文件 採集信息存到文件中 當前是新增
2. 老的機器 改主機名 文件內容更新 當前變動 文件名也更新
5. 返回值:
r1.content, byte
r1.text, 字符串
r1.json(), 反序列化的結果
6. 線程池:
from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor(10)
for host in host_list:
pool.submit(task,host)
7. 遵循的原則:
開放封閉原則:
開放: 配置
封閉: 源碼架構
###############################################app
首先模塊設計,資產採集方式 第一個種是Agent的方式採集ssh
第二種採集方式採用中間控件機制,中控件機,首先要獲取未採集數據信息的列表,而後去服務器去採集編碼
資產採集客戶端目錄規劃開始 建立一個項目目錄這個,這個是採集目錄,是直接運行在服務器程序,url
auto_client的目錄規劃
bin執行文件,
config配置文件,
lib公共庫,
src程序邏輯,
log日誌
執行入口bin 開始
bin
clinet.py
import os, sys sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from src.script import run if __name__ == '__main__': run()
邏輯文件
src
engine (建立採集目錄)
agent.py
class AgnetHandler(object):
def handler(self): """ Agent模式下處理資產採集 :return: """
print('agent模式')
salt.py
class SaltHandler(object): def handler(self): """ Salt模式下處理資產採集 :return: """
print(‘salt模式’)
ssh.py
class SSHHandler(object): def handler(self): """ SSH模式下處理資產採集 :return: """
print('SSH模式')
script.py
from config import setting
from src.engine import agent,salt,ssh
def run():
"""
資產採集入口
:return:
"""
if setting.ENGINE == 'agent':
obj =agent.AgnetHandler()
obj.handler()
elif setting.ENGINE == 'salt':
obj = salt.SaltHandler()
obj.handler()
elif setting.ENGINE == 'ssh':
obj=ssh.SSHHandler()
obj.handler()
else:
print("不支持這個模式採集")
#這種是簡單工廠模式
作可插拔的程序,寫在配置文件,選項使用那一種方式去採集數據
config
settings.py
ENGINE='agent' #支持agent,salt,SSH數據採集
#########################上面的比較low 下面用反射實現
#利用反射的方式,執行採集方法,首先在配置文件寫一個字典
#利用反射執行採集,開發封閉原則 ENGINE_HANDLERS = { 'agent':'src.engine.AgnetHandler', 'salt':'src.engine.SaltHandler', 'ssh':'src.engine.SSHHandler', }
script.py
from config import setting # from src.engine import agent,salt,ssh import importlib def run(): """ 資產採集入口 :return: """ # if setting.ENGINE == 'agent': # obj =agent.AgnetHandler() # obj.handler() # elif setting.ENGINE == 'salt': # obj = salt.SaltHandler() # obj.handler() # elif setting.ENGINE == 'ssh': # obj=ssh.SSHHandler() # obj.handler() # else: # print("不支持這個模式採集") #利用反射的方式,執行採集方法,首先在配置文件寫一個字典 engine_path = setting.ENGINE_HANDLERS.get(setting.ENGINE) #拿到採集模式的腳本的執行路徑 #'src.engine.agnet.AgnetHandler' 使用rsplit進行右分割,只是分割一次 path,engine_class=engine_path.rsplit('.',maxsplit=1) #拿到執行模式腳本的類,使用importlib,導入 # print(path,engine_class) module = importlib.import_module(path) # print(module,type(module)) obj=getattr(module,engine_class)() #反射並實例化 obj.handler()
而後能夠把反射寫一個公用的插件
在lib 建立一個文件,module.srting.py
import importlib def import_sting(path): module_path,engine_class=path.rsplit('.',maxsplit=1) module = importlib.import_module(module_path) return getattr(module,engine_class)
我在script.py 在修改下
from config import setting from lib.module_srting import import_sting def run(): """ 資產採集入口 :return: """ #利用反射的方式,執行採集方法,首先在配置文件寫一個字典 engine_path = setting.ENGINE_HANDLERS.get(setting.ENGINE) #拿到採集模式的腳本的執行路徑 engine_class = import_sting(engine_path) obj=engine_class() #反射並實例化 obj.handler()
全部採集數據方法,都進行約束
class BaseHandler(object): def handler(self): ''' 約束派生類 :return: ''' raise NotImplementedError('handler() must Implemented han')
每個 方法都要導入 基類進行繼承,agent,salt ,ssh 都要繼承
from .base import BaseHandler class AgnetHandler(BaseHandler): def handler(self): """ Agent模式下處理資產採集:硬盤、內存、網卡 :return: """ print('agent模式') #調用pulugins.disk /plugins.momory /plugins.nerwork