html
cmdb包含的功能:python
1、用戶管理,記錄測試,開發,運維人員的用戶表 2、業務線管理,須要記錄業務的詳情 3、項目管理,指定此項目用屬於哪條業務線,以及項目詳情 4、應用管理,指定此應用的開發人員,屬於哪一個項目,和代碼地址,部署目錄,部署集羣,依賴的應用,軟件等信息 5、主機管理,包括雲主機,物理機,主機屬於哪一個集羣,運行着哪些軟件,主機管理員,鏈接哪些網絡設備,雲主機的資源池,存儲等相關信息 6、主機變動管理,主機的一些信息變動,例如管理員,所屬集羣等信息更改,鏈接的網絡變動等 7、網絡設備管理,主要記錄網絡設備的詳細信息,及網絡設備鏈接的上級設備 8、IP管理,IP屬於哪一個主機,哪一個網段, 是否被佔用等
linux
二、爲何須要 自動化運維web
1. 項目上線: 流程: 產品經理調研(畫出原型圖) ---> 定需求 ---> 三方會談(產品經理, 研發,老大們) ---> 定日期--->測試項目---> 最終上線---> 應用運維 目前: 是把代碼打包給運維, 運維解壓上線 問題: 隨着機器數量的線性增長,運維的工做量也是線性增長, 重複並且是無心義的勞動 解決: 1. 寫一個shell腳本, 進行部署 2. 搞一個自動化代碼上線系統 必要條件: 服務器的各類信息 (主機名, cpu, 硬盤大小等) 2. 監控系統: 檢測服務器的各信息,(硬盤是否滿, cpu的使用率, 內存使用率, 網站服務運行是否正常) 問題: 以前寫簡單的腳本,檢測服務器的信息,比較麻煩 解決: 想將服務器的各類信息,以圖表的形式展現在web界面上(可視化) 必要條件: 服務器的各類信息(主機名, cpu, 硬盤大小等) 3. 自動裝機系統: 問題: 人工去裝機,一臺一臺的裝 解決: 搞一個裝機系統 , cobbler 軟件 必要條件: 服務器的各類信息(主機名, cpu等) 4. Excel表格審計管理資產
cmdb的實現核心shell
核心目的:收集服務器的信息(cpu,內存,網卡,硬盤等)數據庫
實現方式概述:api
1.linux命令獲取cpu, 內存,網卡ruby
2.python執行linux的命令 subprocess模塊 getoutput函數 服務器
下面爲4中具體的實現方案:網絡
一、agent實現:agent方式,能夠將服務器上面的Agent程序做定時任務,定時將資產信息提交到指定API錄入數據庫
實現原理:其本質就是在各個服務器上執行subprocess.getoutput()
命令,而後將每臺機器上執行的結果,返回給主機API,而後主機API收到這些數據以後進行清洗整理,放入到數據庫中,最終經過web界面展示給用戶。
優勢:速度快 缺點:須要爲每一臺服務器部署一個agent程序 使用場景:服務器比較多的時候
二、ssh實現(基於paramiko模塊)
中控機經過Paramiko(py模塊)登陸到各個服務器上,而後以執行命令的方式去獲取各個服務器上的信息。
優勢:無agent 缺點:速度慢 使用場景: 服務器比較少的時候
實現代碼實例:
import paramiko # 建立SSH對象 ssh = paramiko.SSHClient() # 容許鏈接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 鏈接服務器 ssh.connect(hostname='c1.salt.com', port=22, username='root', password='123') # 執行命令 stdin, stdout, stderr = ssh.exec_command('df') # 獲取命令結果 result = stdout.read() # 關閉鏈接 ssh.close()
三、salt-stack方式
它本質上和第二種方案大體是差很少的流程,中控機發送命令給服務器執行。服務器將結果放入另外一個隊列中,中控機獲取將服務信息發送到API進而錄入數據庫。
優勢:快,開發成本低 缺點:依賴於第三方工具 使用場景: 公司已經使用salt-stack軟件
saltstack的安裝和配置
一、安裝和配置
master主機端 """ 1. 安裝salt-master yum install salt-master 2. 修改配置文件:/etc/salt/master interface: 10.0.0.51 # 表示Master的IP 即本機ip 3. 啓動 service salt-master start """ slave端: """ 1. 安裝salt-minion yum install salt-minion 2. 修改配置文件 /etc/salt/minion master: 10.0.0.51 # master的ip地址 或 master: - 10.211.55.4 - 10.211.55.5 random_master: True id: c2.salt.com # 客戶端在salt-master中顯示的惟一ID 3. 啓動 service salt-minion start
二、受權
salt-key -L # 查看已受權和未受權的slave salt-key -a salve_id # 接受指定id的salve salt-key -r salve_id # 拒絕指定id的salve salt-key -d salve_id # 刪除指定id的salve
三、執行命令
在master服務器上對salve進行遠程操做
# salt "主機名" cmd.run "命令" salt 'c2.salt.com' cmd.run 'ifconfig' 基於api的方式: import salt.client local = salt.client.LocalClient() result = local.cmd('c2.salt.com', 'cmd.run', ['ifconfig'])
參考連接:http://www.cnblogs.com/tim1blog/p/9987313.html
四、puppet(ruby語言開發)
每隔30分鐘,經過RPC消息隊列將執行的結果返回給用戶
ASE介紹
from Crypto.Cipher import AES def encrypt(message): key = b'dfdsdfsasdfdsdfs' cipher = AES.new(key, AES.MODE_CBC, key) ba_data = bytearray(message,encoding='utf-8') v1 = len(ba_data) v2 = v1 % 16 if v2 == 0: v3 = 16 else: v3 = 16 - v2 for i in range(v3): ba_data.append(v3) final_data = ba_data.decode('utf-8') msg = cipher.encrypt(final_data) # 要加密的字符串,必須是16個字節或16個字節的倍數 return msg # ############################## 解密 ############################## def decrypt(msg): from Crypto.Cipher import AES key = b'dfdsdfsasdfdsdfs' cipher = AES.new(key, AES.MODE_CBC, key) result = cipher.decrypt(msg) # result = b'\xe8\xa6\x81\xe5\x8a\xa0\xe5\xaf\x86\xe5\x8a\xa0\xe5\xaf\x86\xe5\x8a\xa0sdfsd\t\t\t\t\t\t\t\t\t' data = result[0:-result[-1]] return str(data,encoding='utf-8') msg = encrypt('你好好愛好愛好sss') res = decrypt(msg) print(res)
字符格式化函數:
String.prototype.format = function(args){ return this.replace(/\{(\w+)\}/g, function(s, i){ return args[i]; }); };