为什么有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
,找出未被批准的变更; - 应用映射与可视化,说明应用间的关系并反应应用和其他组件之间的依存关系,了解变更造成的影响并帮助诊断问题。