Python Django構建簡易CMDB


前言

本文僅是對以前寫的小示例進行一次梳理,由於本人菜鳥一枚,后端代碼寫的很渣,前端頁面也不好看,沒有考慮堡壘機等一些安全措施,也沒有運維經驗,所以存在很多紕漏,還請大家多多海涵。

一、程序功能簡介

程序分為cmdb_server,cmdb_client兩部分,以運維為核心開發的簡易框架,cmdb_client主要負責資產信息采集,采集到數據后將數據進行清洗,匯總。使用POST的方式將數據發給cmdb_server,cmdb_server將接收到的數據寫入數據庫。通過前端展現給用戶。

cmdb_client功能:

1、采集資產信息(目前測試主機Windows 7,centos 7)。

2、對采集的數據進行清洗。

3、將清洗后的數據發給cmdb_server。

cmdb_server功能(目前部分功能僅支持centos 7):

1、用戶登錄認證。

2、將cmdb_client發來的資產信息寫入數據庫。

      2.1 將數據庫中的資產信息展示到前端頁面。

      2.2 將主機資產信息導出成Excel格式。

      2.3 將Excel格式的資產信息導入到數據庫。

3、機房信息維護。

4、業務線信息維護。

5、記錄主機資產信息的變更記錄。

6、執行用戶任務(批量執行命令,執行腳本,文件下發。提取客戶端文件到本地)

7、主機硬件,應用監控(郵件報警功能)。

8、遠程連接(webshell和VNC)。

9、docker主機管理。

10、KVM主機管理。

11、搜索功能。

12、主機存活掃描。

二、程序目錄簡介

cmdb_client目錄:

[root@cmdb CMDB]# tree -L 2 cmdb_client/
cmdb_client/
├── bin             # 程序啟動目錄
│   ├── client.py   # 程序啟動文件
│   └── test.txt
├── conf            # 程序配置文件目錄
│   ├── cert        # 主機標識
│   ├── __init__.py
│   ├── __pycache__
│   └── settings.py # 系統默認配置文件
├── lib             # 程序公用文件目錄
│   ├── auth.py
│   ├── conf        # 用戶自定義配置
│   ├── convert.py  # 數據轉換
│   ├── __pycache__
│   ├── responseStructure.py
│   └── stringPathToClass.py  # 字符串發射類
├── log
│   └── system.log
├── requirements.txt
├── src               # 程序功能目錄
     ├── engine       # 數據采集引擎
     ├── plugins      # 數據采集插件
     ├── __pycache__
     └── script.py    # 執行數據采集

cmdb_server目錄:

[root@cmdb CMDB]# tree -L 2 cmdb_server/
cmdb_server/
├── asset_API                # 接收cmdb_client發來的資產信息,將其寫入數據庫
│   ├── admin.py
│   ├── apps.py
│   ├── createHostRecode.py  # 在數據庫中創建資產記錄
│   ├── __init__.py
│   ├── migrations
│   ├── models.py
│   ├── __pycache__
│   ├── tests.py
│   ├── updateHostInfo.py    # 在數據庫中更新主機記錄
│   └── views.py             # 視圖函數,接收客戶端發來的資產信息
├── assetRepository          # 存放數據庫
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   ├── models.py            # 數據庫model
│   ├── __pycache__
│   ├── tests.py
│   └── views.py
├── cmdb_server              # 程序主目錄
│   ├── __init__.py
│   ├── __pycache__
│   ├── settings.py          # 程序配置文件
│   ├── urls.py              # 主路由
│   └── wsgi.py
├── data_dir                 # 數據目錄
│   ├── downloadDir          # 文件中轉目錄
│   ├── __init__.py
│   └── logDir               # 存放日志文件
├── db.sqlite3
├── manage.py
├── plugin                   # 插件庫
│   ├── alarmHandling.py     # 郵件報警
│   ├── encryption.py        # 加密
│   ├── Excel.py             # Excel模塊
│   ├── exceptionHandling.py # 異常處理模塊
│   ├── hostScan.py          # 主機存活掃描模塊
│   ├── __init__.py
│   ├── log.py               # 日志模塊
│   ├── pagination.py        # 分頁模塊
│   ├── public.py            # 公共類
│   ├── __pycache__
│   └── SSH.py               # SSH任務處理模塊
├── requirements.txt
├── show_page                # 功能實現目錄
│   ├── client_manage        # 資產信息展示
│   ├── docker_manage        # docker主機管理
│   ├── host_app_monitor     # 主機監控
│   ├── __init__.py
│   ├── kvm_manage           # KVM主機管理
│   ├── login_register       # 登錄認證
│   ├── __pycache__
│   ├── remote_connect       # 遠程連接
│   ├── user_task            # 執行用戶任務
│   ├── vnc_connect          # 建立VNC連接
│   ├── web                  # 功能類

