CMDB简介

为什么有CMDB


为了有效地管理和改进您的IT服务交付,您需要确切地知道在您的IT环境中使用了什么,以及它如何与当前准确的配置数据一起使用。

通过当前服务的配置管理数据库或CMDB很容易理解您的组织IT环境,最新的CMDB将极大地提高您交付服务的能力。一些研究统计通过CMDB实现的纠正错误使得错误减少了40%。想象一下,恢复那些不协调的努力,并将它们导向更具战略意义的目标。CMDB的好处是由坚实的配置管理能力支持的,这些好处是深远的,包括服务管理、资产管理、操作管理、信息安全、云操作和遵从性

CMDB主要是一个数据存储库,用于存储描述配置项的信息以及一些资产相关信息。每个CI都有一些信息,这些信息定义了它所表示的属性,以及它与其他支持您所交付的服务的配置项或者CI之间的关系,以及一些资产信息。CI是唯一标识的组件,用于处理交付服务中有变化的一些项目(change request)。CI可以是物理实体(如服务器),也可以表示操作结构(如服务器集群)。CI也可以是逻辑上的东西,比如一个应用程序,CMDB也包含Cis之间的关系。理解每个CI如何与其他CIs集成是理解、管理和报告组织提供的服务的基础

现在我们已经对CMDB有了基本的了解,让我们来看看一些场景,这些场景将使我们更好地了解它在您的实例中是如何工作的;这里有一个客户报告说电子邮件被关闭了。客户首先打电话给支持部门报告问题,然后在进行了一些故障排除之后创建一个事件。支持人员确定其中一个客户的电子邮件服务器宕机。看起来宕机的电子邮件服务器需要重新启动,这样才能创建更改请求,从而重新启动电子邮件服务器,验证电子邮件问题已解决,并关闭事件。

在这里,我们可以确定几个配置项,因为它们与这个场景中的CMDB相关。首先,我们有一个服务CI,即客户使用的电子邮件服务。我们还有CI应用程序,也就是电子邮件应用程序。接下来,我们可以识别电子邮件服务器本身,这是一个硬件服务器CI,最后,创建的更改包含一个CI字段,所以在这种情况下,更改记录引用硬件服务器CI

让我们来看一个类似的场景,该场景关注如何自动处理警报,就像前面的场景中电子邮件服务器宕机一样。在本例中,事件管理应用程序创建一个与电子邮件服务器绑定的事件记录。审核时发送给支持部门的事件确定需要重新启动服务器,然后工作流编排执行一系列操作来恢复电子邮件服务。在本例中,业务流程重新启动电子邮件服务器。经过验证的更改再次成功完成。然后客户确认在事件结束之前问题已经解决。在这个场景中,我们再次将电子邮件服务器视为硬件服务器CI,事件管理创建一个警报,该警报生成与产生事件的CI相关的事件记录。事件记录针对表单上的同一CI进行更改,业务流程执行一系列操作来恢复电子邮件服务。

CMDB是您获得对基础设施和服务的全面可见性能力中的一个重要组件。这将导致你对环境的更多控制,让你有能力做出更明智的决定。

公司需求

  • 自动装机
  • 配置管理
  • 监控
  • 堡垒机

传统上是通过excel表维护资产信息, 通过samba服务建立共享文件夹, 在这样的一个文件夹里放着一堆资产相关的excel表格, excel表格记录了有多少台服务器, 服务器的主机名, 服务器的主板, 内存, CPU, 操作系统等信息

资产变更时候需要手动更新excel表格

查看变更记录时候, 查看excel表格很费劲

监控某台服务器, 需要从excel表格里面拿数据

综上繁琐的操作, 就有了CMDB(资产管理数据库)这套解决方案


什么是CMDB


CMDB主要是给上层应用提供数据


链接

https://www.csdn.net/article/a/2016-01-25/15834593

