天天看點

python遠端監控_Python 實作遠端監控中心

設計

項目名稱:LinuxMM

監控平台:Linux

使用子產品:psutil、Paramiko

前端架構:Bootstrap

後端架構:DJango

監控方式

遠端讀取資訊的方式一般分兩種

推式:在每台主機上部署擷取資訊的腳本,然後采用某種方式發送給監控機。

優點:

缺點:

拉式:腳本隻部署在監控機上,主動從目标主機上讀取資訊。

優點:代碼隻存放在監控機即可

缺點:每次都要發送執行指令;另外,psutil 子產品還是需要安裝到目标伺服器的,可以下載下傳解壓安裝包後執行 python3 setup.py install 。

簡單起見,我們這裡使用拉式。

設計草圖

【首頁】

python遠端監控_Python 實作遠端監控中心

【詳情頁】

python遠端監控_Python 實作遠端監控中心

需求分析

設計資料庫,表結構

實作登入功能

登入成功後,可以添加主機

點選一條主機,可以檢視到主機目前 CPU、記憶體等資源占用情況

點選編輯功能,可以修改主機資訊,如 IP、标簽等

主要技術點

資料庫設計和 Web 開發相關知識,參考 Web 開發子產品

主機資訊擷取,可使用 psutil 子產品

CPU 使用率圖表可使用百度圖表

實作

代碼倉庫:https://gitee.com/luhuadong/Python_Learning/tree/master/13th_week/homework/linuxmm

資料表設計

建立資料庫

CREATE DATABASE IF NOT EXISTS linuxmm DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

選擇資料庫

use linuxmm

建立資料表

CREATE TABLE host(

id int unsigned NOT NULL auto_increment PRIMARY KEY COMMENT 'ID号',

tag varchar(32) NOT NULL COMMENT '标簽',

ip varchar(32) NOT NULL COMMENT 'IP位址',

cpu smallint unsigned DEFAULT NULL COMMENT 'CPU',

mem bigint unsigned DEFAULT NULL COMMENT '記憶體',

disk bigint unsigned DEFAULT NULL COMMENT '硬碟',

stat tinyint unsigned default 0 COMMENT '狀态',

cdate datetime COMMENT '登記時間'

);

檢視表結構

mysql> desc host;

+-------+----------------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+----------------------+------+-----+---------+----------------+

| id | int(10) unsigned | NO | PRI | NULL | auto_increment |

| tag | varchar(32) | NO | | NULL | |

| ip | varchar(32) | NO | | NULL | |

| cpu | smallint(5) unsigned | YES | | NULL | |

| mem | bigint(20) unsigned | YES | | NULL | |

| disk | bigint(20) unsigned | YES | | NULL | |

| stat | tinyint(3) unsigned | YES | | 0 | |

| cdate | datetime | YES | | NULL | |

+-------+----------------------+------+-----+---------+----------------+

8 rows in set (0.00 sec)

添加兩條資料

INSERT INTO host(tag,ip,cdate)

VALUES('test01','192.168.3.100',curtime()),

('test02','192.168.3.101',curtime());

檢視資料

mysql> select * from host;

+----+--------+---------------+------+------+------+------+---------------------+

| id | tag | ip | cpu | mem | disk | stat | cdate |

+----+--------+---------------+------+------+------+------+---------------------+

| 1 | test01 | 192.168.3.100 | NULL | NULL | NULL | 0 | 2018-10-23 17:50:54 |

| 2 | test02 | 192.168.3.101 | NULL | NULL | NULL | 0 | 2018-10-23 17:50:54 |

+----+--------+---------------+------+------+------+------+---------------------+

2 rows in set (0.00 sec)

Django 項目搭建

$ django-admin startproject linuxmm # 建立linuxmm項目

$ cd linuxmm

$ python3 manage.py startapp monitor # 監控中心應用

$ python3 manage.py startapp api # Web API應用

$ python3 manage.py runserver

Django 配置 settings.py

import os

ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'monitor',

]

TEMPLATES = [

{

'BACKEND': 'django.template.backends.django.DjangoTemplates',

'DIRS': [os.path.join(BASE_DIR,"templates")],

'APP_DIRS': True,

'OPTIONS': {

'context_processors': [

'django.template.context_processors.debug',

'django.template.context_processors.request',

'django.contrib.auth.context_processors.auth',

'django.contrib.messages.context_processors.messages',

],

},

},

]

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.mysql',

'NAME': 'linuxmm',

'USER': 'root',

'PASSWORD': 'lu1010',

'HOST': 'localhost',

'PORT': '3306',

}

}

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

STATIC_URL = '/static/'

STATICFILES_DIRS = [

os.path.join(BASE_DIR, 'static'),

]

在 linuxmm/__init__.py 檔案中添加

