<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] MDB最主要的管理對象是各種類型大量的服務器,其數據信息自然不可能通過手工收集,必須以客戶端的方式,定時自動收集并報告給遠程的服務器。 下面,讓我們暫時忘掉Django,進入Python運維的世界...... <br /> ## **一、客戶端程序組織** 編寫客戶端,不能一個py腳本包打天下,要有組織有目的,通常我們會采取下面的結構: ![](https://img.kancloud.cn/54/d7/54d7ca4c37a3b93378540707edde80b9_291x557.png) <br /> 在Pycharm中,項目根目錄下,創建一個Client目錄,作為客戶端的根目錄。 在Client下,創建下面的包。注意是包,不是文件夾: * bin:客戶端啟動腳本的所在目錄 * conf:配置文件目錄 * core:核心代碼目錄 * log:日志文件目錄 * plugins:插件或工具目錄 <br /> ## **二、開發數據收集客戶端** ### **1.程序入口腳本** 在bin目錄中新建`main.py`文件,寫入下面的代碼: ``` # -*- coding:utf-8 -*- """ 完全可以把客戶端信息收集腳本做成windows和linux兩個不同的版本。 """ import os import sys BASE_DIR = os.path.dirname(os.getcwd()) # 設置工作目錄,使得包和模塊能夠正常導入 sys.path.append(BASE_DIR) from core import handler if __name__ == '__main__': handler.ArgvHandler(sys.argv) ``` **在pycharm中可能出現導入失敗的紅色波浪線警告信息,其實是可以導入的,請忽略它。** * 通過os和sys模塊的配合,將當前客戶端所在目錄設置為工作目錄,如果不這么做,會無法導入其它模塊; * handler模塊是核心代碼模塊,在core目錄中,我們一會來實現它。 * 以后調用客戶端就只需要執行`python main.py 參數`就可以了 <br /> ### **2.主功能模塊** 在core下,創建`handler.py`文件,寫入下面的代碼: ``` # -*- coding:utf-8 -*- import json import time import urllib.parse import urllib.request from core import info_collection from conf import settings class ArgvHandler(object): def __init__(self, args): self.args = args self.parse_args() def parse_args(self): """ 分析參數,如果有參數指定的方法,則執行該功能,如果沒有,打印幫助說明。 :return: """ if len(self.args) > 1 and hasattr(self, self.args[1]): func = getattr(self, self.args[1]) func() else: self.help_msg() @staticmethod def help_msg(): """ 幫助說明 :return: """ msg = ''' 參數名 功能 collect_data 測試收集硬件信息的功能 report_data 收集硬件信息并匯報 ''' print(msg) @staticmethod def collect_data(): """收集硬件信息,用于測試!""" info = info_collection.InfoCollection() asset_data = info.collect() print(asset_data) @staticmethod def report_data(): """ 收集硬件信息,然后發送到服務器。 :return: """ # 收集信息 info = info_collection.InfoCollection() asset_data = info.collect() # 將數據打包到一個字典內,并轉換為json格式 data = {"asset_data": json.dumps(asset_data)} # 根據settings中的配置,構造url url = "http://%s:%s%s" % (settings.Params['server'], settings.Params['port'], settings.Params['url']) print('正在將數據發送至: [%s] ......' % url) try: # 使用Python內置的urllib.request庫,發送post請求。 # 需要先將數據進行封裝,并轉換成bytes類型 data_encode = urllib.parse.urlencode(data).encode() response = urllib.request.urlopen(url=url, data=data_encode, timeout=settings.Params['request_timeout']) print("\033[31;1m發送完畢!\033[0m ") message = response.read().decode() print("返回結果:%s" % message) except Exception as e: message = '發送失敗' + " 錯誤原因: {}".format(e) print("\033[31;1m發送失敗,錯誤原因: %s\033[0m" % e) # 記錄發送日志 with open(settings.PATH, 'ab') as f: # 以byte的方式寫入,防止出現編碼錯誤 log = '發送時間:%s \t 服務器地址:%s \t 返回結果:%s \n' % (time.strftime('%Y-%m-%d %H:%M:%S'), url, message) f.write(log.encode()) print("日志記錄成功!") ``` 說明: * handler模塊中只有一個ArgvHandler類; * 在main模塊中也是實例化了一個ArgvHandler類的對象,并將調用參數傳遞進去; * 首先,初始化方法會保存調用參數,然后執行parse\_args()方法分析參數; * 如果ArgvHandler類有參數指定的功能,則執行該功能,如果沒有,打印幫助說明。 * 目前ArgvHandler類只有兩個核心方法:`collect_data`和`report_data`; * `collect_data`收集數據并打印到屏幕,用于測試;`report_data`方法才會將實際的數據發往服務器。 * 數據的收集由`info_collection.InfoCollection`類負責,一會再看; * `report_data`方法會將收集到的數據打包到一個字典內,并轉換為json格式; * 然后通過settings中的配置,構造發送目的地url; * 通過Python內置的urllib.parse對數據進行封裝; * 通過urllib.request將數據發送到目的url; * 接收服務器返回的信息; * 將成功或者失敗的信息寫入日志文件中。 以后,我們要測試數據收集,執行`python main.py collect_data`;要實際往服務器發送收集到的數據,則執行`python main.py report_data`。 <br /> ### **3.配置文件** 要將所有可能修改的數據、常量、配置等都盡量以配置文件的形式組織起來,盡量不要在代碼中寫死任何數據。 在conf中,新建`settings.py`文件,寫入下面的代碼: ~~~ # -*- coding:utf-8 -*- import os # 遠端接收數據的服務器 Params = { "server": "192.168.0.100", "port": 8000, 'url': '/assets/report/', 'request_timeout': 30, } # 日志文件配置 PATH = os.path.join(os.path.dirname(os.getcwd()), 'log', 'cmdb.log') # 更多配置,請都集中在此文件中 ~~~ 這里,配置了服務器地址、端口、發送的url、請求的超時時間,以及日志文件路徑。請根據你的實際情況進行修改。 <br /> ### **4.信息收集模塊** 在core中新建`info_collection.py`文件,寫入下面的代碼: ~~~ # -*- coding:utf-8 -*- import sys import platform class InfoCollection(object): def collect(self): # 收集平臺信息 # 首先判斷當前平臺,根據平臺的不同,執行不同的方法 try: func = getattr(self, platform.system().lower()) info_data = func() formatted_data = self.build_report_data(info_data) return formatted_data except AttributeError: sys.exit("不支持當前操作系統: [%s]! " % platform.system()) @staticmethod def linux(): from plugins.collect_linux_info import collect return collect() @staticmethod def windows(): from plugins.collect_windows_info import Win32Info return Win32Info().collect() @staticmethod def build_report_data(data): # 留下一個接口,方便以后增加功能或者過濾數據 pass return data ~~~ 該模塊的作用很簡單: * 首先通過Python內置的platform模塊獲取執行main腳本的操作系統類別,通常是windows和Linux,暫時不支持其它操作系統; * 根據操作系統的不同,反射獲取相應的信息收集方法,并執行; * 如果是客戶端不支持的操作系統,比如蘋果系統,則提示并退出客戶端。 因為windows和Linux兩大操作系統的巨大平臺差異,我們必須寫兩個收集信息的腳本。 到目前為止,我們的客戶端結構如下圖所示: ![](https://img.kancloud.cn/21/f0/21f06c1becf934306cb9a8b23aee852f_295x739.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看