• cmdb知识总结


    cmdb面试

    1.paramiko模块的作用与原理

    2.cmdb是什么

    3.为什么要开发CMDB?

    4.你们公司有多少台服务器?物理机?虚拟机?

    5.你的CMDB是如何实现的?

    6.CMDB都用到了哪些表?

    7.多少人开发?

    8.开发了多久?

    9.你的程序有什么重大Bug或者难以忘记的经历?

    10.CMDB中的资产采集的技术点

    11.cmdb资产采集后,为什么不直接放到数据库?

    12.手写单利模式(new+锁)?

    13.其他单例模式?

    14.__new__方法返回的是什么?

    15.单例模式应用场景

    16.获取资产的命令

    17.api中用到的技术点

    18.判断今天是否未采集的资产

    1、paramiko模块的作用与原理
    作用:用于帮助开发者通过代码远程连接服务器,并对服务器进行操作。
     原理:利用SSH连接服务器
    2、cmdb是什么
    “CMDB即配置管理数据库,有时也被称为运营自动化,通过识别、控制、维护,检查企业的IT资源,从而高效控制与管理不断变化的IT基础架构与IT服务,
    并为其它流程,例如事故管理、问题管理、变更管理、发布管理等流程提供准确的配置信息。”
    3、为什么要开发CMDB?
    公司以后想要搭建自动化运维平台,CMDB是搭建平台的基石。
     目前而言,公司资产信息不够准确,因为都维护在excel中,维护主要人,通过CMDB可以自动采集资产信息以及做资产变更记录
    4、你们公司有多少台服务器?物理机?虚拟机?
    70台左右物理机
     ​
     戴尔品牌的服务器
    5、你的CMDB是如何实现的?
    cmdb是由三部分组成,其中包含:资产采集的中控机、API、资产管控平台
         - 对于资产采集部分,通过paramiko远程操作服务器(本质SSH)并采集资产信息,然后将资产信息汇报到API,
    在资产采集部分还继承了可扩展的功能,让我们定制插件时可以更加方便,实现起来也比较简单,参考django中间件的原理、开发封闭原则、工厂模式实现可插拔式的插件
    - api,基于restful规范和drf组件来实现完成,主要做资产入库以及资产变更处理 - 资产管控平台,对资产数据进行数据呈现和报表的处理
    6、CMDB都用到了哪些表?
    用户表
     部门
     机房IDC
     服务器
     硬盘
     网卡
     内存
     变更记录
     ​
     菜单表
     权限表
     角色表
     角色和权限关系
     用户和角色关系
    7、多少人开发?
    1个人/两个人 + 运维人员
    8、开发了多久?
    3个月~6个月
     质疑时间短,开发资产采集很简单,资产管控平台也是由你来开发

    资产中控机

    9、你的程序有什么重大Bug或者难以忘记的经历?
    对于bug没有太多印象,主要是在想怎么优化我的资产采集部分中的代码,后来参考了django中的中间件的源码和工厂模式、开发封闭原则实现了可以自由配置的插件。
    10、CMDB中的资产采集的技术点
    • paramiko模块

    • pymysql操作数据库

    • 单例模式(日志中应用)

    • 日志

    • 堆栈信息

    • 对象进行数据封装 BaseReponse

      class BaseResponse(object):
           def __init__(self):
               self.status = True
               self.data = None
               self.error = None
       ​
           @property
           def dict(self):
               return self.__dict__
    • 类的约束

    class BasePlugins:
         def process(self, hostname, func):
             raise NotImplementedError(f"{self.__class__.__name__}类必须定义process方法")
    • 通过字符串的形式导入一个模块

    import importlib
     module = importlib.import_module("xxx.xx.xx.csss")
    • 反射,通过字符串形式去操作对象中属性

     getattr:通过字符串得到对象或者方法
     setattr:把setattr(self, sex, '')变为sex=男
     delattr:不经常用
     hasattr:判断对象中是否有这个对象或者方法
    • 线程池的应用

    • 导入包时,自动加载 __init__.py文件

    • requests模块的应用,向网页发送请求并且可以模拟请求方法

     requests.get(url='...')
     ​
     requests.post(url="...",data={})
     ​
     requests.post(url="...",json={})
    • traceback 获取程序报错位置等详细信息

       import traceback
       msg = traceback.format_exc()
       loggers.log(msg)
    • 运用了配置文件

      • settings中定义DEBUG,判断是否要用文件的格式获取数据方便调试。

    • # 需要获得信息的类和路径
       GET_DICT = {
           # "board": "lib.plugins.board.Board",
           # "cpu": "lib.plugins.cpu.Cpu",
           "disk": "lib.plugins.disk.Disk",
           # "memory": "lib.plugins.memory.Memory",
           # "nic": "lib.plugins.nic.Nic",
       }
       ​
       # linux系统接口
       SYSTEM_PORT = 22
       ​
       ​
       # linux用户名
       SYSTEM_USER = "root"
       ​
       ​
       # 线程数量
       THREAD_NUM = 10# 是否使用文件传数据
       DEBUG = False
       ​
       # 是SSH还是SALT模式
       MODE = "SSH"  # SSH或SALT
    • 开放封闭原则

     配置开放
     源码封闭
    • 工厂模式——详细请见扩展

       概念:工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。
       简单解释:工厂模式依然是一种创建型设计模式,作为工厂,它所关心的是产品的产生,也就是对象的创建,
      我们利用工厂来创建对象,而不必我们亲自创建对象,我们无需去理解如何创建对象,只需要向工厂提出要求,让工厂去根据你的要求,给你生产你要的产品,给你相应的对象,这种模式便叫做工厂模式。 ​ 工厂模式的优点:
      - 松耦合,对象的创建独立于类的实现 - 客户端无需了解创建对象的类,只需知道需要传递的接口,方法和参数就能够创建所需要的对象 - 很容易扩展工厂添加其他类型对象的创建,而使用者只需要改变参数就可以了
    11、cmdb资产采集后,为什么不直接放到数据库?
    • 单独编写api,为了给其他系统提供数据支持(接口)

    • 维护的数据库连接比较多,修改不方便

    12、手写单利模式(new+锁)?
     import threading
     ​
     class Singleton(object):
         instance = None
         lock = threading.RLock()
         
         def __new__(cls, *args, **kwargs):
             if cls.instance:
                 return cls.instance
             with cls.lock:
                 if not cls.instance:
                     cls.instance = object.__new__(cls)
                     return cls.instance
                 return cls.instance
    13、其他单例模式?
    • 装饰器

     def Singleton(cls):
         _instance = {}
     ​
         def _singleton(*args, **kargs):
             if cls not in _instance:
                 _instance[cls] = cls(*args, **kargs)
             return _instance[cls]
     ​
         return _singleton
     ​
     ​
     @Singleton
     class A(object):
         a = 1def __init__(self, x=0):
             self.x = x
     ​
     ​
     a1 = A(2)
     a2 = A(3)
    • 使用类

       import time
       import threading
       class Singleton(object):
           _instance_lock = threading.Lock()
       ​
           def __init__(self):
               time.sleep(1)
       ​
           @classmethod
           def instance(cls, *args, **kwargs):
               if not hasattr(Singleton, "_instance"):
                   with Singleton._instance_lock:
                       if not hasattr(Singleton, "_instance"):
                           Singleton._instance = Singleton(*args, **kwargs)
               return Singleton._instance
       ​
       ​
       def task(arg):
           obj = Singleton.instance()
           print(obj)
       for i in range(10):
           t = threading.Thread(target=task,args=[i,])
           t.start()
       time.sleep(20)
       obj = Singleton.instance()
       print(obj)
    • 基于metaclass方式实现——主要知识点当类实例化对象的时候调用__call__方法

       import threading
       ​
       class SingletonType(type):
           _instance_lock = threading.Lock()
           def __call__(cls, *args, **kwargs):
               if not hasattr(cls, "_instance"):
                   with SingletonType._instance_lock:
                       if not hasattr(cls, "_instance"):
                           cls._instance = super(SingletonType,cls).__call__(*args, **kwargs)
               return cls._instance
       ​
       class Foo(metaclass=SingletonType):
           def __init__(self,name):
               self.name = name
       ​
       ​
       obj1 = Foo('name')
       obj2 = Foo('name')
       print(obj1,obj2)
    14、__new__方法返回的是什么?
    新创建的对象,内部没有数据,需要经过init来进行初始化!
    15、单例模式应用场景
    • django的配置文件

    • django的admin

    • 数据库连接池

    • 日志功能

    16、获取资产的命令
     内存信息——sudo dmidecode -q -t 17 2>/dev/null
         注意:linux上要提前安装 yum install dmidecode
     ​
     硬盘(安装MegaCli)——sudo MegaCli -PDList -aALL
     ​
     网卡——sudo ip link show
          sudo ip addr show
          
     主板——sudo dmidecode -t1
     ​
     CPU——cat /proc/

    api

    17、api中用到的技术点
     中控机汇报到api的资产需要做入库以及变更记录的处理。
         - 由于资产采集时是利用工厂模式实现可扩展插件,方便与扩展。在api端也是使用相同模式,对插件进行一一处理。
         - 在处理资产信息时候,对操作进行交集和差集的处理从而得到删除/更新/新增资产
         - 在内部通过反射进行资产变更记录的获取,最终将资产以及变更记录写入数据库。
         - orm批量增加数据:bulk_create([],10)
    18、判断今天是否未采集的资产
     通过日期来判断,如果时间是今天之前就是没有采集
     通过Q实现复杂的SQL查询

    回到顶部

  • 相关阅读:
    Android 性能优化 四 布局优化merge标签的使用
    一种Android换肤机制的实现
    java提高篇(十)-----详解匿名内部类 ,形参为什么要用final
    Android源码之Matrix
    android 沉浸式状态栏
    [置顶]关于java中根据身份证求生日和年龄的问题
    将博客搬至CSDN
    android——fragment长时间home或者锁屏java.lang.IllegalArgumentException:No view found for id for....
    百度搜索附近加盟店等基于LBS云搜索功能的实现
    android——拍照,相册图片剪切其实就这么简单
  • 原文地址:https://www.cnblogs.com/NiceSnake/p/11919083.html
Copyright © 2020-2023  润新知