利用Python编写linux自动备份脚本--转载未经测试
题目:
周末的时候帮朋友写了一个备份需求的脚本,现在整理一下,分享出来使用Python语言的Fabric模块,这里就不扫盲了,运维必用的Python模块;
大概要求:
公司需求,每天凌晨2点备份数据(数据量不大,每天全备),拷贝至备份服务器,通过md5对比备份文件(本机备份文件和备份服务器文件对比),并将备份情况通知运维组同学。
备份思路:
(1.每天凌晨2点在服务器本地使用tar打包备份文件;
(2.备份成功以后,推送至备份服务器;
(3.校验本地备份文件和备份服务器文件的完整性和一致性;
(4.校验文件是否一致,并将备份状态(成功or失败)写入logs文件;
(5.通过查看logs状态检查备份是否成功,并将内容以邮件形式发送管理员;
(6.日志信息以标签的方式写入文本,通过查看文本的信息。确认是否备份成功;
(7.多台服务器备份,所以备份目录格式为:/backup/ip/
备份流程图:
备份脚本 [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()


浙公网安备 33010602011771号