CMDB學習之一

 

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
相關文章
相關標籤/搜索