標籤:python 自動備份指令碼
題目:
周末的時候幫朋友寫了一個備份需求的指令碼,現在整理一下,分享出來使用Python語言的Fabric模組,這裡就不掃盲了,營運必用的Python模組;
大概要求:
公司需求,每天淩晨2點備份資料(資料量不大,每天全備),拷貝至備份伺服器,通過md5對比備份檔案(本機備份檔案和備份伺服器檔案對比),並將備份情況通知營運組同學。
備份思路:
(1.每天淩晨2點在伺服器本地使用tar打包備份檔案;
(2.備份成功以後,推送至備份伺服器;
(3.校正本地備份檔案和備份伺服器檔案的完整性和一致性;
(4.校正檔案是否一致,並將備份狀態(成功or失敗)寫入logs檔案;
(5.通過查看logs狀態檢查備份是否成功,並將內容以郵件形式發送管理員;
(6.日誌資訊以標籤的方式寫入文本,通過查看文本的資訊。確認是否備份成功;
(7.多台伺服器備份,所以備份目錄格式為:/backup/ip/
備份流程圖:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/70/50/wKiom1W16cjBdiAdAAGdW2fvtVs937.jpg" title="server備份流程圖.jpg" alt="wKiom1W16cjBdiAdAAGdW2fvtVs937.jpg" />
備份指令碼 [server端]
# -*- coding: utf-8 -*#!/usr/bin/env pythonfrom fabric.api import *from fabric.colors import *from fabric.context_managers import *from fabric.contrib.console import confirmimport timeimport datetime#backup serverenv.user = ‘root‘env.hosts= [‘192.168.64.129‘]env.password= ‘123456‘env.deploy_version = time.strftime("%Y%m%d")#local backupenv.project_dev_source = [‘/usr/local/nginx/‘,‘/usr/local/php/‘]env.project_tar_source = ‘/backup/‘#backup serverenv.deploy_project_dir = ‘/backup/‘env.deploy_address_ip = ‘192.168.64.128‘ env.deploy_address_dir = env.deploy_project_dir + env.deploy_address_ip@task@runs_oncedef tar_backup(): #在本地打包備份檔案 print yellow("Creating backup package...") local("mkdir -p %s" % env.project_tar_source) for source in env.project_dev_source: with lcd(source): local("tar -czf %s-%s.tar.gz . " % ((env.project_tar_source + env.deploy_version),source.split(‘/‘)[-2])) local("find /backup -name ‘*.tar.gz‘ -mtime +7|xargs rm -f") print green("Creating backup package success!")@taskdef put_package(): #推送至備份伺服器 print yellow("Start put package...") run("mkdir -p %s "% env.deploy_address_dir) with settings(warn_only=True): for source in env.project_dev_source: result = put(env.project_tar_source+env.deploy_version+"-"+source.split(‘/‘)[-2]+".tar.gz",env.deploy_address_dir) print green("Put & backup package success!")@task@runs_oncedef md5_check(): #通過md5對比備份伺服器和本地備份檔案的完整性 print yellow("check backup package...") with lcd(env.project_tar_source): lmd5 = local("md5sum %s%s*.gz|awk ‘{print $1}‘"% (env.project_tar_source,env.deploy_version),capture=True).split() rmd5 = run("md5sum %s/%s*.gz|awk ‘{print $1}‘"% (env.deploy_address_dir,env.deploy_version)).split() #將備份狀態資訊寫入備份伺服器的日誌文本 if lmd5==rmd5: status = ‘備份時間 : %-25s備份IP : %-30s備份狀態 : 備份成功!‘% (datetime.date.today(),env.deploy_address_ip) run("echo ‘%s‘ >> %slogs/backup_%s.log"% (status,env.deploy_project_dir,env.deploy_version)) print green("backup package md5 contrast success!") else: status = ‘備份時間 : %-25s備份IP : %-30s備份狀態 : 備份失敗!‘% (datetime.date.today(),env.deploy_address_ip) run("echo ‘%s‘ >> %slogs/backup_%s.log"% (status,env.deploy_project_dir,env.deploy_version)) print green("backup package md5 contrast failure!")@taskdef back(): tar_backup() put_package() md5_check()
Email指令碼 [backup server端]
# -*- coding: utf-8 -*#!/usr/bin/env pythonimport commandsimport smtplibimport stringimport time#查看備份伺服器的日誌文本資訊info = commands.getoutput(‘cat /backup/logs/backup_%s.log‘% time.strftime("%Y%m%d"))def email(): HOST = "smtp.qq.com" SUBJECT = "" #收件者 TO = "[email protected]" #寄件者 FROM = "[email protected]" #郵件內容 text = "%s" % info BODY = string.join(( "From: %s" % FROM, "To: %s" % TO, "Subject: %s" % SUBJECT , "", text ), "\r\n") #防止一次發送失敗,迴圈發送5次 for i in range(5): try: server = smtplib.SMTP() server.connect(HOST,"25") server.starttls() server.login("[email protected]","password") server.sendmail(FROM, [TO], BODY) server.quit() return True except Exception,error: print " \033[31m%s \033[0m"% error continue return Falseif __name__ == ‘__main__‘: email()
效果測試圖,待補充 ...
本文出自 “ˉ、穎濤┃﹎” 部落格,請務必保留此出處http://hypocritical.blog.51cto.com/3388028/1679006
利用Python編寫linux自動備份指令碼