利用Python編寫linux自動備份腳本

題目:

  週末的時候幫朋友寫了一個備份需求的腳本,現在整理一下,分享出來使用Python語言的Fabric模塊,這裏就不掃盲了,運維必用的Python模塊;

  大概要求:

    公司需求,每天凌晨2點備份數據(數據量不大,每天全備),拷貝至備份服務器,通過md5對比備份文件(本機備份文件和備份服務器文件對比),並將備份情況通知運維組同學。


備份思路:

  (1.每天凌晨2點在服務器本地使用tar打包備份文件;

  (2.備份成功以後,推送至備份服務器;

  (3.校驗本地備份文件和備份服務器文件的完整性和一致性;

  (4.校驗文件是否一致,並將備份狀態(成功or失敗)寫入logs文件;

  (5.通過查看logs狀態檢查備份是否成功,並將內容以郵件形式發送管理員;

  (6.日誌信息以標籤的方式寫入文本,通過查看文本的信息。確認是否備份成功;

  (7.多臺服務器備份,所以備份目錄格式爲:/backup/ip/


備份流程圖:

wKiom1W16cjBdiAdAAGdW2fvtVs937.jpg

備份腳本 [server端]

# -*- coding: utf-8 -*
#!/usr/bin/env python
from fabric.api import *
from fabric.colors import *
from fabric.context_managers import *
from fabric.contrib.console import confirm
import time
import datetime

#backup server
env.user = 'root'
env.hosts= ['192.168.64.129']
env.password= '123456'

env.deploy_version = time.strftime("%Y%m%d")

#local backup
env.project_dev_source = ['/usr/local/nginx/','/usr/local/php/']
env.project_tar_source = '/backup/'
#backup server
env.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_once
def 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!")

@task
def 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_once
def 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!")

@task
def back():
    tar_backup()
    put_package()
    md5_check()

Email腳本 [backup server端]

# -*- coding: utf-8 -*
#!/usr/bin/env python

import commands
import smtplib
import string
import 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 False
if __name__ == '__main__':
    email()

效果測試圖,待補充 ...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章