10分鐘用python搭建一個(gè)超好用的CMDB系統(tǒng)
CMDB 是什么,作為 IT 工程師的你想必已經(jīng)聽(tīng)說(shuō)過(guò)了,或者已經(jīng)爛熟了,容我再介紹一下,以防有讀者還不知道。CMDB 的全稱(chēng)是 Configuration Management Data Base,翻譯下就是配置管理數(shù)據(jù)庫(kù),它存儲(chǔ)與管理企業(yè) IT 架構(gòu)中設(shè)備的各種配置信息,它支撐服務(wù)流程的運(yùn)轉(zhuǎn)、發(fā)揮著配置信息的價(jià)值。在今天,無(wú)論是自動(dòng)化運(yùn)維、標(biāo)準(zhǔn)化運(yùn)維、DevOps、甚至是時(shí)髦的智能運(yùn)維,其實(shí)都離開(kāi)不 CMDB,可以說(shuō) CMDB 是運(yùn)維體系的基石,有了配置信息數(shù)據(jù)庫(kù),后面各種標(biāo)準(zhǔn)、流程都可以建立在 CMDB 基礎(chǔ)之上,從而實(shí)現(xiàn)真正的標(biāo)準(zhǔn)化、自動(dòng)化、智能化運(yùn)維,節(jié)約運(yùn)維成本的同時(shí),也降低運(yùn)維流程混亂帶來(lái)的操作風(fēng)險(xiǎn)。
今天分享一個(gè)開(kāi)源的 cmdb 系統(tǒng)的搭建過(guò)程,通過(guò)這一系列搭建的過(guò)程你不僅可以獲得一個(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):

基本功能有:熱添加刪除表、自定義字段類(lèi)型,方便增刪改查的前端界面,強(qiáng)大的搜索查找能力(后端使用elasticsearch存儲(chǔ)數(shù)據(jù) ) 可以配合 kibana 使用,查看數(shù)據(jù)的刪除修改記錄、歷史版本等,還帶有表級(jí)權(quán)限管理,開(kāi)放所有 API。
github 倉(cāng)庫(kù)
后端:https://github.com/open-cmdb/cmdb
前端:https://github.com/open-cmdb/cmdb-web
下面介紹兩種方法搭建此開(kāi)源 cmdb 系統(tǒng) ,一個(gè)是使用 Docker,適用于 linux 操作系統(tǒng) ,另一個(gè)是不使用 Docker,適用于 windows 和 linux 。最后介紹下 vue 環(huán)境的搭建。
1. 使用 Docker
如果你熟悉容器技術(shù),推薦使用此方法,不過(guò)最新的 Docker 目前還不支持大多數(shù)的 windows 版本,因此如果使用容器,請(qǐng)使用 ubuntu 或 centos 等 Linux 操作系統(tǒng)。首先要安裝 Docker,安裝 Docker 的方法請(qǐng)參考我之前的一篇文章docker容器從入門(mén)到癡迷,或直接網(wǎng)上搜索對(duì)應(yīng)操作系統(tǒng)的安裝方法對(duì)著做即可,沒(méi)有難度。
環(huán)境準(zhǔn)備:
1、一臺(tái)可以訪問(wèn)互聯(lián)網(wǎng)的 linux 服務(wù)器 內(nèi)存最好 >= 4G ,并創(chuàng)建一個(gè)具有 sudo 權(quán)限的普通用戶(hù),注意要有 yum 命令,如果沒(méi)有可以安裝下。
2、一個(gè) cmdb 專(zhuān)用的郵箱,用于發(fā)送密碼和驗(yàn)證碼,如果使用163、qq等第三方郵箱請(qǐng)?jiān)谠O(shè)置里面打開(kāi)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("郵箱用戶(hù)名(cmdb@163.com):")
email_password = input_para("郵箱密碼|獨(dú)立授權(quán)碼(P@ssw0rd):")
print("開(kāi)始安裝docker")
install_docker()
print("開(kāi)始創(chuàng)建目錄")
create_dir()
print("開(kāi)始運(yùn)行mysql容器")
run_db_container()
print("開(kāi)始運(yùn)行elasticsearch容器")
run_es_container()
print("等待數(shù)據(jù)庫(kù)啟動(dòng)完成(10s)")
time.sleep(10)
print("開(kāi)始初始化數(shù)據(jù)庫(kù)")
init_db()
print("開(kāi)始運(yùn)行cmdb")
run_cmdb_container(site_url, email_host, email_port, email_username, email_password)
print("完成!")
輸入網(wǎng)站地址和郵箱信息開(kāi)始安裝,如下圖所示:

