利用Python實現(xiàn)自動化監(jiān)控文件夾完成服務(wù)部署
大家好,我是安果!
最近在部署前端項目的時候,需要先將前端項目壓縮包通過堡壘機(jī)上傳到應(yīng)用服務(wù)器的 /tmp 目錄下,然后進(jìn)入應(yīng)用服務(wù)器中,使用 mv 命令將壓縮文件移動到 Nginx 項目設(shè)定目錄,最后使用 unzip 命令解壓文件,以此完成項目的部署
仔細(xì)分析,大部分操作都是重復(fù)性的動作,人工去完成這些操作會大大降低工作效率
本篇文章將介紹如何利用 Python 監(jiān)控文件夾,以此輔助完成服務(wù)的部署動作
1. 準(zhǔn)備
這里要介紹一個 Python 依賴庫「 watchdog 」
它可用于監(jiān)控某個文件目錄下的文件變化,包含:刪除、修改、新增等操,每一個操作都會回調(diào)一個事件函數(shù),我們可以在內(nèi)部編寫自定義的邏輯,以此滿足我們的需求
#?安裝依賴包 pip3?install?watchdog
2. 實戰(zhàn)一下
首先,我們需要創(chuàng)建一個監(jiān)聽器,用于監(jiān)聽文件夾目錄
from?watchdog.observers?import?Observer ... #?創(chuàng)建一個監(jiān)聽器,用來監(jiān)聽文件夾目錄 observer?=?Observer() ...
然后,創(chuàng)建 2 個事件處理對象
PS:該對象繼承于「 FileSystemEventHandler 」類
它們分別用于監(jiān)聽「 /tmp 」目錄、「 /home/project/frontend 」目錄,假設(shè)事件對象被命名為 obj1、obj2
obj1 負(fù)責(zé)監(jiān)聽 /tmp 目錄,重寫「 新建或修改 」事件方法,完成壓縮文件的移動操作
from?watchdog.events?import?* import?ntpath import?shutil import?zipfile def?get_filename(filepath): ????""" ????根據(jù)文件夾目錄,獲取文件名稱(待后綴) ????:param?filepath: ????:return: ????""" ????return?ntpath.basename(filepath) class?FileMoveHandler(FileSystemEventHandler): ????def?__init__(self): ????????FileSystemEventHandler.__init__(self) ????... ????#?文件新建 ????def?on_created(self,?event): ????????#?新建文件夾 ????????if?event.is_directory: ????????????#?print("directory?created:{0}".format(event.src_path)) ????????????pass ????????#?新建文件 ????????else: ????????????#?print("file?created:{0}".format(event.src_path)) ????????????filename?=?get_filename(event.src_path) ????????????#?如果屬于前端的4個項目壓縮包,開始文件夾的操作 ????????????if?filename?in?watch_tags: ????????????????self.start(filename) ???... ???def?on_modified(self,?event): ????????if?event.is_directory: ????????????#?print("directory?modified:{0}".format(event.src_path)) ????????????pass ????????else: ????????????#?print("file?modified:{0}".format(event.src_path)) ????????????filename?=?get_filename(event.src_path) ????????????if?filename?in?watch_tags: ????????????????self.start(filename) ????... ????????def?start(self,?filename): ????????""" ????????文件處理邏輯 ????????:param?filename: ????????:return: ????????""" ????????try: ????????????#?文件名不帶后綴 ????????????filename_without_suffix?=?filename.split(".")[0] ????????????#?源文件路徑(壓縮包文件) ????????????source_file_path?=?watch_folder?+?filename ????????????#?目標(biāo)文件路徑(壓縮包文件) ????????????target_file_path?=?target_folder?+?filename ????????????#?目標(biāo)項目文件夾(目標(biāo)項目) ????????????target_project_path?=?target_folder?+?filename_without_suffix ????????????#?1、復(fù)制文件到目標(biāo)文件夾 ????????????print(f"拷貝源目錄{source_file_path},目標(biāo)文件夾:{target_folder}") ????????????#?刪除目標(biāo)文件夾下的壓縮文件 ????????????if?os.path.exists(target_file_path): ????????????????os.remove(target_file_path) ????????????#?移動文件到目標(biāo)文件夾中 ????????????shutil.move(source_file_path,?target_folder) ????????????#?2、清空目標(biāo)文件夾中內(nèi)的所有文件夾(如果存在) ????????????#?如果不存在,新建一個文件夾 ????????????if?os.path.exists(target_project_path): ????????????????shutil.rmtree(target_project_path,?ignore_errors=True) ????????????print(f"項目{filename_without_suffix}移動成功!") ????????except?Exception?as?e: ????????????print("部署失敗,錯誤原因:",?str(e.args))
obj2 負(fù)責(zé)監(jiān)聽 /home/project/frontend 目錄,同樣重寫「 新建或修改 」事件方法,完成壓縮文件的解壓動作
... ????def?start(self,?filename): ????????#?文件名不帶后綴 ????????filename_without_suffix?=?filename.split(".")[0] ????????#?目標(biāo)文件路徑(壓縮包文件) ????????target_file_path?=?target_folder?+?filename ????????#?目標(biāo)項目文件夾(目標(biāo)項目) ????????target_project_path?=?target_folder?+?filename_without_suffix ????????r?=?zipfile.is_zipfile(target_file_path) ????????if?r: ????????????fz?=?zipfile.ZipFile(target_file_path,?'r') ????????????for?file?in?fz.namelist(): ????????????????fz.extract(file,?target_folder) ????????else: ????????????print('這不是一個正常的zip壓縮包!') ...
接著,通過監(jiān)聽器啟動上面兩個事件的監(jiān)聽任務(wù)
import?time ... if?__name__?==?"__main__": ????#?待監(jiān)聽的文件夾目錄 ????watch_folder?=?"/tmp/" ????#?項目目標(biāo)文件夾目錄 ????target_folder?=?"/home/project/frontend/" ????#?監(jiān)聽文件夾名稱,即:項目壓縮包名稱 ????watch_tags?=?['proj1.zip',?'proj2.zip',?'proj3.zip',?'proj4.zip'] ????#?創(chuàng)建一個監(jiān)聽器,用來監(jiān)聽文件夾目錄 ????observer?=?Observer() ????#?創(chuàng)建兩個事件處理對象 ????move_handler?=?FileMoveHandler() ????unzip_handler?=?FileUnzipHandler() ????#?啟動監(jiān)控任務(wù) ????#?參數(shù)分別是:觀察者、監(jiān)聽目錄、是否監(jiān)聽子目錄 ????observer.schedule(move_handler,?watch_folder,?True) ????observer.schedule(unzip_handler,?target_folder,?True) ????observer.start() ????try: ????????while?True: ????????????time.sleep(1) ????except?KeyboardInterrupt: ????????observer.stop() ????observer.join() ...
最后,我們在服務(wù)器上通過「 nohup 」命令,讓文件監(jiān)聽程序在后臺運(yùn)行即可
#?在后臺運(yùn)行?? #?項目文件:watch_folder.py #?日志文件:watch_folder.log nohup?python3?-u?watch_folder.py?>?watch_folder.log?2>&1?& #?查看日志: cat?watch_folder.log
3. 總結(jié)
通過上面的操作,每次我通過堡壘機(jī)將前端 zip 壓縮項目文件上傳到應(yīng)用服務(wù)器的 /tmp 目錄下,程序會自動進(jìn)行后面的操作,自動完成應(yīng)用部署
到此這篇關(guān)于利用Python實現(xiàn)自動化監(jiān)控文件夾完成服務(wù)部署的文章就介紹到這了,更多相關(guān)Python監(jiān)控文件夾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用__new__()方法為對象分配內(nèi)存及返回對象的引用示例
這篇文章主要介紹了Python使用__new__()方法為對象分配內(nèi)存及返回對象的引用,結(jié)合實例形式分析了Python對象初始化及內(nèi)存操作相關(guān)使用技巧,需要的朋友可以參考下2019-09-09Django中ORM找出內(nèi)容不為空的數(shù)據(jù)實例
這篇文章主要介紹了Django中ORM找出內(nèi)容不為空的數(shù)據(jù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05使用Django搭建web服務(wù)器的例子(最最正確的方式)
今天小編就為大家分享一篇使用Django搭建web服務(wù)器的例子(最最正確的方式),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08python連接mysql數(shù)據(jù)庫并讀取數(shù)據(jù)的實現(xiàn)
這篇文章主要介紹了python連接mysql數(shù)據(jù)庫并讀取數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09