设为首页 收藏本站
查看: 926|回复: 0

[经验分享] 利用Python编写linux自动备份脚本

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-29 10:35:23 | 显示全部楼层 |阅读模式
题目:
  周末的时候帮朋友写了一个备份需求的脚本,现在整理一下,分享出来使用Python语言的Fabric模块,这里就不扫盲了,运维必用的Python模块;
  大概要求:
    公司需求,每天凌晨2点备份数据(数据量不大,每天全备),拷贝至备份服务器,通过md5对比备份文件(本机备份文件和备份服务器文件对比),并将备份情况通知运维组同学。

备份思路:
  (1.每天凌晨2点在服务器本地使用tar打包备份文件;
  (2.备份成功以后,推送至备份服务器;
  (3.校验本地备份文件和备份服务器文件的完整性和一致性;
  (4.校验文件是否一致,并将备份状态(成功or失败)写入logs文件;
  (5.通过查看logs状态检查备份是否成功,并将内容以邮件形式发送管理员;
  (6.日志信息以标签的方式写入文本,通过查看文本的信息。确认是否备份成功;
  (7.多台服务器备份,所以备份目录格式为:/backup/ip/

备份流程图:
QQ截图20150729103537.png
备份脚本 [server端]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# -*- 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端]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# -*- 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 = "address@qq.com"
    #发件人
    FROM = "username@qq.com"
    #邮件内容
    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("username@qq.com","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()



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-91871-1-1.html 上篇帖子: python中Urllib模块应用实例 下篇帖子: python中RE正则匹配模块的用法若干 linux
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表