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 = 1
​
def __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查询

回到顶部

cmdb知识总结的更多相关文章

  1. web前端基础知识-(八)Django进阶之数据库对象关系映射

    Django ORM基本配置 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...

  2. Python 学习第十九天 django知识

    一,django 知识总结 1,同一个name属性的标签,多个值获取 <form action="/login/" method="POST" encty ...

  3. 运维知识体系v0.5

    http://www.90qj.com/?post=318http://ixdba.blog.51cto.com/2895551/1751377   运维知识体系v0.5-(运维社区-赵班长出品,欢迎 ...

  4. Python Django CMDB项目实战之-2创建APP、建模(models.py)、数据库同步、高级URL、前端页面展示数据库中数据

    基于之前的项目代码来编写 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页index页文章页面 现在我们修改一个文章列表是从数据库中获取数据, 下面我们就需 ...

  5. CMDB(Configuration Management Database)资产管理系统和 运维自动化

    一.传统运维方式和自动化运维的区别 二.CMDB的介绍 三.CMDB的四种方式 四.项目的目录架构介绍以及配置文件的升级编写 五.比较low的项目架构书写 六.可插拔式收集资产 七.对收集的服务器信息 ...

  6. ansible学习基础知识和模块(一)

    基础知识补充: 常用自动化运维工具 Ansible:使用python来开发的,无需设置Agentless(代理),一般管理几百台.与ssh的方式也不一样,ssh是基于c/s模式(客户端+服务器)来使用 ...

  7. linux运维需要掌握什么知识?linux运维学习路线

    linux运维需要掌握什么知识?这个问题算是老生常谈了,但是本人认为知道需要掌握什么知识不是重点,重点是我们需要知道运维是做什么的?再来根据工作需求去讨论需要学习什么知识才是正途,须知知识是学不完的, ...

  8. [py]软件编程知识骨架+py常见数据结构

    认识算法的重要性 - 遇到问题? 学完语言,接到需求,没思路? 1.学会了语言,能读懂别人的代码, 但是自己没解决问题的能力,不能够把实际问题转换为代码,自己写出来.(这是只是学会一门语言的后果),不 ...

  9. 存储配置关系&知识图谱

    14年前注册的Blog还是能用的,撸一个S(storage)-CMDB Demo发一小博 什么是图库 图形数据库是NoSQL数据库的一种类型,它应用图形理论存储实体之间的关系信息.图形数据库是一种非关 ...

随机推荐

  1. maven 学习---Maven本地资源库

    Maven的本地资源库是用来存储所有项目的依赖关系(插件jar和其他文件,这些文件被Maven下载)到本地文件夹. 很简单,当你建立一个Maven项目,所有相关文件将被存储在你的Maven本地仓库. ...

  2. android studio学习----Android Studio导入github下载的工程--替换方法

    http://www.cnblogs.com/liuling/p/2015-9-16-01.html 这种方法是可行的,主要是先自己创建一个project ,然后把没有的文件夹都复制过去就OK了,特别 ...

  3. 盘点当下大热的7大Github机器学习创新项目

    哪个平台有最新的机器学习发展现状和最先进的代码?没错——Github!本文将会分享近期发布的七大GitHub机器学习项目.这些项目广泛覆盖了机器学习的各个领域,包括自然语言处理(NLP).计算机视觉. ...

  4. 如何用StatSVN统计SVN服务器某项目的代码量

    startsvn下载地址: https://sourceforge.net/projects/statsvn/?source=typ_redirect svn下载地址: https://www.vis ...

  5. 数据库系统(四)---关系型数据库设计及E-R图

    1.关系型数据库: 关系型数据库是一类采用关系模型作为逻辑数据模型的数据库系统,遵从数据库设计的基本步骤,包括:需求分析.概念结构设计.逻辑结构设计.物理结构设计.数据库实施.数据库的运行和维护等阶段 ...

  6. Kubernetes port-forward

    命令格式: kubectl port-forward <pod_name> <forward_port> --namespace <namespace> --add ...

  7. Linux服务器安全加固

    关于对公司网站服务器安全加固的一些想法及思路: 一.修改密码和ssh登录端口,并且尽可能的用密钥对登录,禁止用密码登录(主要针对Linux)二.修改/etc/hosts.allow 设置仅仅允许某几台 ...

  8. 织梦dedecms后台文件media_add.php任意上传漏洞解决办法

    织梦在安装到阿里云服务器后阿里云后台会提示media_add.php后台文件任意上传漏洞,引起的文件是后台管理目录下的media_add.php文件,下面跟大家分享一下这个漏洞的修复方法: 首先找到并 ...

  9. 网络协议 19 - RPC协议综述

    这几年微服务很火,想必各位博友或多或少的都接触过.微服务概念中, 各服务间的相互调用是不可或缺的一环.你知道微服务之间是通过什么方式相互调用的吗?     你可能说,这还不简单,用 socket 呗. ...

  10. 深入js系列-语法

    语法 语句和表达式 我们用英语的术语来说明它们的区别 "句子"(sentence)是完整表达某个意思的一组词,由一个或多个"短语"(phrase)组成,它们之间 ...