cmdb項目實現方案

CMDB項目: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表格審計管理資產 
View Code

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()
View Code

三、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
View Code

二、受權

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
View Code

三、執行命令

在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'])
View Code

參考連接: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)
View Code

字符格式化函數:

String.prototype.format = function(args){
        return this.replace(/\{(\w+)\}/g, function(s, i){
            return args[i];
        });
    };
View Code
相關文章
相關標籤/搜索