三、程序開發平台

操作系統:centos 7     

軟件版本:python 3.6   django 1.11.20   mariadb 5.5.64    

主要用到的技術:python,django,SSH,websocket,ajax,前端,JS。需要用到的運維命令及眾多模塊。

四、程序執行流程

SSH模式:

使用agent模式:

SSH對比agent

方便管理:SSH模式只需要將cmdb_client程序放在一台主機即可獲得所有主機資產信息,agent模式需要將cmdb_client程序放到所有主機上。

易於維護:當cmdb_client內容發生改變時,SSH模式只需要修改cmdb_client主機的程序即可,agent模式需要將修改后的cmdb_client程序重新發給每台主機。

運行效率:SSH模式需要通過SSH的方式連接每一台主機,會受網絡,服務器對SSH遠程連接的處理等因素影響效率不是很高,agent模式則是在本地獲取數據后直接使用request.POST將數據發給cmdb_server,沒有遠程登錄認證的過程,因此在效率上要比SSH模式快。

安全性:SSH模式需要登錄到目標主機上,這個過程可能被抓包抓取到登錄憑證或者主機被黑客入侵程序中的登錄認證等敏感信息將被竊取,存在一定安全隱患,agent模式的程序中沒有登錄認證等敏感數據,因此在安全上要好於SSH模式。

程序實現思路:

cmdb_client的SSH模式:

 

cmdb_client的agent模式:

 

cmdb_server:

五、功能簡述

1、登錄認證模塊

該模塊目前只實現了簡單的登錄認證功能,沒有對注冊郵箱,密碼復雜度等進行效驗,注冊成功后,使用郵箱進行登錄。用戶只能在一台電腦上進行登錄,如果希望在其它地方登錄需要先退出賬號在進行登錄。

否則會提示如下內容:

登錄成功后你會看到如下:

2、獲取資產信息模塊

獲取資產信息的方式有三種:cmdb_client采集后發來的數據,用戶通過Excel導入的資產信息,手動添加資產信息。

2.1 cmdb_client通過SSH或者agent的方式采集主機的資產信息:通過request模塊將主機資產信息發給cmdb_server端,cmdb_server接收到數據后,根據標識以創建主機記錄或者更新主機記錄的方式將數據存入數據庫。當接到的數據以更新的方式更新到數據庫時,同時還會將更新的數據寫入主機的表更記錄表,用於記錄主機資產信息發生的變化。

2.2 使用Excel的方式導入主機資產信息:這里需要注意:由於需要和數據庫中字段相對應,所以導入的Excel是有一定格式的,為了方便我將導入和導出設置成相同的格式,所以用戶想要使用Excel導入數據時,先導出一份主機記錄作為導入的模板。這種方式導入的資產信息是以創建主機記錄的方式插入到數據庫的資產表中,而資產表中的主機名是唯一的,所以如果導入的資產信息主機名有重復或者和數據庫中資產信息表的主機名字段重復講導致插入失敗。如下:

2.3 手動添加資產信息其本質和使用Excel導入的方式一致,所以這里不再贅述。

3、資產信息管理模塊

