背景
現在幾乎所有東西都嚮往著自動化,在運維界更是如此,運維人員都嚮往自動化代替人工操作、解決人工操作大量重複性工作的問題、故障主動恢復:及時發現;流程;解決。運維規範化:角色定義和責任劃分、流程化等。但這些種種的目的,都離不開非常細小的技術支援,下面我們就來討論如何搭建乙個自動化運維平台,本文先講一講運維平台較重要的技術之一的webssh。
一、技術選型&實現思路
1.後端邏輯,選用:django框架
2.模擬web終端,選用:xterm
3.實現遠端主機連線,建立ssh通道,python庫:paramiko
4.實現web遠端連線必須需要實時保持前後端通訊,使用技術:websocket
5.技術流程圖
二、實現
2.1.建立webssh頁面
xterm.js是乙個開源模擬終端,利用它我們可以建立乙個比較正規好看的終端介面。
其中 ssh.js:
新建乙個xtrem例項,並且發起websocket連線,建立websocket通道。建立起通道前端就能與後端進行通訊,保證資料傳輸。
var window_width = $(window).width();var window_height = $(window).height();
var term = new terminal(
);$(function () ");
// 開啟webssh頁面就開啟web終端,並且開啟websocket通道
sock.addeventlistener("open",function () );
//獲取從ssh通道獲取的outdata
sock.addeventlistener("message",function (recv) );
//輸入shelldata併發送到後台
term.on("data",function (data) );
window.sock=sock;
});
2.2後台邏輯後台是前端與伺服器之間的橋梁,可以理解成中轉站。具體實現思路在**注釋中有講解。
from dwebsocket.decorators import accept_websocket2.3效果 結束@accept_websocket #用於websocket連線的修飾器
def webssh(request):
global ip, port, user, passwd #定義全域性變數連線資訊.
if request.session.get('login')==none: #判斷是否登陸系統,如果沒有就去登陸!
return redirect('/sys/login/')
if not request.is_websocket():#判斷websocket連線,如果是普通的http連線就獲取傳送進來的登陸資訊。
ip = request.post.get('conip')
port = request.post.get('conport')
user = request.post.get('conuser')
passwd = request.post.get('conpass')
print(ip,str(port),user,passwd)
return render(request, 'html/webssh.html', locals())
else: #如果是websocket連線就建立ssh連線,使用paramiko模組建立
client = paramiko.sshclient() #建立連線物件
client.set_missing_host_key_policy(paramiko.autoaddpolicy) #設定自動新增主機名及主機金鑰到本地hostkeys物件,不依賴load_system_host_key的配置。即新建立ssh連線時不需要再輸入yes或no進行確認
try: #用異常丟擲判定主機是否成功連線ssh
client.connect(hostname=ip,port=port,username=user,password=passwd) #connetc為連線函式
print(f'主機連線成功!')
mess = f'主機連線成功!'
except:
print(f'主機連線失敗,請確認輸入資訊!')
mess = f'主機連線失敗!'
sshsession = client.get_transport().open_session() #成功連線後獲取ssh通道
sshsession.get_pty() #獲取乙個終端
sshsession.invoke_shell() #啟用終端
for i in range(2): #啟用終端後會有資訊流,一般都是lastlogin與bath目錄,並獲取其資料
messa = sshsession.recv(1024)
request.websocket.send(messa)
print(request.websocket)
def srecv(): #從ssh通道獲取輸出data,併發送到前端
while true:
sshmess = sshsession.recv(2048)
if not len(sshmess):
print('退出監聽傳送迴圈')
return
request.websocket.send(sshmess)
print('ssh回覆的資訊:' + sshmess.decode('utf-8'))
print(len(sshmess))
for shell in request.websocket: #獲取前端的shelldata並且傳送到伺服器執行
deshell = shell.decode('utf-8')
print('deshell:'+deshell)
# stdin,stdout,stderr = client.exec_command(deshell)
# request.websocket.send(stdout.read())
# request.websocket.send(stderr.read())
sshsession.send(deshell)
# while true:
# sshmess = sshsession.recv(2048)
# request.websocket.send(sshmess)
# print('ssh回覆的資訊:'+sshmess.decode('utf-8'))
# print(len(sshmess))
sshrecvthre = thread(target=srecv, args=()).start() #啟用執行緒監聽ssh通道獲取輸出data,併發送到前端
webssh的應用十分的廣泛,並且在網路的複雜環境中很難確保它的通訊安全,但是針對自己網路所自己編寫的webssh往往安全性會有提公升,以上只是對功能實現上進行了說明,若要對安全上進行防範,還需要對以上**進行改造。
乙個web遠端連線與主機的正刪改查只是乙個運維系統的基礎功能,下次我們來說一下webssh終端如何實現錄影回放~
運維利器screen
1 2 3 4 5 6 7 8 9 預設是沒有screen,需要用yum安裝 screen s name 建立乙個新的screenscreen ls列出有哪些screen在執行 screen rscreenpid或者pid 進入之前埠的screen會話視窗 screen x 進入之前沒斷開的scre...
運維監控利器nagios
nagios的概念和功能 nagios是一款開源的免費網路監視工具,其功能強大,靈活性強。能有效監控windows linux和unix的主機狀態,交換機 路由器等網路設定,印表機等,在系統或服務狀態異常時發出郵件或簡訊報警第一時間通知 運維人員,在狀態恢復後發出正常的郵件或簡訊通知。nagios可...
自動化運維利器(Ansible)二
root lwq.com ssh keygen t rsa f ssh id rsa n 非互動式建立金鑰將本地的公鑰傳輸到被管理節點 root lwq.com ssh copy id root 192.66.66.102 root lwq.com ssh copy id root 192.66.6...