搭建一個超好用的 cmdb 系統

10 分鐘爲你搭建一個超好用的 cmdb 系統

CMDB 是什麼,做爲 IT 工程師的你想必已經據說過了,或者已經爛熟了,容我再介紹一下,以防有讀者還不知道。CMDB 的全稱是 Configuration Management Data Base,翻譯下就是配置管理數據庫,它存儲與管理企業 IT 架構中設備的各類配置信息,它支撐服務流程的運轉、發揮着配置信息的價值。在今天,不管是自動化運維、標準化運維、DevOps、甚至是時髦的智能運維,其實都離開不 CMDB,能夠說 CMDB 是運維體系的基石,有了配置信息數據庫,後面各類標準、流程均可以創建在 CMDB 基礎之上,從而實現真正的標準化、自動化、智能化運維,節約運維成本的同時,也下降運維流程混亂帶來的操做風險。javascript

今天分享一個開源的 cmdb 系統的搭建過程,經過這一系列搭建的過程你不只能夠得到一個支持全文檢索、自帶 restful api 的 cmdb 系統,並且還能夠學到很多時髦的技術。css

後端技術:html

  • Python3
  • Django
  • Django REST framework
  • Elasticsearch
  • uwsgi
  • Nginx
  • Docker

前端技術:前端

  • Vue
  • Element-ui
  • Vue-Router
  • Vuex
  • Axios

先看一下這個 CMDB 系統的容顏,設計上參考了餓了麼內部的 cmdb 系統:vue

 
open-cmdb

基本功能有:熱添加刪除表、自定義字段類型,方便增刪改查的前端界面,強大的搜索查找能力(後端使用elasticsearch存儲數據 ) 能夠配合 kibana 使用,查看數據的刪除修改記錄、歷史版本等,還帶有表級權限管理,開放全部 API。java

github 倉庫
後端:https://github.com/open-cmdb/cmdb
前端:https://github.com/open-cmdb/cmdb-webnode

 

 

下面介紹兩種方法搭建此開源 cmdb 系統 ,一個是使用 Docker,適用於 linux 操做系統 ,另外一個是不使用 Docker,適用於 windows 和 linux 。最後介紹下 vue 環境的搭建。python

1. 使用 Docker

若是你熟悉容器技術,推薦使用此方法,不過最新的 Docker 目前還不支持大多數的 windows 版本,所以若是使用容器,請使用 ubuntu 或 centos 等 Linux 操做系統。首先要安裝 Docker,安裝 Docker 的方法請參考我以前的一篇文章docker容器從入門到癡迷,或直接網上搜索對應操做系統的安裝方法對着作便可,沒有難度。mysql

環境準備:

一、一臺能夠訪問互聯網的 linux 服務器 內存最好 >= 4G ,並建立一個具備 sudo 權限的普通用戶,注意要有 yum 命令,若是沒有能夠安裝下
二、一個 cmdb 專用的郵箱,用於發送密碼和驗證碼,若是使用16三、qq等第三方郵箱請在設置裏面打開POP3/SMTP/IMAP服務並生成受權碼。若是不使用註冊和忘記密碼功能,也能夠不許備linux

一鍵安裝

將下述代碼保存到 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,則不心再安裝,直接建立數據庫,配置權限便可。

  1. 安裝 mysql

