利用Python编写linux自动备份脚本--转载未经测试

题目:

  周末的时候帮朋友写了一个备份需求的脚本,现在整理一下,分享出来使用Python语言的Fabric模块,这里就不扫盲了,运维必用的Python模块;

  大概要求:

    公司需求,每天凌晨2点备份数据(数据量不大,每天全备),拷贝至备份服务器,通过md5对比备份文件(本机备份文件和备份服务器文件对比),并将备份情况通知运维组同学。

 

备份思路:

  (1.每天凌晨2点在服务器本地使用tar打包备份文件;

  (2.备份成功以后,推送至备份服务器;

  (3.校验本地备份文件和备份服务器文件的完整性和一致性;

  (4.校验文件是否一致,并将备份状态(成功or失败)写入logs文件;

  (5.通过查看logs状态检查备份是否成功,并将内容以邮件形式发送管理员;

  (6.日志信息以标签的方式写入文本,通过查看文本的信息。确认是否备份成功;

  (7.多台服务器备份,所以备份目录格式为:/backup/ip/

 

备份流程图:

wKiom1W16cjBdiAdAAGdW2fvtVs937.jpg

备份脚本 [server端]

 1 # -*- coding: utf-8 -*
 2 #!/usr/bin/env python
 3 from fabric.api import *
 4 from fabric.colors import *
 5 from fabric.context_managers import *
 6 from fabric.contrib.console import confirm
 7 import time
 8 import datetime
 9  
10 #backup server
11 env.user = 'root'
12 env.hosts= ['192.168.64.129']
13 env.password= '123456'
14  
15 env.deploy_version = time.strftime("%Y%m%d")
16  
17 #local backup
18 env.project_dev_source = ['/usr/local/nginx/','/usr/local/php/']
19 env.project_tar_source = '/backup/'
20 #backup server
21 env.deploy_project_dir = '/backup/'
22 env.deploy_address_ip  = '192.168.64.128'  
23 env.deploy_address_dir = env.deploy_project_dir + env.deploy_address_ip
24  
25 @task
26 @runs_once
27 def tar_backup():
28         #在本地打包备份文件
29     print yellow("Creating backup package...")
30     local("mkdir -p %s" % env.project_tar_source)
31     for source in env.project_dev_source:
32         with lcd(source):
33             local("tar -czf %s-%s.tar.gz . " % ((env.project_tar_source + env.deploy_version),source.split('/')[-2]))
34     local("find /backup -name '*.tar.gz' -mtime +7|xargs rm -f")
35     print green("Creating backup package success!")
36  
37 @task
38 def put_package():
39         #推送至备份服务器
40     print yellow("Start put package...")
41     run("mkdir -p %s "% env.deploy_address_dir)
42     with settings(warn_only=True):
43       for source in env.project_dev_source:
44         result = put(env.project_tar_source+env.deploy_version+"-"+source.split('/')[-2]+".tar.gz",env.deploy_address_dir)
45     print green("Put & backup package success!")
46  
47 @task
48 @runs_once
49 def md5_check():
50         #通过md5对比备份服务器和本地备份文件的完整性
51     print yellow("check backup package...")
52     with lcd(env.project_tar_source):
53         lmd5 = local("md5sum %s%s*.gz|awk '{print $1}'"% (env.project_tar_source,env.deploy_version),capture=True).split()
54         rmd5 = run("md5sum %s/%s*.gz|awk '{print $1}'"% (env.deploy_address_dir,env.deploy_version)).split()
55         #将备份状态信息写入备份服务器的日志文本
56         if lmd5==rmd5:
57             status = '备份时间 : %-25s备份IP : %-30s备份状态 : 备份成功!'% (datetime.date.today(),env.deploy_address_ip)
58             run("echo '%s' >> %slogs/backup_%s.log"% (status,env.deploy_project_dir,env.deploy_version))
59             print green("backup package md5 contrast success!")
60         else:
61             status = '备份时间 : %-25s备份IP : %-30s备份状态 : 备份失败!'% (datetime.date.today(),env.deploy_address_ip)
62             run("echo '%s' >> %slogs/backup_%s.log"% (status,env.deploy_project_dir,env.deploy_version))
63             print green("backup package md5 contrast failure!")
64  
65 @task
66 def back():
67     tar_backup()
68     put_package()
69     md5_check()

Email脚本 [backup server端]

 1 # -*- coding: utf-8 -*
 2 #!/usr/bin/env python
 3  
 4 import commands
 5 import smtplib
 6 import string
 7 import time
 8  
 9 #查看备份服务器的日志文本信息
10 info = commands.getoutput('cat /backup/logs/backup_%s.log'% time.strftime("%Y%m%d"))
11  
12 def email():
13     HOST = "smtp.qq.com"
14     SUBJECT = ""
15     #收件人
16     TO = "address@qq.com"
17     #发件人
18     FROM = "username@qq.com"
19     #邮件内容
20     text = "%s" % info
21     BODY = string.join((
22             "From: %s" % FROM,
23             "To: %s" % TO,
24             "Subject: %s" % SUBJECT ,
25             "",
26             text
27             ), "\r\n")
28     #防止一次发送失败,循环发送5次       
29     for i in range(5):
30         try:
31             server = smtplib.SMTP()
32             server.connect(HOST,"25")
33             server.starttls()
34             server.login("username@qq.com","password")
35             server.sendmail(FROM, [TO], BODY)
36             server.quit()
37             return True
38         except Exception,error:
39             print " \033[31m%s \033[0m"% error
40             continue
41             return False
42 if __name__ == '__main__':
43     email()

 

posted @ 2018-03-15 16:07  爱吃菜的肉鸟  阅读(498)  评论(0)    收藏  举报