利用Python編寫linux自動備份指令碼

來源:互聯網
上載者:User

標籤: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自動備份指令碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.