從網官下載最新的 MySQL Community Server [https://dev.mysql.com/downloads/mysql/]
好比我下載的是 mysql-8.0.12-winx64.zip ,這是個免安裝版本,直接解壓到你想安裝的目錄內,並在裏面新建 my.ini 文件,位置以下圖所示:

 
image.png

 

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 '遠程登錄密碼';
  1. 建立數據庫,並分配用戶權限

使用 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

全文搜索屬於最多見的需求,開源的 Elasticsearch (如下簡稱 Elastic)是目前全文搜索引擎的首選。
它能夠快速地儲存、搜索和分析海量數據。維基百科、Stack Overflow、Github 都採用它。安裝 Elasticsearch 很是簡單,官網下載解壓,進入其 bin 目錄運行以下圖所示的 bat 文件便可 :

 

 

 

它是一個 java 編寫的程序,若是要修改佔用內存的大小,請找到配置文件,例如修改成 -Xmx10g -Xms10g 表示初始化 10 個 G 的內存空間給 Elasticsearch ,Elasticsearch 最大使用的內存也是 10G,通常狀況下,設置爲內存的一半大小,但最好不超過 32 G,根據需求,生產環境適合調大,測試環境適當調小。

若是運行失敗,說明本機沒有安裝 java,或者沒有正確地配置 java 環境變量,這些操做也很是簡單,網上處處都是,不在此詳述。

(3)運行 cmdb 後端 api 服務、前端 ui

首先準備 Python3 的環境,這個也很簡單,直接官網下載,運行便可,記得把 Python.exe 所在的路徑添加到 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個文件

  1. 修改 apps/mgmt/views.py 文件,註釋掉 「 from . import initialize 」這一行。
  2. 修改 manage.py
    將 APP_NAME = BASE_DIR.rsplit("/", 1)[-1] 修改成
    APP_NAME = BASE_DIR.rsplit("\", 1)[-1] ,這是由於windows的路徑\ 在python 裏會變成 \。
  3. 修改 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 很是簡單,直接官網下載解壓便可使用:

 

 

 

將 npm 所在路徑添加到環境變量 Path 中,你就能夠在任意的命令窗口使用 npm 命令了。
一、安裝 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

此時會自動 build ,運行成功後會打印以下信息表示服務已正常啓動:

 

 
3compliesucce.png

此時打開瀏覽器,輸入 http://localhost:8081,便可看到 my-project 在瀏覽器中的展現。

 

若是要把這個頁面部署在 nginx 服務器上,你還須要 build 命令來生成靜態資源,以下圖所示:

 

 
image.png

 

此時會在 my-project 下生成 dist 目錄,至關於咱們寫程序編譯生成的目標文件。my-project 下的內容及說明以下圖所示:

 

 
Snipaste_2018-10-26_06-47-24.png


此時已經能夠開啓你的 vue 之旅了。

當學會了 Vue 以後,你就能夠修改本項目的前端源代碼來知足本身的需求了,進入 src 目錄,查看並修改源代碼以後,進入 cmdb_web 的項目目錄,執行

# 安裝依賴,若是慢可換成 cnpm
npm install
# 啓動服務,默認端口爲8080,若是被佔用會自動選取一個未被佔用的端口
npm run dev
# 創建靜態文件,能夠放在 nginx 上運行
npm run build
# 查看創建報告
npm run build --report

便可將生成的 dist 部署到 web 服務器了。

也許你會認爲這樣實在太麻煩了,不如本身動手寫一個 cmdb 系統,若是時間容許固然能夠本身寫,可是我不推薦這樣作,上述這些操做其實都很簡單,在熟悉以後就像打字同樣容易,並且本身寫一個一樣效果的系統要直接拿優秀的代碼來改造要慢得多,大神例外。做爲通常程序員咱們應該避免重複造輪子,學會站在巨人的肩膀上。所以開發一個項目最好是找 github 上相似的優秀開源項目,借鑑其優良設計,甚至能夠直接拿來作二次開發,這纔是最高效的作法。

10 分鐘爲你搭建一個超好用的 cmdb 系統

52018.10.28 06:52:31 字數 3823 閱讀 11443

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 系統:

 
open-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容器從入門到癡迷,或直接網上搜索對應操做系統的安裝方法對着作便可,沒有難度。

環境準備:

一、一臺能夠訪問互聯網的 linux 服務器 內存最好 >= 4G ,並建立一個具備 sudo 權限的普通用戶,注意要有 yum 命令,若是沒有能夠安裝下
二、一個 cmdb 專用的郵箱,用於發送密碼和驗證碼,若是使用16三、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,則不心再安裝,直接建立數據庫,配置權限便可。

  1. 安裝 mysql

從網官下載最新的 MySQL Community Server [https://dev.mysql.com/downloads/mysql/]
好比我下載的是 mysql-8.0.12-winx64.zip ,這是個免安裝版本,直接解壓到你想安裝的目錄內,並在裏面新建 my.ini 文件,位置以下圖所示:

 
image.png

 

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 '遠程登錄密碼';
  1. 建立數據庫,並分配用戶權限

使用 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

全文搜索屬於最多見的需求,開源的 Elasticsearch (如下簡稱 Elastic)是目前全文搜索引擎的首選。
它能夠快速地儲存、搜索和分析海量數據。維基百科、Stack Overflow、Github 都採用它。安裝 Elasticsearch 很是簡單,官網下載解壓,進入其 bin 目錄運行以下圖所示的 bat 文件便可 :

 

 

 

它是一個 java 編寫的程序,若是要修改佔用內存的大小,請找到配置文件,例如修改成 -Xmx10g -Xms10g 表示初始化 10 個 G 的內存空間給 Elasticsearch ,Elasticsearch 最大使用的內存也是 10G,通常狀況下,設置爲內存的一半大小,但最好不超過 32 G,根據需求,生產環境適合調大,測試環境適當調小。

若是運行失敗,說明本機沒有安裝 java,或者沒有正確地配置 java 環境變量,這些操做也很是簡單,網上處處都是,不在此詳述。

(3)運行 cmdb 後端 api 服務、前端 ui

首先準備 Python3 的環境,這個也很簡單,直接官網下載,運行便可,記得把 Python.exe 所在的路徑添加到 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個文件

  1. 修改 apps/mgmt/views.py 文件,註釋掉 「 from . import initialize 」這一行。
  2. 修改 manage.py
    將 APP_NAME = BASE_DIR.rsplit("/", 1)[-1] 修改成
    APP_NAME = BASE_DIR.rsplit("\", 1)[-1] ,這是由於windows的路徑\ 在python 裏會變成 \。
  3. 修改 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 很是簡單,直接官網下載解壓便可使用:

 

 

 

將 npm 所在路徑添加到環境變量 Path 中,你就能夠在任意的命令窗口使用 npm 命令了。
一、安裝 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

此時會自動 build ,運行成功後會打印以下信息表示服務已正常啓動:

 

 
3compliesucce.png

此時打開瀏覽器,輸入 http://localhost:8081,便可看到 my-project 在瀏覽器中的展現。

 

若是要把這個頁面部署在 nginx 服務器上,你還須要 build 命令來生成靜態資源,以下圖所示:

 

 
image.png

 

此時會在 my-project 下生成 dist 目錄,至關於咱們寫程序編譯生成的目標文件。my-project 下的內容及說明以下圖所示:

 

 
Snipaste_2018-10-26_06-47-24.png


此時已經能夠開啓你的 vue 之旅了。

當學會了 Vue 以後,你就能夠修改本項目的前端源代碼來知足本身的需求了,進入 src 目錄,查看並修改源代碼以後,進入 cmdb_web 的項目目錄,執行

# 安裝依賴,若是慢可換成 cnpm
npm install
# 啓動服務,默認端口爲8080,若是被佔用會自動選取一個未被佔用的端口
npm run dev
# 創建靜態文件,能夠放在 nginx 上運行
npm run build
# 查看創建報告
npm run build --report

便可將生成的 dist 部署到 web 服務器了。

也許你會認爲這樣實在太麻煩了,不如本身動手寫一個 cmdb 系統,若是時間容許固然能夠本身寫,可是我不推薦這樣作,上述這些操做其實都很簡單,在熟悉以後就像打字同樣容易,並且本身寫一個一樣效果的系統要直接拿優秀的代碼來改造要慢得多,大神例外。做爲通常程序員咱們應該避免重複造輪子,學會站在巨人的肩膀上。所以開發一個項目最好是找 github 上相似的優秀開源項目,借鑑其優良設計,甚至能夠直接拿來作二次開發,這纔是最高效的作法。

相關文章
相關標籤/搜索