CMDB介绍

CMDB --Configuration Management Database 配置管理数据库, CMDB存储与管理企业IT架构中设备的各种配置信息,它与所有服务支持和服务交付流程都紧密相联,支持这些流程的运转、发挥配置信息的价值,同时依赖于相关流程保证数据的准确性。

在实际的项目中,CMDB常常被认为是构建其它ITIL流程的基础而优先考虑,ITIL项目的成败与是否成功建立CMDB有非常大的关系。 70%~80%的IT相关问题与环境的变更有着直接的关系。实施变更管理的难点和重点并不是工具,而是流程。即通过一个自动化的、可重复的流程管理变更,使得当变更发生的时候,有一个标准化的流程去执行,能够预测到这个变更对整个系统管理产生的影响,并对这些影响进行评估和控制。而变更管理流程自动化的实现关键就是CMDB。 CMDB工具中至少包含这几种关键的功能:整合、调和、同步、映射和可视化。
  • 整合是指能够充分利用来自其他数据源的信息,对CMDB中包含的记录源属性进行存取,将多个数据源合并至一个视图中,生成连同来自CMDB和其他数据源信息在内的报告;
  • 调和能力是指通过对来自每个数据源的匹配字段进行对比,保证CMDB中的记录在多个数据源中没有重复现象,维持CMDB中每个配置项目数据源的完整性;自动调整流程使得初始实施、数据库管理员的手动运作和现场维护支持工作降至最低;
  • 同步指确保CMDB中的信息能够反映联合数据源的更新情况,在联合数据源更新频率的基础上确定CMDB更新日程,按照经过批准的变更来更新 CMDB,找出未被批准的变更;
  • 应用映射与可视化,说明应用间的关系并反应应用和其他组件之间的依存关系,了解变更造成的影响并帮助诊断问题。

cmdb属于运维自动化项目

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

  目的:减少人工干预,降低人员成本

  cmdb包括两部分

    -资产管理

    -操作管理

运维自动化路线:

CMDB项目开发 随笔 第1张

cmdb的开发需要包含三部分功能:

  • 采集硬件数据
  • API
  • 页面管理

执行流程:服务器的客户端采集硬件数据,然后将硬件信息发送到API,API负责将获取到的数据保存到数据库中,后台管理程序负责对服务器信息的配置和展示。

 

资产管理的实现

WHY搭建cmdb资产管理

搭建cmdb是因为最终是要搭建自动化平台,包括装机、监控、自动安装软件、部署等全部自动化的执行,而想要搭建自动化的平台的基础是要有资产的管理,因为上面的操作都是在资产的基础上进行的操作,所以搭建平台的首要目的是要对资产进行管控起来,所以我们需要有一个资产管理。

 

目前CMDB资产管理的实现有如下方式:

cmdb采集资产需求分析

CMDB项目开发 随笔 第2张

 