資產信息管理模塊包含資產信息管理,機房信息管理,業務線信息管理三個子模塊。

3.1 資產信息管理功能如下:

     3.1.1 資產信息的增,刪,改,查。

     3.1.2 主機應用,記錄主機上都有哪些應用,需要手動維護。

      3.1.3 資產信息的導入和導出。

導入和導出的Excel樣式如下:

3.2 機房信息管理:該模塊主要記錄機房信息及當發生問題時的機房聯系人員。

3.3 業務線管理:該模塊主要用於標識主機的用途及該主機的負責人。

4、主機變更記錄模塊

主機變更記錄模塊只有通過cmdb_client發送過來的資產信息當中帶有update更新標記的主機才會被記錄到變更記錄表中,關於資產的變更時間可能與實際硬件發生改變的日期不符,因為cmdb_client是定時采集數據的,存在空檔期,所以主機變更記錄日期其實就是cmdb_client采集資產信息的日期。手動添加資產信息,Excel導入資產信息都是以創建新的主機記錄的模式將主機資產信息寫入數據庫,不存在更新一說。

5、用戶任務模塊

該模塊主要包含:批量執行命令,批量文件下發,批量執行腳本文件,文件提取。

5.1 批量執行命令:主要用於執行批量安裝命令,目前僅允許rpm,yum,tar命令的執行,其它命令未放行。

5.2 批量執行腳本:該功能首先將腳本上傳到服務器,由服務器將腳本下發到其它主機並執行該腳本。

5.3 批量文件下發:該功能先將文件上傳到服務器,由服務器將文件下發給其它主機。

5.4 文件提取:選擇一台主機將其文件拷貝到本地,過程也是先將文件拷貝到服務器,由服務端將文件發給前端。

6、遠程連接

遠程連接有兩種方式:SSH,VNC。SSH模式目前僅支持用戶名密碼的方式建立連接,VNC模式是借助的noVNC模塊來實現的。

6.1 使用SSH的方式連接主機

6.2 使用VNC連接遠程主機

7、主機監控模塊

主機監控分為實時查看和后台監控兩種模式。

實時監控:只是方便用戶直觀查看,當監控項超過用戶設定的閾值或者應用無法訪問時不會發送報警郵件,只是直觀的在頁面展示。

后台監控:當監控項超過用戶設定的閾值或者服務無法訪問時會根據用戶設定的監控時間每隔一段時間向用戶發送報警郵件。

監控項分為硬件監控,應用監控。

硬件監控:這一部分會包含登錄信息(SSH模式有數據,SNMP模式沒有數據),內存,硬盤,CPU,網卡流量,用戶可以設置內存,硬盤,CPU的報警閾值,當監控項達到報警閾值時會發送報警郵件。

應用監控:主要監控應用是否可以訪問。

監控方式分為SSH模式,SNMP模式。

SSH模式:該模式需要與被監控端建立SSH連接,通過SSH的方式獲取數據,該模式會獲取到登錄信息,網卡流量。監測也相對准確,缺點就是不安全,但數據准確,被控端不需要任何設置。

SNMP模式:該模式優點在於不需要連接認證,相對來說更加安全,獲取速度快,但被控端需要修改SNMP的配置文件,在獲取網卡流量時可能也不是特別准。

使用SNMP模式監控效果如下:

使用SSH模式監控主機效果如下:

8、docker管理模塊

docker管理模塊分docker主機管理和docker服務及容器管理兩個部分。

docker主機管理

該模塊主要是用於管理服務端與docker主機的連接信息及輔助功能,連接信息主要包含docker主機的IP,用戶名,密碼,SSH端口等信息,輔助功能包含批量安裝docker,批量更新鏡像源,鏡像搜索,批量鏡像下載,批量安裝容器。

批量安裝docker:該功能首先獲取需要安裝的docker版本,然后根據docker版本進行批量安裝。

批量更新鏡像源:該功能主要是用於統一各主機的鏡像下載源,方便統一管理。

