• CMDB学习之一


    CMDB - 配置管理数据库 资产管理


      自动化相关的平台(基础 CMDB):
        1. 发布系统
        2. 监控
        3. 配管系统、装机
        4. 堡垒机

      CMDB的目的:
        1. 替代EXCEL资产管理 —— 资产不准确
        2. 与监控系统联动
        3. 自动装机

    期望:资产管理

       实现原理:
        1. agent 机器多的时候
        2. ssh
        3. salt

      实现兼容三种模式,可扩展性

      基础的架构:
        1. 资产采集的代码
        2. API
        3. 管理平台
    ################
    今天的目标:
      资产采集:
      - 资产采集代码
      python的脚本
      - api
      Django


    创建项目:
      资产采集
        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. 遵循的原则:
          开放封闭原则:
          开放: 配置
          封闭: 源码

    ###############################################

    首先模块设计,资产采集方式 第一个种是Agent的方式采集

    第二种采集方式采用中间控件机制,中控件机,首先要获取未采集数据信息的列表,然后去服务器去采集

    资产采集客户端目录规划开始  创建一个项目目录这个,这个是采集目录,是直接运行在服务器程序,

        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
  • 相关阅读:
    properties 插件安装
    FineReport 安装教程
    Red/Black Tree 演示
    java 日期转化
    Tomcat使用Log4j按天生成日志 亲测可行
    服务器初始化
    ubuntu-rc.local
    django-views
    https tcp ssl
    svn
  • 原文地址:https://www.cnblogs.com/michael2018/p/10405861.html
Copyright © 2020-2023  润新知