https://www.cnblogs.com/igaofen/archive/2010/07/15/1218448.html

http://blog.uinnova.cn/articles/2015/04/23/1429791021932


CMDB里都存些什么

  • 机器设备: 物理机, 虚拟机, 容器, 网络设备

  • 业务线

    机器都是给业务线用的, 业务线可以理解为机器上跑的服务

  • 配置


zabbix 监控: 提供数据给监控

可视化: 监控数据可视化, 方便排查问题

代码上线: 代码上线到哪台服务器, 上线到服务器的哪个目录


服务器管理

物理服务器/虚拟化/云(aws, 阿里云, 青云)/容器

  • 服务器信息自动上报
  • 服务器列表分页显示
  • 多条件分页搜索

SLA: https://blog.csdn.net/weixin_37600187/article/details/82848489

CMDB的架构方案


agent方案

1. 脚本放在每一台服务器上 ---- agent
2. 通过定时任务启动脚本(crontab)
3. 执行linux的命令, 对命令的结果进行解析
4. 通过requests模块发送资产信息到api
5. api 接收数据并保存到数据库


api

from django.shortcuts import render, HttpResponse
from django.http import JsonResponse

# Create your views here.


def api(request):
    if request.method == 'POST':
        return JsonResponse({'status': 200, 'msg': '接收到了'}, json_dumps_params={'ensure_ascii': False})
    else:
        return HttpResponse('未收到数据')

client

import subprocess
import requests


v1 = subprocess.getoutput('ip a')
v1 = v1[280:296]
print(v1)

v2 = subprocess.getoutput('ls /Users/cjw')
v2 = v2[19:30]
print(v2)

url = 'http://127.0.0.1:8000/api/'
response = requests.post(url=url, data={'k1': v1, 'k2': v2})
print(response.text)

ssh类方案(中控机)

1. 脚本放在中控机上
2. 通过定时任务启动脚本(crontab) ===>>> 脚本思路主要通过ssh(paramiko模块)远程连接服务器执行命令拿到结果
3. api从中控机获得主机列表, 然后循环主机列表, 拿到主机名, 
3. 中控机上 通过 ssh远程连接上每一条需要收集数据的服务器, 执行linux命令, 对命令的结果进行解析
4. 中控机 通过requests模块发送资产信息到api
5. api 接收数据保存到数据库


client

import paramiko

# 创建ssh对象
ssh = paramiko.SSHClient()

# 允许连接不再known_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接服务器
ssh.connect(hostname='test1', port=22, username='root', password='1')

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

# 获取命令结果
result = stdout.read().decode('utf-8')

# print(result)
# print(type(result))

# 关闭连接
ssh.close()

import json

data = json.dumps(result)
import requests

ret = requests.post("http://127.0.0.1:8000/test/", data=data)
print(ret)

api

from django.shortcuts import HttpResponse

# Create your views here.
def test(request):

    print(request.body)
    return HttpResponse('ok')

salt类方案(rpc)

1. 脚本放在中控机上
2. 通过定时任务启动脚本(crontab) ===>>> 脚本思路主要通过salt(salt模块)远程连接服务器执行命令拿到结果
3. api从中控机获得主机列表, 然后循环主机列表, 拿到主机名, 
3. 中控机上 通过 salt(rpc)远程连接上每一条需要收集数据的服务器, 执行linux命令, 对命令的结果进行解析
4. 中控机 通过requests模块发送资产信息到api
5. api 接收数据保存到数据库


安装saltstack