鏡像搜索:該功能主要是搜索當前鏡像源下的可用鏡像。

批量鏡像下載:該功能主要實現了為各主機下載統一的鏡像,為批量安裝容器創造條件。

批量安裝容器:該功能主要實現了批量安裝容器的功能。

容器管理

容器管理分為docker服務管理,容器管理,鏡像管理,dockerfile。

docker服務管理:docker服務的開啟,停止,重啟,開機啟動,禁止開機啟動。

容器管理:開啟,停止,重啟,查看容器日志,刪除容器。

鏡像管理:查看鏡像詳情,刪除鏡像。

dockerfile:根據dockerfile構建容器。

下面展示動畫都是第一版的,目前版本的程序此功能沒有什么變化所以就用第一版的演示吧。

8.1 批量安裝docker

8.2 統一鏡像源

8.3 鏡像搜索和批量下載

8.4 批量創建容器

8.5 docker服務,容器,鏡像相關操作

8.6 使用dockerfile創建鏡像

 9、KVM管理模塊

KVM管理模塊分KVM主機管理和虛擬機管理兩部分。

9.1 KVM主機管理

該部分主要包含了連接信息管理,批量安裝KVM,批量創建虛擬機三個功能。

連接信息管理:主要包含了kvm宿主機的連接信息(IP,用戶名,密碼,端口等必填信息)。

批量安裝KVM:實現在各主機上批量安裝KVM。

批量創建虛擬機:創建虛擬機目前支持使用ISO鏡像和母版兩種方式,當使用ISO的方式創建虛擬機時則不能實現批量安裝,因為它涉及到交互,所以只能為單台主機創建虛擬機,通過VNC進行交互。使用母版qcow2的方式可以實現批量安裝虛擬機的功能,因為此種方式不需要交互,但需要用戶提前創建好母版。

9.2 KVM虛擬機管理

該部分主要涉及KVM服務管理,虛擬機管理。

kvm服務管理:開啟,停止,重啟,開機啟動,禁止開機啟動。

虛擬機管理:開啟,停止,重啟虛擬機,刪除虛擬機。注意:在停止虛擬機和重啟虛擬機時這里使用的是粗暴的做法,那就是通過destroy強行停止虛擬機而不是通過shutdown來停止虛擬機,因為shutdown是通過發送acpi指令來控制虛擬機的電源,而KVM虛擬機安裝linux系統時默認沒有安裝acpi服務,反以導致不能關閉虛擬機,需要安裝acpi。關於這部分以后待優化。刪除虛擬機時只是刪除了虛擬機,但沒有刪除虛擬機對應的磁盤文件,需用戶手動清理。

提示:當在kvm主機管理頁面點擊kvm管理時,服務端會到kvm主機上創建ping腳本,建立ARP緩存用於獲取kvm主機的IP地址,該方法會給kvm主機造成一定的壓力,因為建立ARP緩存需要通過腳本ping整個網段,而腳本使用的是多線程所以會占用kvm服務器的資源。

下面通過ISO的方式進行簡單安裝演示:

安裝完成后進入虛擬機管理界面我們會看到如下:

10、搜索模塊

搜索功能目前主要是針對IP地址或者業務線進行搜索,在搜索時可以根據條件進行搜索,並且會跳轉到條件所在的模塊。注意:當用戶在機房信息模塊,業務線模塊,變更記錄模塊進行搜索時,都會跳轉到資產信息模塊,其它模塊搜索IP時都是在對應的模塊內進行搜索。還有一點要注意,搜索框是接收兩次回車按鈕的,第一次用於選取用戶的條件,第二次執行搜索功能。

簡單演示:

11、主機存活檢測模塊

該模塊主要是由前端發起,前端通過ajax的方式每隔10秒向后端發起一次請求獲取當前頁面的主機狀態,效果如下:

 

本程序僅是自娛自樂,目前僅在虛擬環境下進行了簡單的測試,程序的健壯性和功能待完善。如果您有什么想法或者建議,歡迎留言!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM