產品經理調研需求 ----》三方開會討論(開發,產品,運維,測試) -----> 開發進行開發產品 ----> 測試流程 (黑盒和白盒測試) -----> 上線html
SVN |開發將代碼壓縮一下發給運維,運維拿到代碼以後,而後將代碼解壓縮,部署到服務器上,啓動服務linux
優勢:流程簡單web
缺點:服務器多的話,部署就很是的慢,影響上線的進度,而且是人爲的部署,容易出錯數據庫
簡單的來講:開發一個web系統,可以選擇服務器並上傳代碼,進行發佈django
所以這個web系統須要可以隨時獲取服務器的基本信息,因此須要一個監控系統json
監控系統:須要監控服務器的使用信息,好比cpu使用率,磁盤大小,內存使用率(使用大於90%報警等)windows
經過上面的例子,須要作一個基石項目,提供服務器的基礎信息(服務器的磁盤,cpu, 內存等),這個基石項目叫作CMDB Configure Manage DataBase 中文叫 配置管理數據庫,主要用來收集服務器的基礎信息api
CMDB是全部運維工具的數據基礎服務器
用戶管理,記錄測試,開發,運維人員的用戶表網絡
業務線管理,須要記錄業務的詳情
項目管理,指定此項目用屬於哪條業務線,以及項目詳情
應用管理,指定此應用的開發人員,屬於哪一個項目,和代碼地址,部署目錄,部署集羣,依賴的應用,軟件等信息
主機管理,包括雲主機,物理機,主機屬於哪一個集羣,運行着哪些軟件,主機管理員,鏈接哪些網絡設備,雲主機的資源池,存儲等相關信息
主機變動管理,主機的一些信息變動,例如管理員,所屬集羣等信息更改,鏈接的網絡變動等
網絡設備管理,主要記錄網絡設備的詳細信息,及網絡設備鏈接的上級設備
IP管理,IP屬於哪一個主機,哪一個網段, 是否被佔用等
1.問:如何獲取服務器的信息? 答:執行對應的linux命令 (ip:ifconfig)
2.問:如何使用Python代碼來執行linux的命令? 答:subprocess模塊來執行linux命令
3問:爲啥requests模塊的post方法發送的信息在request的post中沒有收到數據,而body中有 答:django根據你http協議的頭信息來判斷, 若是 content-type: application/form-url-encode的話,django會將body中的數據付給post,好比表單數據。若是 content-type: application/json的話,django不會將body中的數據付給post
Agent實現方式
Agent方式,能夠將服務器上面的Agent程序做定時任務,定時將資產信息提交到指定API錄入數據庫
服務器上部署僞代碼:
import subprocess,json # 調用getoutput方法得到ip信息(windows用ipconfig,mac用ifconfig) res = subprocess.getoutput('ipconfig') print(res) # t經過正則或其餘方法獲取res裏面的ip info = res[] print(info) # 經過requests模塊,調用post方法發送到某個url import requests requests.post('http://127.0.0.1:8000/api/', data=json.dumps(info))
API上的僞代碼:
from django.shortcuts import HttpResponse def asset(request): print(request.body) return HttpResponse('ok')
其本質上就是在各個服務器上執行subprocess.getoutput()
命令,而後將每臺機器上執行的結果,返回給主機API,而後主機API收到這些數據以後,放入到數據庫中,最終經過web界面展示給用戶
優勢:速度快,不須要額外的中控機 缺點:須要爲每臺服務器部署一個Agent程序(服務器多的狀況下,好比大於1000臺)
總結:整個架構方案,分紅3部分, 客戶端採集,API數據分析,數據展現
中控機經過Paramiko(py模塊)登陸到各個服務器上,而後執行命令的方式去獲取各個服務器上的信息
中控機的僞代碼:
import paramiko # 建立SSH對象 ssh = paramiko.SSHClient() # 容許鏈接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 鏈接服務器 ssh.connect(hostname='10.0.0.200', port=22, username='root', password='123456') # 執行命令 stdin, stdout, stderr = ssh.exec_command('df') # 獲取命令結果 result = stdout.read() # 關閉鏈接 ssh.close()
優勢:中控機拿到任意服務器用戶密碼主機信息就能登錄採集信息,不須要額外的部署腳本
缺點:速度慢(服務器較少的狀況下,好比少於1000臺)
能夠併發採集可是不能連接多臺服務器
若是在服務器較少的狀況下,可應用此方法
import paramiko
# 建立SSH對象
ssh = paramiko.SSHClient()
# 容許鏈接不在know_hosts文件中的主機
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 鏈接服務器
ssh.connect(hostname='192.xx.xx.xx', port=22, username='root', password='123')
# 執行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 獲取命令結果
result = stdout.read()
# 關閉鏈接
ssh.close()
saltstack方式
此方案本質上和第二種方案大體是差很少的流程,中控機上裝salt-master,發送命令給服務器執行(服務器裝slat-minion)。服務器將結果放入另外一個隊列中,中控機獲取將服務信息發送到API進而錄入數據庫。
優勢:快,開發成本低 缺點:依賴於第三方 工具