如果一切順利一會(huì)兒后您將看到安裝完成,如果失敗了可能就要調(diào)整一些系統(tǒng)參數(shù)并刪除已運(yùn)行的容器重新執(zhí)行了,不過(guò)根據(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í)庫(kù))。
在瀏覽器中輸入"localhost" 盡情的開(kāi)始享用吧。
2. 不使用 Docker
下面的內(nèi)容主要是分享給 windows 用戶(hù)的,linux 用戶(hù)也可以對(duì)比操作,沒(méi)有問(wèn)題。使用 Docker 雖然方便部署,但它屏蔽了一些細(xì)節(jié),不利于二次開(kāi)發(fā)和問(wèn)題排查。在不使用 Docker 的情況下,我們不僅要裝軟件,還要安裝依賴(lài),配置環(huán)境,雖然麻煩,但是可以學(xué)到更多知識(shí),出了問(wèn)題也可以很快定位,更能加深對(duì)項(xiàng)目框架的理解,也是值得的。
(1)安裝 mysql,創(chuàng)建數(shù)據(jù)庫(kù),配置權(quán)限
如果你的本機(jī)已經(jīng)安裝 mysql,則不心再安裝,直接創(chuàng)建數(shù)據(jù)庫(kù),配置權(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ù)庫(kù)的數(shù)據(jù)的存放目錄 datadir=D:\program\mysql\mysql-8.0.12-winx64\data # 允許最大連接數(shù) max_connections=200 # 允許連接失敗的次數(shù)。這是為了防止有人從該主機(jī)試圖攻擊數(shù)據(jù)庫(kù)系統(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客戶(hù)端默認(rèn)字符集 default-character-set=utf8 [client] # 設(shè)置mysql客戶(hù)端連接服務(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ù)庫(kù)的數(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è)問(wèn)題。
接下來(lái)在MySQL安裝目錄的 bin 目錄(D:\program\mysql\mysql-8.0.12-winx64\bin)下以管理員權(quán)限執(zhí)行命令:mysqld --initialize --console;執(zhí)行完成后,在輸出信息中會(huì)打印 root 用戶(hù)的初始密碼,比如
[Server] A temporary password is generated for root@localhost: rIafvf5f5G,a
表示臨時(shí)密碼為 rIafvf5f5G,a ,用于 root 用戶(hù)第一次登陸,之后再修改 root 用戶(hù)的密碼。
這一步執(zhí)行后完成初始化操作,并在安裝目錄下生成 data 文件夾,用于存放數(shù)據(jù)。執(zhí)行
mysqld --install
完成 mysql 服務(wù)的安裝,安裝完成之后,就可以通過(guò)命令 net start mysql 啟動(dòng) mysql 的服務(wù)了。通過(guò)命令 net stop mysql 停止服務(wù)。通過(guò)命令 sc delete mysql /mysqld -remove 卸載 mysql 服務(wù)。接下來(lái)就可以建庫(kù)、用戶(hù)、分配權(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 的語(yǔ)法,
管理員 root 的 host 是 localhost,代表僅限 localhost 登錄訪問(wèn)。如果要允許開(kāi)放其他 ip 登錄,則需要添加新的 host。如果要允許所有 ip 訪問(wèn),可以直接修改成“%”;
ALTER USER 'root'@'%' IDENTIFIED BY '遠(yuǎn)程登陸密碼';
創(chuàng)建數(shù)據(jù)庫(kù),并分配用戶(hù)權(quán)限
使用 root 用戶(hù)登陸 mysql 并執(zhí)行
mysql>create database cmdb;
即可創(chuàng)建數(shù)據(jù)庫(kù) cmdb,但是這個(gè)數(shù)據(jù)庫(kù)只能有 root 訪問(wèn),如果要使用其他用戶(hù)訪問(wèn),則先新建用戶(hù),例如讓 aaron 用戶(hù)可以完全控制 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)行失敗,說(shuō)明本機(jī)沒(méi)有安裝 java,或者沒(méi)有正確地配置 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)目的依賴(lài)包版本沖突,建議使用 virtualenv 來(lái)為每個(gè)項(xiàng)目前創(chuàng)建一個(gè)虛擬的 Python 環(huán)境,將各自的依賴(lài)包裝在自己的虛擬環(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文件即可。
接下來(lái)修改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ù)庫(kù)的配置信息如下所示:
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)建一可以登陸的管理員用戶(hù) #修改 apps/mgmt/views.py 文件,取消注釋“ from . import initialize ” python manage.py runserver #這一步啟動(dòng)后端的 api 服務(wù)
此時(shí)一個(gè)后端的服務(wù)已經(jīng)啟動(dòng)了,在瀏覽器中打開(kāi) “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ā)過(guò)來(lái)中以 api 開(kāi)頭的 url 請(qǐng)求都轉(zhuǎn)發(fā)至 http://127.0.0.1:8000 進(jìn)行解析,即第一步部署的 django 項(xiàng)目,這樣就連接了前端和后端。然后我們?cè)?nginx.exe 所在的目錄下啟動(dòng) nginx 服務(wù)。

