自動化運維基礎

自動化運維

1.企業中,項目的發佈流程

產品經理調研需求 ----》三方開會討論(開發,產品,運維,測試) -----> 開發進行開發產品 ----> 測試流程 (黑盒和白盒測試) -----> 上線html

2.傳統的上線流程:

SVN |開發將代碼壓縮一下發給運維,運維拿到代碼以後,而後將代碼解壓縮,部署到服務器上,啓動服務linux

優勢:流程簡單web

缺點:服務器多的話,部署就很是的慢,影響上線的進度,而且是人爲的部署,容易出錯數據庫

3.自動化運維的流程:

 

簡單的來講:開發一個web系統,可以選擇服務器並上傳代碼,進行發佈django

所以這個web系統須要可以隨時獲取服務器的基本信息,因此須要一個監控系統json

監控系統:須要監控服務器的使用信息,好比cpu使用率,磁盤大小,內存使用率(使用大於90%報警等)windows

4.CMDB概念

經過上面的例子,須要作一個基石項目,提供服務器的基礎信息(服務器的磁盤,cpu, 內存等),這個基石項目叫作CMDB Configure Manage DataBase 中文叫 配置管理數據庫,主要用來收集服務器的基礎信息api

CMDB是全部運維工具的數據基礎服務器

CMDB包含的功能
  1. 用戶管理,記錄測試,開發,運維人員的用戶表網絡

  2. 業務線管理,須要記錄業務的詳情

  3. 項目管理,指定此項目用屬於哪條業務線,以及項目詳情

  4. 應用管理,指定此應用的開發人員,屬於哪一個項目,和代碼地址,部署目錄,部署集羣,依賴的應用,軟件等信息

  5. 主機管理,包括雲主機,物理機,主機屬於哪一個集羣,運行着哪些軟件,主機管理員,鏈接哪些網絡設備,雲主機的資源池,存儲等相關信息

  6. 主機變動管理,主機的一些信息變動,例如管理員,所屬集羣等信息更改,鏈接的網絡變動等

  7. 網絡設備管理,主要記錄網絡設備的詳細信息,及網絡設備鏈接的上級設備

  8. IP管理,IP屬於哪一個主機,哪一個網段, 是否被佔用等

 

 

5.架構圖方案

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

CMDB實現的四種方式
  • 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數據分析,數據展現


  • ssh實現方式 (基於Paramiko模塊)

中控機經過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進而錄入數據庫。

優勢:快,開發成本低 缺點:依賴於第三方 工具

相關文章
相關標籤/搜索