CMDB 是什么,作为 IT 工程师的你想必已经听说过了,或者已经烂熟了,容我再介绍一下,以防有读者还不知道。CMDB 的全称是 Configuration Management Data Base,翻译下就是配置管理数据库,它存储与管理企业 IT 架构中设备的各种配置信息,它支撑服务流程的运转、发挥着配置信息的价值。在今天,无论是自动化运维、标准化运维、DevOps、甚至是时髦的智能运维,其实都离开不 CMDB,可以说 CMDB 是运维体系的基石,有了配置信息数据库,后面各种标准、流程都可以建立在 CMDB 基础之上,从而实现真正的标准化、自动化、智能化运维,节约运维成本的同时,也降低运维流程混乱带来的操作风险。
今天分享一个开源的 cmdb 系统的搭建过程,通过这一系列搭建的过程你不仅可以获得一个支持全文检索、自带 restful api 的 cmdb 系统,而且还可以学到不少时髦的技术。
后端技术:
- Python3
- Django
- Django REST framework
- Elasticsearch
- uwsgi
- Nginx
- Docker
前端技术:
- Vue
- Element-ui
- Vue-Router
- Vuex
- Axios
先看一下这个 CMDB 系统的容颜,设计上参考了饿了么内部的 cmdb 系统:

基本功能有:热添加删除表、自定义字段类型,方便增删改查的前端界面,强大的搜索查找能力(后端使用elasticsearch存储数据 ) 可以配合 kibana 使用,查看数据的删除修改记录、历史版本等,还带有表级权限管理,开放所有 API。
github 仓库
后端:https://github.com/open-cmdb/cmdb
前端:https://github.com/open-cmdb/cmdb-web
下面介绍两种方法搭建此开源 cmdb 系统 ,一个是使用 Docker,适用于 linux 操作系统 ,另一个是不使用 Docker,适用于 windows 和 linux 。最后介绍下 vue 环境的搭建。
1. 使用 Docker
如果你熟悉容器技术,推荐使用此方法,不过最新的 Docker 目前还不支持大多数的 windows 版本,因此如果使用容器,请使用 ubuntu 或 centos 等 Linux 操作系统。首先要安装 Docker,安装 Docker 的方法请参考我之前的一篇文章docker容器从入门到痴迷,或直接网上搜索对应操作系统的安装方法对着做即可,没有难度。
环境准备:
1、一台可以访问互联网的 linux 服务器 内存最好 >= 4G ,并创建一个具有 sudo 权限的普通用户,注意要有 yum 命令,如果没有可以安装下。
2、一个 cmdb 专用的邮箱,用于发送密码和验证码,如果使用163、qq等第三方邮箱请在设置里面打开POP3/SMTP/IMAP服务并生成授权码。如果不使用注册和忘记密码功能,也可以不准备
一键安装
将下述代码保存到 install_cmdb.py 并执行 sudo python3 install_cmdb.py 即可一键安装。
# -*- coding: utf-8 -*-
import os
import subprocess
import argparse
import time
def base(cmd):
if subprocess.call(cmd, shell=True):
raise Exception("{} 执行失败".format(cmd))
def install_docker():
base("sudo yum install -y yum-utils device-mapper-persistent-data lvm2")
base("sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo")
base("sudo yum makecache fast")
base("sudo yum -y install docker-ce")
if(not os.path.exists("/etc/docker")):
base("mkdir -p /etc/docker")
with open("/etc/docker/daemon.json", "w") as f:
f.write('{\n "registry-mirrors": ["https://9f4w4icn.mirror.aliyuncs.com"] \n}')
base("sudo systemctl daemon-reload")
base("sudo systemctl start docker")
def create_dir():
if (not os.path.exists("/var/cmdb/db")):
base("sudo mkdir -p /var/cmdb/db")
if (not os.path.exists("/var/cmdb/es")):
base("sudo mkdir -p /var/cmdb/es")
def run_db_container():
base("sudo docker run --name cmdb-db -d -e MYSQL_ROOT_PASSWORD=cmdbcmdb -v /var/cmdb/db:/var/lib/mysql mysql:5.7.21")
def run_es_container():
base("sudo docker run --name cmdb-es -d -v /var/cmdb/es:/usr/share/elasticsearch/data elasticsearch:5.6.8")
def init_db():
base("sudo docker run -it --rm --link cmdb-db -e ENV=PRO -e DB_HOST=cmdb-db -e DB_PORT=3306 -e DB_USERNAME=root -e DB_PASSWORD=cmdbcmdb -e DB_NAME=cmdb mingmingtang/cmdb init-db")
def run_cmdb_container(site_url, email_host, email_port, email_username, email_password):
base("sudo docker run -d --name cmdb --link cmdb-db --link cmdb-es -p 80:80 -e ENV=PRO -e SITE_URL={} -e DB_HOST=cmdb-db -e DB_PORT=3306 -e DB_USERNAME=root -e DB_PASSWORDе聍顽4(4(е聱^R"@n3nO"Gg/GR"CjnZ j疚4(е聍顽4(4(е聍顽4(^>^4(YB;>rj&7vjron3~r/B;o}jn3&04(鉅4('zs>6"@4)4(B*r7*c>zs6R*'>[r6Rj>4)(/vgZR)4(~r//*F(4)4(6>R"Cjr7*f4({r*&/gO>b"G:6CkW^^br'fCjgS.jvRO{s""G77Cgrj
Gr&jCkjrg&7bjk4(brZj3ro疒j惚r'&*rokkR2 |