CMDB 是什么,作為 IT 工程師的你想必已經(jīng)聽說過了,或者已經(jīng)爛熟了,容我再介紹一下,以防有讀者還不知道。CMDB 的全稱是 Configuration Management Data Base,翻譯下就是配置管理數(shù)據(jù)庫,它存儲(chǔ)與管理企業(yè) IT 架構(gòu)中設(shè)備的各種配置信息,它支撐服務(wù)流程的運(yùn)轉(zhuǎn)、發(fā)揮著配置信息的價(jià)值。在今天,無論是自動(dòng)化運(yùn)維、標(biāo)準(zhǔn)化運(yùn)維、DevOps、甚至是時(shí)髦的智能運(yùn)維,其實(shí)都離開不 CMDB,可以說 CMDB 是運(yùn)維體系的基石,有了配置信息數(shù)據(jù)庫,后面各種標(biāo)準(zhǔn)、流程都可以建立在 CMDB 基礎(chǔ)之上,從而實(shí)現(xiàn)真正的標(biāo)準(zhǔn)化、自動(dòng)化、智能化運(yùn)維,節(jié)約運(yùn)維成本的同時(shí),也降低運(yùn)維流程混亂帶來的操作風(fēng)險(xiǎn)。
今天分享一個(gè)開源的 cmdb 系統(tǒng)的搭建過程,通過這一系列搭建的過程你不僅可以獲得一個(gè)支持全文檢索、自帶 restful api 的 cmdb 系統(tǒng),而且還可以學(xué)到不少時(shí)髦的技術(shù)。
后端技術(shù):
- Python3
- Django
- Django REST framework
- Elasticsearch
- uwsgi
- Nginx
- Docker
前端技術(shù):
- Vue
- Element-ui
- Vue-Router
- Vuex
- Axios
先看一下這個(gè) CMDB 系統(tǒng)的容顏,設(shè)計(jì)上參考了餓了么內(nèi)部的 cmdb 系統(tǒng):
基本功能有:熱添加刪除表、自定義字段類型,方便增刪改查的前端界面,強(qiáng)大的搜索查找能力(后端使用elasticsearch存儲(chǔ)數(shù)據(jù) ) 可以配合 kibana 使用,查看數(shù)據(jù)的刪除修改記錄、歷史版本等,還帶有表級(jí)權(quán)限管理,開放所有 API。
github 倉庫
后端:https://github.com/open-cmdb/cmdb
前端:https://github.com/open-cmdb/cmdb-web
下面介紹兩種方法搭建此開源 cmdb 系統(tǒng) ,一個(gè)是使用 Docker,適用于 linux 操作系統(tǒng) ,另一個(gè)是不使用 Docker,適用于 windows 和 linux 。最后介紹下 vue 環(huán)境的搭建。
1. 使用 Docker
如果你熟悉容器技術(shù),推薦使用此方法,不過最新的 Docker 目前還不支持大多數(shù)的 windows 版本,因此如果使用容器,請(qǐng)使用 ubuntu 或 centos 等 Linux 操作系統(tǒng)。首先要安裝 Docker,安裝 Docker 的方法請(qǐng)參考我之前的一篇文章docker容器從入門到癡迷,或直接網(wǎng)上搜索對(duì)應(yīng)操作系統(tǒng)的安裝方法對(duì)著做即可,沒有難度。
環(huán)境準(zhǔn)備:
1、一臺(tái)可以訪問互聯(lián)網(wǎng)的 linux 服務(wù)器 內(nèi)存最好 >= 4G ,并創(chuàng)建一個(gè)具有 sudo 權(quán)限的普通用戶,
注意要有 yum 命令,如果沒有可以安裝下
。
2、一個(gè) cmdb 專用的郵箱,用于發(fā)送密碼和驗(yàn)證碼,如果使用163、qq等第三方郵箱請(qǐng)?jiān)谠O(shè)置里面打開POP3/SMTP/IMAP服務(wù)并生成授權(quán)碼。
如果不使用注冊(cè)和忘記密碼功能,也可以不準(zhǔn)備
一鍵安裝
將下述代碼保存到 install_cmdb.py 并執(zhí)行 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("{} 執(zhí)行失敗".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=cmdbcmdb -e DB_NAME=cmdb -e ELASTICSEARCH_HOSTS=cmdb-es -e EMAIL_HOST={} -e EMAIL_PORT={} -e EMAIL_USERNAME={} -e EMAIL_PASSWORD={} mingmingtang/cmdb start".format(site_url, email_host, email_port, email_username, email_password)) def input_para(help): value = "" while(not value): value = raw_input(help) return value if __name__ == '__main__': if(os.geteuid() != 0): raise("請(qǐng)以root權(quán)限運(yùn)行") site_url = input_para("請(qǐng)輸入網(wǎng)站域名或IP(http://cmdb.xxx.com):") email_host = input_para("網(wǎng)站郵箱服務(wù)器(smtp.163.com):") email_port = input_para("郵箱服務(wù)器端口(25):") email_username = input_para("郵箱用戶名(cmdb@163.com):") email_password = input_para("郵箱密碼|獨(dú)立授權(quán)碼(P@ssw0rd):") print("開始安裝docker") install_docker() print("開始創(chuàng)建目錄") create_dir() print("開始運(yùn)行mysql容器") run_db_container() print("開始運(yùn)行elasticsearch容器") run_es_container() print("等待數(shù)據(jù)庫啟動(dòng)完成(10s)") time.sleep(10) print("開始初始化數(shù)據(jù)庫") init_db() print("開始運(yùn)行cmdb") run_cmdb_container(site_url, email_host, email_port, email_username, email_password) print("完成!")
輸入網(wǎng)站地址和郵箱信息開始安裝,如下圖所示:
如果一切順利一會(huì)兒后您將看到安裝完成,如果失敗了可能就要調(diào)整一些系統(tǒng)參數(shù)并刪除已運(yùn)行的容器重新執(zhí)行了,不過根據(jù)我的安裝經(jīng)驗(yàn),基本不會(huì)出錯(cuò),容器還是非常方便部署的。
執(zhí)行
sudo docker ps
將看到三個(gè)正在運(yùn)行的容器,分別是 cmdb,cmdb-es,cmdb-db,如下圖所示
其中 cmdb 運(yùn)行著 web 服務(wù)器(nginx,uwsgi,django,vue.js),cmdb-es 運(yùn)行著 Elasticsearch 全文檢索引擎,也存儲(chǔ)你的配置信息,cmdb-db 運(yùn)行著 mysql,保存著 web 服務(wù)器的元數(shù)據(jù)(django 的知識(shí)庫)。
在瀏覽器中輸入"localhost" 盡情的開始享用吧。
2. 不使用 Docker
下面的內(nèi)容主要是分享給 windows 用戶的,linux 用戶也可以對(duì)比操作,沒有問題。使用 Docker 雖然方便部署,但它屏蔽了一些細(xì)節(jié),不利于二次開發(fā)和問題排查。在不使用 Docker 的情況下,我們不僅要裝軟件,還要安裝依賴,配置環(huán)境,雖然麻煩,但是可以學(xué)到更多知識(shí),出了問題也可以很快定位,更能加深對(duì)項(xiàng)目框架的理解,也是值得的。
(1)安裝 mysql,創(chuàng)建數(shù)據(jù)庫,配置權(quán)限
如果你的本機(jī)已經(jīng)安裝 mysql,則不心再安裝,直接創(chuàng)建數(shù)據(jù)庫,配置權(quán)限即可。
安裝 mysql
從網(wǎng)官下載最新的 MySQL Community Server [https://dev.mysql.com/downloads/mysql/]
比如我下載的是 mysql-8.0.12-winx64.zip ,這是個(gè)免安裝版本,直接解壓到你想安裝的目錄內(nèi),并在里面新建 my.ini 文件,位置如下圖所示:
my.ini 的文件內(nèi)容如下所示:
[mysqld] # 設(shè)置3306端口 port=3306 # 設(shè)置mysql的安裝目錄 basedir=D:\program\mysql\mysql-8.0.12-winx64 # 設(shè)置mysql數(shù)據(jù)庫的數(shù)據(jù)的存放目錄 datadir=D:\program\mysql\mysql-8.0.12-winx64\data # 允許最大連接數(shù) max_connections=200 # 允許連接失敗的次數(shù)。這是為了防止有人從該主機(jī)試圖攻擊數(shù)據(jù)庫系統(tǒng) max_connect_errors=10 # 服務(wù)端使用的字符集默認(rèn)為UTF8 character-set-server=utf8 # 創(chuàng)建新表時(shí)將使用的默認(rèn)存儲(chǔ)引擎 default-storage-engine=INNODB # 默認(rèn)使用“mysql_native_password”插件認(rèn)證 default_authentication_plugin=mysql_native_password [mysql] # 設(shè)置mysql客戶端默認(rèn)字符集 default-character-set=utf8 [client] # 設(shè)置mysql客戶端連接服務(wù)端時(shí)默認(rèn)使用的端口 port=3306 default-character-set=utf8
請(qǐng)注意下面的路徑設(shè)置要正確,
# 設(shè)置mysql的安裝目錄 basedir=D:\program\mysql\mysql-8.0.12-winx64 # 設(shè)置mysql數(shù)據(jù)庫的數(shù)據(jù)的存放目錄 datadir=D:\program\mysql\mysql-8.0.12-winx64\data
如果你想從任意一個(gè)命令窗口啟動(dòng) mysql,請(qǐng)把 D:\program\mysql\mysql-8.0.12-winx64\bin 加入環(huán)境變量。 *
這個(gè) my.ini 文件的編碼一定保存為 gbk 格式,否則會(huì)報(bào)錯(cuò),我費(fèi)了好長(zhǎng)時(shí)間才發(fā)現(xiàn)這個(gè)問題。
接下來在MySQL安裝目錄的 bin 目錄(D:\program\mysql\mysql-8.0.12-winx64\bin)下以管理員權(quán)限執(zhí)行命令:mysqld --initialize --console;執(zhí)行完成后,在輸出信息中會(huì)打印 root 用戶的初始密碼,比如
[Server] A temporary password is generated for root@localhost: rIafvf5f5G,a
表示臨時(shí)密碼為 rIafvf5f5G,a ,用于 root 用戶第一次登陸,之后再修改 root 用戶的密碼。
這一步執(zhí)行后完成初始化操作,并在安裝目錄下生成 data 文件夾,用于存放數(shù)據(jù)。執(zhí)行
mysqld --install
完成 mysql 服務(wù)的安裝,安裝完成之后,就可以通過命令 net start mysql 啟動(dòng) mysql 的服務(wù)了。通過命令 net stop mysql 停止服務(wù)。通過命令 sc delete mysql /mysqld -remove 卸載 mysql 服務(wù)。接下來就可以建庫、用戶、分配權(quán)限了。
修改 root 密碼:
在 mysql 安裝目錄的 bin 目錄下執(zhí)行命令:mysql -u root -p 然后輸入上面的密碼,進(jìn)入 mysql 環(huán)境,執(zhí)行
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼';
注意命令尾的“;”一定要有,這是 mysql 的語法,
管理員 root 的 host 是 localhost,代表僅限 localhost 登錄訪問。如果要允許開放其他 ip 登錄,則需要添加新的 host。如果要允許所有 ip 訪問,可以直接修改成“%”;
ALTER USER 'root'@'%' IDENTIFIED BY '遠(yuǎn)程登陸密碼';
創(chuàng)建數(shù)據(jù)庫,并分配用戶權(quán)限
使用 root 用戶登陸 mysql 并執(zhí)行
mysql>create database cmdb;
即可創(chuàng)建數(shù)據(jù)庫 cmdb,但是這個(gè)數(shù)據(jù)庫只能有 root 訪問,如果要使用其他用戶訪問,則先新建用戶,例如讓 aaron 用戶可以完全控制 cmdb
mysql>CREATE USER 'aaron'@'%' IDENTIFIED BY 'aaron'; Query OK, 0 rows affected (0.48 sec) mysql> grant all on cmdb.* to 'aaron'@'%'; Query OK, 0 rows affected (0.23 sec)
至此 mysql 已安裝配置完畢。
(2)安裝 Elasticsearch
這一步很簡(jiǎn)單,官網(wǎng)下載解壓,進(jìn)入其 bin 目錄運(yùn)行如下圖所示的 bat 文件即可 :
如果運(yùn)行失敗,說明本機(jī)沒有安裝 java,或者沒有正確地配置 java 環(huán)境變量,這些操作也非常簡(jiǎn)單,網(wǎng)上到處都是,不在此詳述。
(3)運(yùn)行 cmdb 后端 api 服務(wù)、前端 ui
首先準(zhǔn)備 Python3 的環(huán)境,這個(gè)也很簡(jiǎn)單,直接官網(wǎng)下載,運(yùn)行即可,記得把 Python 添加到 Path 變量中。
如果你的電腦里有多個(gè)項(xiàng)目,為防止項(xiàng)目的依賴包版本沖突,建議使用 virtualenv 來為每個(gè)項(xiàng)目前創(chuàng)建一個(gè)虛擬的 Python 環(huán)境,將各自的依賴包裝在自己的虛擬環(huán)境里。
(1)部署后端
執(zhí)行以下命令,注意命令后面的注釋。
git clone https://github.com/open-cmdb/cmdb.git cd cmdb #如創(chuàng)建了虛擬環(huán)境,請(qǐng)先激活 pip install -r requirements.txt #如果這一步有包安裝失敗,提示卻少 microsoft visual c++ 14.0 的話,請(qǐng)?jiān)诰W(wǎng)站 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 上查找相應(yīng)的whl文件,直接 pip install .whl文件即可。
接下來修改3個(gè)文件
修改 apps/mgmt/views.py 文件,注釋掉 “ from . import initialize ”這一行。
修改 manage.py
將 APP_NAME = BASE_DIR.rsplit("/", 1)[-1] 修改為
APP_NAME = BASE_DIR.rsplit("\", 1)[-1] ,這是因?yàn)閣indows的路徑\ 在python 里會(huì)變成 \。
修改 cmdb/settings.py 文件,修改mysql 數(shù)據(jù)庫的配置信息如下所示:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': "cmdb", "HOST": "127.0.0.1", "PORT": 3306, "USER": "aaron", "PASSWORD": "aaron" } }
接著在命令窗口繼續(xù)執(zhí)行以下操作:請(qǐng)關(guān)注注釋內(nèi)容。
python manage.py makemigrations python manage.py migrate python manage.py cmdb_create_superuser #這一步創(chuàng)建一可以登陸的管理員用戶 #修改 apps/mgmt/views.py 文件,取消注釋“ from . import initialize ” python manage.py runserver #這一步啟動(dòng)后端的 api 服務(wù)
此時(shí)一個(gè)后端的服務(wù)已經(jīng)啟動(dòng)了,在瀏覽器中打開 “127.0.0.1:8000”就可以看到 api 的接口了。
(2)使用 nginx 部署前端并連接后端 api 服務(wù)
在命令容器執(zhí)行以下命令:
git clone https://github.com/open-cmdb/cmdb-web.git
獲取前端的源代碼,然后下載下載 ngnix 壓縮包,并解壓至安裝目錄,修改配置文件 nginx.conf,添加如下 server 配置:
server { listen 8080; server_name localhost; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } root E:\GitHub\cmdb-web\dist; index index.html; location / { try_files $uri $uri/ @router; index index.html; } location @router { rewrite ^.*$ /index.html last; } location ~ /api{ proxy_pass http://127.0.0.1:8000; } }
其中以配置
location ~ /api{ proxy_pass http://127.0.0.1:8000; }
讓前臺(tái)發(fā)過來中以 api 開頭的 url 請(qǐng)求都轉(zhuǎn)發(fā)至 http://127.0.0.1:8000 進(jìn)行解析,即第一步部署的 django 項(xiàng)目,這樣就連接了前端和后端。然后我們?cè)?nginx.exe 所在的目錄下啟動(dòng) nginx 服務(wù)。
接下來在瀏覽器中輸入 127.0.0.1:8080 即可正常訪問本文開始處的 cmdb 系統(tǒng),您可以嘗試下強(qiáng)大的搜索功能及增刪改功能。
點(diǎn)擊右上方【API 文檔】 可以訪問 cmdb 的接口文檔,非常方便。
至此系統(tǒng)搭建完畢。如果要用于生產(chǎn)環(huán)境,請(qǐng)使用 linux 操作系統(tǒng),并使用 uwsgi 來驅(qū)動(dòng) django 項(xiàng)目。
3. Vue 環(huán)境搭建
我想你不會(huì)僅僅滿足于將別人的項(xiàng)目下載下來能運(yùn)行就行了,你肯定想對(duì)其進(jìn)行改造來滿足自己的需求。因此你可能會(huì)需要修改前端或后端,后端的修改其實(shí)上面部署的已經(jīng)可以了,你可以直接閱讀 django 項(xiàng)目的源代碼進(jìn)行修改調(diào)試。如果要修改前端代碼進(jìn)行調(diào)試,你就需要搭建 Vue 環(huán)境。
你可能會(huì)問了,Vue 是個(gè)啥?Vue 是一個(gè) javascript 框架,如果說 jQuery,你可能就知道了,使用方法是類似的,在 html 上引入一行 javascript 的文件,就可以使用框架的特性了。 Vue 是一套用于構(gòu)建用戶界面的漸進(jìn)式框架。與其它大型框架不同的是,Vue 被設(shè)計(jì)為可以自底向上逐層應(yīng)用。Vue 的核心庫只關(guān)注視圖層,不僅易于上手,還便于與第三方庫或既有項(xiàng)目整合。另一方面,當(dāng)與現(xiàn)代化的工具鏈以及各種支持類庫結(jié)合使用時(shí),Vue 也完全能夠?yàn)閺?fù)雜的單頁應(yīng)用提供驅(qū)動(dòng)。
學(xué)習(xí) vue 需要有 html、css、javascript 基礎(chǔ)
新手可以通過 html 上引入 Vue 的 js 文件來使用 vue,如下所示:
Vue 測(cè)試實(shí)例 {{ message }}
但是在較復(fù)雜的項(xiàng)目中,還是要使用工具來幫助我們管理項(xiàng)目的層級(jí)及文件之間的依賴關(guān)系,這就需要使用 vue 的命令行工具 vue-cli ,vue-cli 需要 npm 工具來安裝,npm 工具集成在 node.js 中,因此需要安裝 node.js。
安裝 node.js 非常簡(jiǎn)單,直接官網(wǎng)下載解壓即可使用:
將此路徑添加到環(huán)境變量 Path 中,你就可以在任意的命令窗口使用 npm 命令了。
1、安裝 vue-cli
先安裝淘寶鏡像,大家都知道國(guó)內(nèi)直接使用 npm 的官方鏡像是非常慢的,這里推薦使用淘寶 NPM 鏡像。
npm install -g cnpm --registry=https://registry.npm.taobao.org
執(zhí)行結(jié)果如下:
這樣就可以使用 cnpm 命令來安裝模塊了:使用 cnpm 安裝 vue-cli
然后就可以使用 vue init webpack my-project 來建一個(gè)項(xiàng)目my-project,這里需要進(jìn)行一些配置,默認(rèn)回車即可,如下圖所示:
等依賴安裝完畢后,進(jìn)入項(xiàng)目,執(zhí)行以下命令:
C:\Users\xx>cd my-project C:\Users\xx\my-project>cnpm install C:\Users\xx\my-project>cnpm run dev
運(yùn)行成功后后打印如下信息:
此時(shí)打開瀏覽器,輸入 http://localhost:8081
如果要把這個(gè)頁面部署在 nginx 服務(wù)器上,你還需要 build 來生成靜態(tài)資源,如下圖所示:
這時(shí)會(huì)在 my-project 下生成 dist 目錄,相當(dāng)于我們寫程序編譯生成的目標(biāo)文件。my-project 下的內(nèi)容如下:
此時(shí)已經(jīng)可以開啟你的 vue 之旅了。
當(dāng)學(xué)會(huì)了 Vue 之后,你就可以修改本項(xiàng)目的前端源代碼來滿足自己的需求了,進(jìn)入 src 目錄,查看并修改源代碼之后,進(jìn)入 cmdb_web 的項(xiàng)目目錄,執(zhí)行
# 安裝依賴,如果慢可換成 cnpm npm install # 啟動(dòng)服務(wù),默認(rèn)端口為8080,如果被占用會(huì)自動(dòng)選取一個(gè)未被占用的端口 npm run dev # 建立靜態(tài)文件,可以放在 nginx 上運(yùn)行 npm run build # 查看建立報(bào)告 npm run build --report
即可將生成的 dist 部署到 web 服務(wù)器了。
也許你想這樣實(shí)在太麻煩了,自己動(dòng)手寫一個(gè) cmdb 系統(tǒng),當(dāng)然也可以,但是我不推薦這樣做,畢竟你的時(shí)間是有限的,自己寫一個(gè)要比拿優(yōu)秀的代碼來改造要慢得多,當(dāng)然大神例外,作為一般人我們應(yīng)該避免重復(fù)造輪子,學(xué)會(huì)站在巨人的肩膀上。開發(fā)一個(gè)項(xiàng)目最好是找 github 上優(yōu)秀的開源項(xiàng)目,拿來做修改以滿足自己的需求,這才是正確的做法。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