采集资产方式

  1. Agent

    基于shell命令实现           # agent形式
    # 1.采集资产
    # 2.将资产数据发送到API(POST)

    对于Agent的版本的实现思路:

    • Agent采集硬件资产
    • API提供相关处理的接口
    • 管理平台为用户提供可视化操作
    CMDB项目开发 随笔 第3张

     

    import subprocess
    import requests
    # pip3 install requests
    
    # ################## 采集数据 ##################
    # result = subprocess.getoutput('ipconfig')
    # result正则处理获取想要数据
    
    # 整理资产信息
    # data_dict ={
    #     'nic': {},
    #     'disk':{},
    #     'mem':{}
    # }
    
    # ##################  发送数据 ##################
    # requests.post('http://www.127.0.0.1:8000/assets.html',data=data_dict)
    

     

  2. Paramiko类

    基于CMDB中控机和SSH对远程服务器执行命令实现        # SSH形式
    # 1.获取今日未采集主机列表
    # 2.采集资产
    # 3.将资产数据发送到API(POST)

    # 基于paramiko模块, pip3 install paramiko
    import requests
    import paramiko

    # ################## 获取今日未采集主机名 ##################
    #result = requests.get('http://www.127.0.0.1:8000/assets.html')
    # result = ['c1.com','c2.com']


    # ################## 通过paramiko连接远程服务器,执行命令 ##################
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    ssh.connect(hostname='192.168.14.36', port=22, username='wupeiqi', password='123')

    # 执行命令
    # stdin, stdout, stderr = ssh.exec_command('df')

    # 获取命令结果
    # result = stdout.read()

    # 关闭连接
    # ssh.close()
    # print(result)

    # data_dict = {result}

    # ################## 发送数据 ##################
    # requests.post('http://www.127.0.0.1:8000/assets.html',data=data_dict)

     

  3. SaltStack

    基于SaltStack的master上的pillar以及远程执行命令实现       基于 paramiko类实现  # Salt形式
    # 1.获取今日未采集主机列表
    # 2.采集资产
    # 3.将资产数据发送到API(POST)

    # 1. 安装saltstack
    # rpm --import https://repo.saltstack.com/yum/redhat/6/x86_64/latest/SALTSTACK-GPG-KEY.pub
    #
    #
    """
    Master: yum install salt-master
    Master准备:
    a. 配置文件,监听本机IP
    vim /etc/salt/master
    interface: 本机IP地址
    b. 启动master
    /etc/init.d/salt-master start


    Slave: yum install salt-minion
    Slave准备:
    a. 配置文件,连接那个master
    vim /etc/salt/minion
    master: 远程master地址
    b. 启动slave
    /etc/init.d/salt-minion start

    2. 创建关系
    查看
    Master:salt-key -L
    Accepted Keys:
    Denied Keys:
    Unaccepted Keys:
    c1.com
    c2.com
    c3.com
    Rejected Keys:
    接受
    Master:salt-key -a c1.com
    Accepted Keys:
    c1.com
    c2.com
    Denied Keys:
    Unaccepted Keys:
    c3.com
    Rejected Keys:


    3. 执行命令
    master:
    salt 'c1.com' cmd.run 'ifconfig'

    import salt.client
    local = salt.client.LocalClient()
    result = local.cmd('c2.salt.com', 'cmd.run', ['ifconfig'])

    """
    # ################## 获取今日未采集主机名 ##################
    #result = requests.get('http://www.127.0.0.1:8000/assets.html')
    # result = ['c1.com','c2.com']


    # ################## 远程服务器执行命令 ##################
    # import subprocess
    # result = subprocess.getoutput("salt 'c1.com' cmd.run 'ifconfig'")
    #
    # import salt.client
    # local = salt.client.LocalClient()
    # result = local.cmd('c2.salt.com', 'cmd.run', ['ifconfig'])


    # ################## 发送数据 ##################
    # requests.post('http://www.127.0.0.1:8000/assets.html',data=data_dict)

     

开发中遇到的小问题

在用agent方式连接主机获取数据的时候,一开始获取主机的唯一标识符用的是主板上的sn号(每个电脑的sn号都不同,唯一),但是后来用虚拟机使用时候出现问题,虚拟机上的序列号(sn号)可以相同。

解决方案:使用主机的主机名,且保证主机名不能修改,并把主机名放在一个文件里面,供采集数据时候获取主机名。

 为什么不使用fabic和ansible用作验证

fabic和ansible内部用的就是paramiko模块,而我们用的paramiko就是这一类的,ssh就是这一类的

API安全认证

API理解

APIApplication Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

简单理解API是我们提供的一个URL当用户按照指定的格式提交到URL中,我们在内部的views里执行操作,然后返回给用户状态or数据!

API安全

API随便谁都可以调用API进行操作,肯定这个是不安全的!那怎么办呢?

CMDB项目开发 随笔 第4张

 

 方案如下:

1、客户端与服务器都存放着用于验证的Token字段,值字段无论通过什么方法外部的黑客都是无法获取的。
2、客户端吧本地的时间戳+Token的组合进行MD5加密生成一段新的md5-token。(用时间戳使加密字符串动态起来)
3、客户端访问的时候携带:时间戳、生成的一段新的md5-token。
4、服务端收到请求后,先判断时间戳是否合法(时间戳和当前时间不能大于10秒)

5、再判断当前访问的url是否在url列表里已经存在,如果存在,则拒绝访问。(每次访问的url写在列表里,时间超时10秒的从列表里去掉(每次循环,时间超时去掉),如用reius,membeach的实现)
6、时间戳合法和访问的url不重复了,再去反解验证(客户端拿到自己的Token值和当前时间进行md5加密,把加密后的值和当前时间发送到服务器,服务器根据拿到的时间戳和自己的Token值进行md5加密,如果加密后的数据和发送过来的加密数据md5-token相同,则验证成功。)
7、以上认证通过,执行相关Veiws然后并返回相关的状态或数据

 

 cmdb表结构设计

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

更多参考:RESTful API 设计指南:http://www.ruanyifeng.com/blog/2014/05/restful_api.html

cmdb相关文章:http://blog.uinnova.cn/articles/2015/04/23/1429791021932.html

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