安装master
[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0
[root@master ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@master ~]# yum install -y salt-master
salt-master                          noarch  2015.5.10-2.el7    epel     1.0 M
 PyYAML                               x86_64  3.10-11.el7        base     153 k
 libsodium                            x86_64  1.0.18-1.el7       epel     147 k
 libtomcrypt                          x86_64  1.17-26.el7        extras   224 k
 libtommath                           x86_64  0.42.0-6.el7       extras    36 k
 libxml2-python                       x86_64  2.9.1-6.el7_2.3    base     247 k
 libyaml                              x86_64  0.1.4-11.el7_0     base      55 k
 m2crypto                             x86_64  0.21.1-17.el7      base     429 k
 openpgm                              x86_64  5.2.122-2.el7      epel     171 k
 python-babel                         noarch  0.9.6-8.el7        base     1.4 M
 python-backports                     x86_64  1.0-8.el7          base     5.8 k
 python-backports-ssl_match_hostname  noarch  3.5.0.1-1.el7      base      13 k
 python-chardet                       noarch  2.2.1-3.el7        base     227 k
 python-ipaddress                     noarch  1.0.16-2.el7       base      34 k
 python-jinja2                        noarch  2.7.2-4.el7        base     519 k
 python-kitchen                       noarch  1.1.1-5.el7        base     267 k
 python-markupsafe                    x86_64  0.11-10.el7        base      25 k
 python-requests                      noarch  2.6.0-7.el7_7      updates   95 k
 python-six                           noarch  1.9.0-2.el7        base      29 k
 python-urllib3                       noarch  1.10.2-7.el7       base     103 k
 python2-crypto                       x86_64  2.6.1-16.el7       epel     477 k
 python2-msgpack                      x86_64  0.5.6-5.el7        epel      64 k
 python2-zmq                          x86_64  14.7.0-8.el7       epel     505 k
 salt                                 noarch  2015.5.10-2.el7    epel     4.1 M
 systemd-python                       x86_64  219-67.el7_7.2     updates  137 k
 yum-utils                            noarch  1.1.31-52.el7      base     121 k
 zeromq                               x86_64  4.1.4-6.el7        epel     556 k
 systemd                              x86_64  219-67.el7_7.2     updates  5.1 M
 systemd-libs                         x86_64  219-67.el7_7.2     updates  411 k
 systemd-sysv                         x86_64  219-67.el7_7.2     updates   88 k

安装minion

[root@client ~]# systemctl stop firewalld
[root@client ~]# setenforce 0
[root@client ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@client ~]# yum -y install salt-minion
 salt-minion                          noarch  2015.5.10-2.el7    epel      26 k
 PyYAML                               x86_64  3.10-11.el7        base     153 k
 libsodium                            x86_64  1.0.18-1.el7       epel     147 k
 libtomcrypt                          x86_64  1.17-26.el7        extras   224 k
 libtommath                           x86_64  0.42.0-6.el7       extras    36 k
 libyaml                              x86_64  0.1.4-11.el7_0     base      55 k
 m2crypto                             x86_64  0.21.1-17.el7      base     429 k
 openpgm                              x86_64  5.2.122-2.el7      epel     171 k
 python-babel                         noarch  0.9.6-8.el7        base     1.4 M
 python-backports                     x86_64  1.0-8.el7          base     5.8 k
 python-backports-ssl_match_hostname  noarch  3.5.0.1-1.el7      base      13 k
 python-chardet                       noarch  2.2.1-3.el7        base     227 k
 python-ipaddress                     noarch  1.0.16-2.el7       base      34 k
 python-jinja2                        noarch  2.7.2-4.el7        base     519 k
 python-kitchen                       noarch  1.1.1-5.el7        base     267 k
 python-markupsafe                    x86_64  0.11-10.el7        base      25 k
 python-requests                      noarch  2.6.0-7.el7_7      updates   95 k
 python-urllib3                       noarch  1.10.2-7.el7       base     103 k
 python2-crypto                       x86_64  2.6.1-16.el7       epel     477 k
 python2-msgpack                      x86_64  0.5.6-5.el7        epel      64 k
 python2-zmq                          x86_64  14.7.0-8.el7       epel     505 k
 salt                                 noarch  2015.5.10-2.el7    epel     4.1 M
 yum-utils                            noarch  1.1.31-52.el7      base     121 k
 zeromq                               x86_64  4.1.4-6.el7        epel     556 k

配置master端

[root@master ~]# hostname -I
172.16.240.10 
[root@master ~]# vim /etc/salt/master 
interface: 172.16.240.10

配置minion端

[root@client ~]# vim /etc/salt/minion
master: 172.16.240.10
id: client

重启master和minion服务

[root@client ~]# systemctl restart salt-minion
[root@master ~]# systemctl restart salt-master

在master端配置权限

[root@master ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
client
Rejected Keys:

[root@master ~]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
client
Proceed? [n/Y] Y
Key for minion client accepted.

在master端验证结果

[root@master ~]# salt-key -L
Accepted Keys:
client
Denied Keys:
Unaccepted Keys:
Rejected Keys:
  
[root@master ~]# salt '*' test.ping
client:
    True
    
[root@master ~]# salt 'client' cmd.run 'ip a'
client:
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:ae:2d:04 brd ff:ff:ff:ff:ff:ff
        inet 172.16.240.11/24 brd 172.16.240.255 scope global noprefixroute ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::90b4:e57f:f659:ad3d/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever


安装python3环境

$  yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
$  yum install -y gcc
$  wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
$  cd Python-3.6.8
$  mkdir /usr/local/python3
$  ./configure --prefix=/usr/local/python3
$  make && make install
Installing collected packages: setuptools, pip
Successfully installed pip-18.1 setuptools-40.6.2

$  ln -s /usr/local/python3/bin/python3 /usr/bin/python3 #为python3创建软连接
$  ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3  #为pip3创建软连接

python操作salt

>>>> 安装salt
$  pip3 install salt -i https://pypi.tuna.tsinghua.edu.cn/simple

对比

第一套方案 第二套方案 第三套方案
优点 速度快 每次新上线服务器, 都需要在新的服务器上部署 不用写python代码
缺点 不需要部署agent脚本 使用paramiko模块登录服务器的话, 速度比较慢
适用场景 服务器数量比较多 服务器数量比较少(小于100台) 服务器上已经部署了salt-stack或者计划要使用salt-stack

CMDB有什么用

1. 管理所有的服务器资产
2. 自动获取资产信息
3. 给其他的平台提供数据

ITIL中, 属于配置管理

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

在实际的项目中,CMDB常常被认为是构建其它ITIL流程的基础而优先考虑,ITIL项目的成败与是否成功建立CMDB有非常大的关系。

70%~80%的IT相关问题与环境的变更有着直接的关系。实施变更管理的难点和重点并不是工具,而是流程。即通过一个自动化的、可重复的流程管理变更,使得当变更发生的时候,有一个标准化的流程去执行,能够预测到这个变更对整个系统管理产生的影响,并对这些影响进行评估和控制。而变更管理流程自动化的实现关键就是CMDB

CMDB工具中至少包含这几种关键的功能:整合、调和、同步、映射和可视化。

  • 整合是指能够充分利用来自其他数据源的信息,对CMDB中包含的记录源属性进行存取,将多个数据源合并至一个视图中,生成连同来自CMDB和其他数据源信息在内的报告;
  • 调和能力是指通过对来自每个数据源的匹配字段进行对比,保证CMDB中的记录在多个数据源中没有重复现象,维持CMDB中每个配置项目数据源的完整性;自动调整流程使得初始实施、数据库管理员的手动运作和现场维护支持工作降至最低;
  • 同步指确保CMDB中的信息能够反映联合数据源的更新情况,在联合数据源更新频率的基础上确定CMDB更新日程,按照经过批准的变更来更新 CMDB,找出未被批准的变更;
  • 应用映射与可视化,说明应用间的关系并反应应用和其他组件之间的依存关系,了解变更造成的影响并帮助诊断问题。
posted @ 2019-04-12 22:49  cjw1219  阅读(694)  评论(0编辑  收藏  举报