您好,登錄后才能下訂單哦!
這篇文章主要介紹使用python搭建一個CMDB系統的案例,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
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=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("請以root權限運行") site_url = input_para("請輸入網站域名或IP(http://cmdb.xxx.com):") email_host = input_para("網站郵箱服務器(smtp.163.com):") email_port = input_para("郵箱服務器端口(25):") email_username = input_para("郵箱用戶名(cmdb@163.com):") email_password = input_para("郵箱密碼|獨立授權碼(P@ssw0rd):") print("開始安裝docker") install_docker() print("開始創建目錄") create_dir() print("開始運行mysql容器") run_db_container() print("開始運行elasticsearch容器") run_es_container() print("等待數據庫啟動完成(10s)") time.sleep(10) print("開始初始化數據庫") init_db() print("開始運行cmdb") run_cmdb_container(site_url, email_host, email_port, email_username, email_password) print("完成!")
輸入網站地址和郵箱信息開始安裝,如下圖所示:
如果一切順利一會兒后您將看到安裝完成,如果失敗了可能就要調整一些系統參數并刪除已運行的容器重新執行了,不過根據我的安裝經驗,基本不會出錯,容器還是非常方便部署的。
執行
sudo docker ps
將看到三個正在運行的容器,分別是 cmdb,cmdb-es,cmdb-db,如下圖所示
其中 cmdb 運行著 web 服務器(nginx,uwsgi,django,vue.js),cmdb-es 運行著 Elasticsearch 全文檢索引擎,也存儲你的配置信息,cmdb-db 運行著 mysql,保存著 web 服務器的元數據(django 的知識庫)。
在瀏覽器中輸入"localhost" 盡情的開始享用吧。
2. 不使用 Docker
下面的內容主要是分享給 windows 用戶的,linux 用戶也可以對比操作,沒有問題。使用 Docker 雖然方便部署,但它屏蔽了一些細節,不利于二次開發和問題排查。在不使用 Docker 的情況下,我們不僅要裝軟件,還要安裝依賴,配置環境,雖然麻煩,但是可以學到更多知識,出了問題也可以很快定位,更能加深對項目框架的理解,也是值得的。
(1)安裝 mysql,創建數據庫,配置權限
如果你的本機已經安裝 mysql,則不心再安裝,直接創建數據庫,配置權限即可。
安裝 mysql
從網官下載最新的 MySQL Community Server [https://dev.mysql.com/downloads/mysql/]
比如我下載的是 mysql-8.0.12-winx64.zip ,這是個免安裝版本,直接解壓到你想安裝的目錄內,并在里面新建 my.ini 文件,位置如下圖所示:
my.ini 的文件內容如下所示:
[mysqld] # 設置3306端口 port=3306 # 設置mysql的安裝目錄 basedir=D:\program\mysql\mysql-8.0.12-winx64 # 設置mysql數據庫的數據的存放目錄 datadir=D:\program\mysql\mysql-8.0.12-winx64\data # 允許最大連接數 max_connections=200 # 允許連接失敗的次數。這是為了防止有人從該主機試圖攻擊數據庫系統 max_connect_errors=10 # 服務端使用的字符集默認為UTF8 character-set-server=utf8 # 創建新表時將使用的默認存儲引擎 default-storage-engine=INNODB # 默認使用“mysql_native_password”插件認證 default_authentication_plugin=mysql_native_password [mysql] # 設置mysql客戶端默認字符集 default-character-set=utf8 [client] # 設置mysql客戶端連接服務端時默認使用的端口 port=3306 default-character-set=utf8
請注意下面的路徑設置要正確,
# 設置mysql的安裝目錄 basedir=D:\program\mysql\mysql-8.0.12-winx64 # 設置mysql數據庫的數據的存放目錄 datadir=D:\program\mysql\mysql-8.0.12-winx64\data
如果你想從任意一個命令窗口啟動 mysql,請把 D:\program\mysql\mysql-8.0.12-winx64\bin 加入環境變量。*
這個 my.ini 文件的編碼一定保存為 gbk 格式,否則會報錯,我費了好長時間才發現這個問題。
接下來在MySQL安裝目錄的 bin 目錄(D:\program\mysql\mysql-8.0.12-winx64\bin)下以管理員權限執行命令:mysqld --initialize --console;執行完成后,在輸出信息中會打印 root 用戶的初始密碼,比如
[Server] A temporary password is generated for root@localhost: rIafvf5f5G,a
表示臨時密碼為 rIafvf5f5G,a ,用于 root 用戶第一次登陸,之后再修改 root 用戶的密碼。
這一步執行后完成初始化操作,并在安裝目錄下生成 data 文件夾,用于存放數據。執行
mysqld --install
完成 mysql 服務的安裝,安裝完成之后,就可以通過命令 net start mysql 啟動 mysql 的服務了。通過命令 net stop mysql 停止服務。通過命令 sc delete mysql /mysqld -remove 卸載 mysql 服務。接下來就可以建庫、用戶、分配權限了。
修改 root 密碼:
在 mysql 安裝目錄的 bin 目錄下執行命令:mysql -u root -p 然后輸入上面的密碼,進入 mysql 環境,執行
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼';
注意命令尾的“;”一定要有,這是 mysql 的語法,
管理員 root 的 host 是 localhost,代表僅限 localhost 登錄訪問。如果要允許開放其他 ip 登錄,則需要添加新的 host。如果要允許所有 ip 訪問,可以直接修改成“%”;
ALTER USER 'root'@'%' IDENTIFIED BY '遠程登陸密碼';
創建數據庫,并分配用戶權限
使用 root 用戶登陸 mysql 并執行
mysql>create database cmdb;
即可創建數據庫 cmdb,但是這個數據庫只能有 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
這一步很簡單,官網下載解壓,進入其 bin 目錄運行如下圖所示的 bat 文件即可 :
如果運行失敗,說明本機沒有安裝 java,或者沒有正確地配置 java 環境變量,這些操作也非常簡單,網上到處都是,不在此詳述。
(3)運行 cmdb 后端 api 服務、前端 ui
首先準備 Python3 的環境,這個也很簡單,直接官網下載,運行即可,記得把 Python 添加到 Path 變量中。
如果你的電腦里有多個項目,為防止項目的依賴包版本沖突,建議使用 virtualenv 來為每個項目前創建一個虛擬的 Python 環境,將各自的依賴包裝在自己的虛擬環境里。
(1)部署后端
執行以下命令,注意命令后面的注釋。
git clone https://github.com/open-cmdb/cmdb.git cd cmdb #如創建了虛擬環境,請先激活 pip install -r requirements.txt #如果這一步有包安裝失敗,提示卻少 microsoft visual c++ 14.0 的話,請在網站 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 上查找相應的whl文件,直接 pip install .whl文件即可。
接下來修改3個文件
修改 apps/mgmt/views.py 文件,注釋掉 “ from . import initialize ”這一行。
修改 manage.py
將 APP_NAME = BASE_DIR.rsplit("/", 1)[-1] 修改為
APP_NAME = BASE_DIR.rsplit("\", 1)[-1] ,這是因為windows的路徑\ 在python 里會變成 \。
修改 cmdb/settings.py 文件,修改mysql 數據庫的配置信息如下所示:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': "cmdb", "HOST": "127.0.0.1", "PORT": 3306, "USER": "aaron", "PASSWORD": "aaron" } }
接著在命令窗口繼續執行以下操作:請關注注釋內容。
python manage.py makemigrations python manage.py migrate python manage.py cmdb_create_superuser #這一步創建一可以登陸的管理員用戶 #修改 apps/mgmt/views.py 文件,取消注釋“ from . import initialize ” python manage.py runserver #這一步啟動后端的 api 服務
此時一個后端的服務已經啟動了,在瀏覽器中打開 “127.0.0.1:8000”就可以看到 api 的接口了。
(2)使用 nginx 部署前端并連接后端 api 服務
在命令容器執行以下命令:
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; }
讓前臺發過來中以 api 開頭的 url 請求都轉發至 http://127.0.0.1:8000 進行解析,即第一步部署的 django 項目,這樣就連接了前端和后端。然后我們在 nginx.exe 所在的目錄下啟動 nginx 服務。
接下來在瀏覽器中輸入 127.0.0.1:8080 即可正常訪問本文開始處的 cmdb 系統,您可以嘗試下強大的搜索功能及增刪改功能。
點擊右上方【API 文檔】 可以訪問 cmdb 的接口文檔,非常方便。
至此系統搭建完畢。如果要用于生產環境,請使用 linux 操作系統,并使用 uwsgi 來驅動 django 項目。
3. Vue 環境搭建
我想你不會僅僅滿足于將別人的項目下載下來能運行就行了,你肯定想對其進行改造來滿足自己的需求。因此你可能會需要修改前端或后端,后端的修改其實上面部署的已經可以了,你可以直接閱讀 django 項目的源代碼進行修改調試。如果要修改前端代碼進行調試,你就需要搭建 Vue 環境。
你可能會問了,Vue 是個啥?Vue 是一個 javascript 框架,如果說 jQuery,你可能就知道了,使用方法是類似的,在 html 上引入一行 javascript 的文件,就可以使用框架的特性了。 Vue 是一套用于構建用戶界面的漸進式框架。與其它大型框架不同的是,Vue 被設計為可以自底向上逐層應用。Vue 的核心庫只關注視圖層,不僅易于上手,還便于與第三方庫或既有項目整合。另一方面,當與現代化的工具鏈以及各種支持類庫結合使用時,Vue 也完全能夠為復雜的單頁應用提供驅動。
學習 vue 需要有 html、css、javascript 基礎
新手可以通過 html 上引入 Vue 的 js 文件來使用 vue,如下所示:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Vue 測試實例 </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>
但是在較復雜的項目中,還是要使用工具來幫助我們管理項目的層級及文件之間的依賴關系,這就需要使用 vue 的命令行工具 vue-cli ,vue-cli 需要 npm 工具來安裝,npm 工具集成在 node.js 中,因此需要安裝 node.js。
安裝 node.js 非常簡單,直接官網下載解壓即可使用:
將此路徑添加到環境變量 Path 中,你就可以在任意的命令窗口使用 npm 命令了。
1、安裝 vue-cli
先安裝淘寶鏡像,大家都知道國內直接使用 npm 的官方鏡像是非常慢的,這里推薦使用淘寶 NPM 鏡像。
npm install -g cnpm --registry=https://registry.npm.taobao.org
執行結果如下:
這樣就可以使用 cnpm 命令來安裝模塊了:使用 cnpm 安裝 vue-cli
然后就可以使用 vue init webpack my-project 來建一個項目my-project,這里需要進行一些配置,默認回車即可,如下圖所示:
等依賴安裝完畢后,進入項目,執行以下命令:
C:\Users\xx>cd my-project C:\Users\xx\my-project>cnpm install C:\Users\xx\my-project>cnpm run dev
運行成功后后打印如下信息:
此時打開瀏覽器,輸入 http://localhost:8081
如果要把這個頁面部署在 nginx 服務器上,你還需要 build 來生成靜態資源,如下圖所示:
這時會在 my-project 下生成 dist 目錄,相當于我們寫程序編譯生成的目標文件。my-project 下的內容如下:
此時已經可以開啟你的 vue 之旅了。
當學會了 Vue 之后,你就可以修改本項目的前端源代碼來滿足自己的需求了,進入 src 目錄,查看并修改源代碼之后,進入 cmdb_web 的項目目錄,執行
# 安裝依賴,如果慢可換成 cnpm npm install # 啟動服務,默認端口為8080,如果被占用會自動選取一個未被占用的端口 npm run dev # 建立靜態文件,可以放在 nginx 上運行 npm run build # 查看建立報告 npm run build --report
即可將生成的 dist 部署到 web 服務器了。
也許你想這樣實在太麻煩了,自己動手寫一個 cmdb 系統,當然也可以,但是我不推薦這樣做,畢竟你的時間是有限的,自己寫一個要比拿優秀的代碼來改造要慢得多,當然大神例外,作為一般人我們應該避免重復造輪子,學會站在巨人的肩膀上。開發一個項目最好是找 github 上優秀的開源項目,拿來做修改以滿足自己的需求,這才是正確的做法。
以上是“使用python搭建一個CMDB系統的案例”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。