接下來(lái)在瀏覽器中輸入 127.0.0.1:8080 即可正常訪問(wèn)本文開(kāi)始處的 cmdb 系統(tǒng),您可以嘗試下強(qiáng)大的搜索功能及增刪改功能。

點(diǎn)擊右上方【API 文檔】 可以訪問(wèn) cmdb 的接口文檔,非常方便。

至此系統(tǒng)搭建完畢。如果要用于生產(chǎn)環(huán)境,請(qǐng)使用 linux 操作系統(tǒng),并使用 uwsgi 來(lái)驅(qū)動(dòng) django 項(xiàng)目。
3. Vue 環(huán)境搭建
我想你不會(huì)僅僅滿(mǎn)足于將別人的項(xiàng)目下載下來(lái)能運(yùn)行就行了,你肯定想對(duì)其進(jìn)行改造來(lái)滿(mǎn)足自己的需求。因此你可能會(huì)需要修改前端或后端,后端的修改其實(shí)上面部署的已經(jīng)可以了,你可以直接閱讀 django 項(xiàng)目的源代碼進(jìn)行修改調(diào)試。如果要修改前端代碼進(jìn)行調(diào)試,你就需要搭建 Vue 環(huán)境。
你可能會(huì)問(wèn)了,Vue 是個(gè)啥?Vue 是一個(gè) javascript 框架,如果說(shuō) jQuery,你可能就知道了,使用方法是類(lèi)似的,在 html 上引入一行 javascript 的文件,就可以使用框架的特性了。 Vue 是一套用于構(gòu)建用戶(hù)界面的漸進(jìn)式框架。與其它大型框架不同的是,Vue 被設(shè)計(jì)為可以自底向上逐層應(yīng)用。Vue 的核心庫(kù)只關(guān)注視圖層,不僅易于上手,還便于與第三方庫(kù)或既有項(xiàng)目整合。另一方面,當(dāng)與現(xiàn)代化的工具鏈以及各種支持類(lèi)庫(kù)結(jié)合使用時(shí),Vue 也完全能夠?yàn)閺?fù)雜的單頁(yè)應(yīng)用提供驅(qū)動(dòng)。
學(xué)習(xí) vue 需要有 html、css、javascript 基礎(chǔ)
新手可以通過(guò) html 上引入 Vue 的 js 文件來(lái)使用 vue,如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 </title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<p>{{ message }}</p>
</div>
<script>
new Vue({
el: '#app',
data: {
message: 'Hello Vue.js!'
}
})
</script>
</body>
</html>
但是在較復(fù)雜的項(xiàng)目中,還是要使用工具來(lái)幫助我們管理項(xiàng)目的層級(jí)及文件之間的依賴(lài)關(guān)系,這就需要使用 vue 的命令行工具 vue-cli ,vue-cli 需要 npm 工具來(lái)安裝,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 命令來(lái)安裝模塊了:使用 cnpm 安裝 vue-cli

然后就可以使用 vue init webpack my-project 來(lái)建一個(gè)項(xiàng)目my-project,這里需要進(jìn)行一些配置,默認(rèn)回車(chē)即可,如下圖所示:

等依賴(lài)安裝完畢后,進(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í)打開(kāi)瀏覽器,輸入 http://localhost:8081

如果要把這個(gè)頁(yè)面部署在 nginx 服務(wù)器上,你還需要 build 來(lái)生成靜態(tài)資源,如下圖所示:

這時(shí)會(huì)在 my-project 下生成 dist 目錄,相當(dāng)于我們寫(xiě)程序編譯生成的目標(biāo)文件。my-project 下的內(nèi)容如下:


此時(shí)已經(jīng)可以開(kāi)啟你的 vue 之旅了。
當(dāng)學(xué)會(huì)了 Vue 之后,你就可以修改本項(xiàng)目的前端源代碼來(lái)滿(mǎn)足自己的需求了,進(jìn)入 src 目錄,查看并修改源代碼之后,進(jìn)入 cmdb_web 的項(xiàng)目目錄,執(zhí)行
# 安裝依賴(lài),如果慢可換成 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)手寫(xiě)一個(gè) cmdb 系統(tǒng),當(dāng)然也可以,但是我不推薦這樣做,畢竟你的時(shí)間是有限的,自己寫(xiě)一個(gè)要比拿優(yōu)秀的代碼來(lái)改造要慢得多,當(dāng)然大神例外,作為一般人我們應(yīng)該避免重復(fù)造輪子,學(xué)會(huì)站在巨人的肩膀上。開(kāi)發(fā)一個(gè)項(xiàng)目最好是找 github 上優(yōu)秀的開(kāi)源項(xiàng)目,拿來(lái)做修改以滿(mǎn)足自己的需求,這才是正確的做法。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python操作MySQL數(shù)據(jù)庫(kù)9個(gè)實(shí)用實(shí)例
- python Django連接MySQL數(shù)據(jù)庫(kù)做增刪改查
- python連接oracle數(shù)據(jù)庫(kù)實(shí)例
- python連接mongodb操作數(shù)據(jù)示例(mongodb數(shù)據(jù)庫(kù)配置類(lèi))
- python連接mysql數(shù)據(jù)庫(kù)示例(做增刪改操作)
- Python的Flask框架中使用Flask-SQLAlchemy管理數(shù)據(jù)庫(kù)的教程
- Python MySQL數(shù)據(jù)庫(kù)連接池組件pymysqlpool詳解
- Python實(shí)現(xiàn)數(shù)據(jù)庫(kù)編程方法詳解
相關(guān)文章
使用C語(yǔ)言擴(kuò)展Python程序的簡(jiǎn)單入門(mén)指引
這篇文章主要介紹了使用C語(yǔ)言擴(kuò)展Python程序的簡(jiǎn)單入門(mén)指引,來(lái)自于IBM官網(wǎng)網(wǎng)站技術(shù)文檔,需要的朋友可以參考下2015-04-04
Pygame坦克大戰(zhàn)游戲開(kāi)發(fā)實(shí)戰(zhàn)詳解代碼
《坦克大戰(zhàn)》以二戰(zhàn)坦克為題材,既保留了射擊類(lèi)游戲的操作性,也改進(jìn)了射擊類(lèi)游戲太過(guò)于復(fù)雜難玩的高門(mén)檻特點(diǎn),集休閑與競(jìng)技于一身。經(jīng)典再度襲來(lái),流暢的畫(huà)面,瘋狂的戰(zhàn)斗,讓玩家再次進(jìn)入瘋狂坦克的世界。玩家的目標(biāo)是控制坦克躲避危險(xiǎn),消滅掉所有的敵人即可進(jìn)入下一關(guān)2022-02-02
Python Loguru輕松靈活的日志管理庫(kù)基本用法探索
Loguru是一個(gè)用于Python的高性能、簡(jiǎn)潔且靈活的日志庫(kù),它的目標(biāo)是提供一種簡(jiǎn)單的方式來(lái)記錄應(yīng)用程序的運(yùn)行情況,同時(shí)保持代碼的簡(jiǎn)潔性和可讀性,本文將探索loguru的基本用法2024-01-01
Blueprint實(shí)現(xiàn)路由分組及Flask中session的使用詳解
這篇文章主要為大家介紹了Blueprint實(shí)現(xiàn)路由分組及Flask中session的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
python3實(shí)現(xiàn)SMTP發(fā)送郵件詳細(xì)教程
這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)SMTP發(fā)送郵件的詳細(xì)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
pandas對(duì)齊運(yùn)算的實(shí)現(xiàn)示例
本文主要介紹了pandas對(duì)齊運(yùn)算的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
Python中pytest的參數(shù)化實(shí)例解析
這篇文章主要介紹了Python中pytest的參數(shù)化實(shí)例解析,pytest是一個(gè)非常成熟的全功能的Python測(cè)試框架,主要有簡(jiǎn)單靈活,容易上手,支持參數(shù)化等特點(diǎn),需要的朋友可以參考下2023-07-07