import pymysql

pymysql.install_as_MySQLdb()

Bootstrap 3.3.7 + jQuery 3.3.1

static/

├── css

│ ├── bootstrap.css

│ ├── bootstrap.css.map

│ ├── bootstrap.min.css

│ ├── bootstrap.min.css.map

│ ├── bootstrap-theme.css

│ ├── bootstrap-theme.css.map

│ ├── bootstrap-theme.min.css

│ └── bootstrap-theme.min.css.map

├── fonts

│ ├── glyphicons-halflings-regular.eot

│ ├── glyphicons-halflings-regular.svg

│ ├── glyphicons-halflings-regular.ttf

│ ├── glyphicons-halflings-regular.woff

│ └── glyphicons-halflings-regular.woff2

└── js

├── bootstrap.js

├── bootstrap.min.js

├── jquery-3.3.1.min.js

└── npm.js

Web API 傳回的資料

# json格式

{

"mem_total": 1040789504,

"mem_available": 432156672,

"mem_percent": 58.5,

"mem_used": 449925120,

"mem_free": 76451840

}

# 字典格式

{

'mem_total': 1040789504,

'mem_available': 432386048,

'mem_percent': 58.5,

'mem_used': 449667072,

'mem_free': 74817536

}

# 看起來是一樣的呀 >_<

登入功能

資料遷移

python3 manage.py migrate

CREATE TABLE user(

id int unsigned NOT NULL auto_increment PRIMARY KEY COMMENT 'ID号',

username varchar(32) NOT NULL COMMENT '使用者名',

password varchar(32) NOT NULL COMMENT '密碼',

email varchar(32) NOT NULL COMMENT '郵箱',

cdate datetime COMMENT '注冊時間'

);

添加

INSERT INTO user(username,password,email,cdate)

VALUE('admin','061c1da6af11de1d84374ce61d17ceaf','[email protected]',curtime());

資料表結構

mysql> desc host;

+-------+----------------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+----------------------+------+-----+---------+----------------+

| id | int(10) unsigned | NO | PRI | NULL | auto_increment |

| tag | varchar(32) | NO | | NULL | |

| ip | varchar(32) | NO | | NULL | |

| cpu | smallint(5) unsigned | YES | | NULL | |

| mem | bigint(20) unsigned | YES | | NULL | |

| disk | bigint(20) unsigned | YES | | NULL | |

| stat | tinyint(3) unsigned | YES | | 0 | |

| cdate | datetime | YES | | NULL | |

+-------+----------------------+------+-----+---------+----------------+

mysql> desc user;

+----------+------------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+----------+------------------+------+-----+---------+----------------+

| id | int(10) unsigned | NO | PRI | NULL | auto_increment |

| username | varchar(32) | NO | | NULL | |

| password | varchar(32) | NO | | NULL | |

| email | varchar(32) | NO | | NULL | |

| cdate | datetime | YES | | NULL | |

+----------+------------------+------+-----+---------+----------------+

導出資料庫

mysqldump -u root -p linuxmm > linuxmmdb.sql

啟動服務

$ python3 manage.py ruerver

服務啟動後,在浏覽器輸入 URL http://127.0.0.1:8000/monitor/

注意:運作 LinuxMM 項目前,請導入 linuxmm.sql 資料庫檔案!

運作截圖

【登入頁面】

python遠端監控_Python 實作遠端監控中心

【首頁】

python遠端監控_Python 實作遠端監控中心

【詳情頁】

python遠端監控_Python 實作遠端監控中心

【使用說明頁面】

python遠端監控_Python 實作遠端監控中心

【添加監控主機資訊頁面】

python遠端監控_Python 實作遠端監控中心

【修改監控主機資訊頁面】

python遠端監控_Python 實作遠端監控中心

使用說明

登入系統

在首頁點選 “添加主機” 可添加遠端監控主機

在遠端主機清單點選 “檢視” 可檢視監控詳情,更新時間預設為5秒

在遠端主機清單點選 “編輯” 可修改遠端主機資訊,如标簽、IP 位址

在遠端主機清單點選 “删除” 可删除遠端主機資訊,取消監控

注意:遠端主機需安裝 Python3 以及 psutil 子產品,并且需要将監控伺服器的 ssh 公鑰上傳到受監控的遠端主機!

例如:ssh-copy-id [email protected]

未完善功能

沒有使用者注冊功能;

通過 paramiko 連接配接遠端主機,每次查詢都建立一次 ssh 連接配接,效率低,開銷大;

隻有點選查詢進入詳情頁面,才會有遠端資料更新操作,此頁面更新資料暫時沒有回寫到資料庫;

設定了 ssh 連接配接逾時時間,網絡不佳情況下可能會出錯。