您的位置:首页 > 编程语言 > Python开发

python实战系列之定期备份配置文件(五)

2016-01-12 13:02 746 查看
背景需求
办公区使用了dhcp用于动态分配ip地址,解决了办公用户,移动用户(wifi)地址分配问题,因有配置的变更,为保障配置文件正确,防止出故障时实现快速恢复,特编写了一个备份文件的python脚本。备份的方式是:本地保留一个月的数据,并将备份文件上传至另外一台机器,以达到容灾的目的,程序通过crontab每天定期执行一次即可。

程序内容

cat /usr/local/sbin/backup_dhcp.py
#!/usr/bin/python
#_*_ coding:utf8 _*_
#author:Happy
#目的:备份dhcp的配置文件/etc/dhcp/dhcpd.conf
#来自Happy实验室,快乐学习,一起进步

import os
import sys
import time
import os.path
import shutil

class Backup(object):
'''
用于备份dhcp的配置文件
'''
dhcp_conf = "/etc/dhcp/dhcpd.conf"
backup_dir = "/etc/dhcp/backup"
date = time.strftime('%Y-%m-%d',time.localtime())

def check_path(self):
'''
检查dhcp配置文件和备份路径
'''
if not os.path.exists(self.dhcp_conf):
print "dhcpd configuration %s is not exsits" % (self.dhcp_conf)
return False
if not os.path.isdir(self.backup_dir):
os.makedirs(self.backup_dir)
return True

def get_backup_filename(self):
'''
得到dhcp的备份名字,类似于:/etc/dhcp/backup/dhcpd-2016-01-01的格式
'''
if self.check_path():
conf =  os.path.split(self.dhcp_conf)[-1]
backup_filename = os.path.join(self.backup_dir,"%s_%s" % (conf,self.date))
shutil.copyfile(self.dhcp_conf,backup_filename)
return backup_filename

def upload_backup_filename(self):
'''
将备份文件上传至远程的服务器,此处通过rsync的方式实现,提前配置好rsync服务
'''
cmd = "rsync -av %s rsync://root@10.16.2.8/upload/dhcp_bak"  % (self.get_backup_filename())
return os.system(cmd)
def delete_exipre_filename(self):
'''
删除过期的文件,保留周期为一个月,此处直接调用shell中的find实现
'''
cmd = 'find %s -type f -a -ctime +31 -a -name "dhcpd.conf*" | xargs rm -f {}'  % (self.backup_dir)
return os.system(cmd)

if __name__ == "__main__":
bak = Backup()
bak.upload_backup_filename()
bak.delete_exipre_filename()
3. 定期执行

通过周期性计划任务crontab实现周期性自动执行,备份按照性质不同可以设置不同的备份策略,如每小时备份,每天备份,每周备份,或者每个月备份,按照不同的情况,采取不同的备份周期,编写crontab实现即可,如下每天备份为例:

chmod u+x /usr/local/sbin/backup_dhcp.py
[root@KUGOU_DHCP_GZYC backup]# crontab -e
01      01      *       *       *       ( python /usr/local/sbin/backup_dhcp.py )


4. 总结
备份是日常运维中工作的重要组成部分,如数据库的备份,配置文件的备份,归档数据的备份等等,通过备份策略,可以在数据有故障时,采取快速的回滚,还原,一定程度减少数据的丢失,保障应用程序正常运行。上述的例子通过备份单个文件实现数据的备份,可以改造为一个通用的备份,如备份的文件路径,备份存储路径,远程保存的地址等。

5. time模块的学习
python中通过time模块,实现时间相关的处理,如下总结了time常用的方法.
获取当前时间的时间戳

>>> import time
>>> time.time()
1452581489.4855039
2. 获取当前日期
>>> time.ctime()
'Tue Jan 12 14:52:29 2016'
3. 获取时间的八元组
>>> time.localtime()
time.struct_time(tm_year=2016, tm_mon=1, tm_mday=12, tm_hour=14, tm_min=53, tm_sec=11, tm_wday=1, tm_yday=12, tm_isdst=0)
4. 将时间戳转换为日期格式
>>> time.strftime("%Y-%m-%d",time.localtime(time.time()))
'2016-01-12'
>>> time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
'2016-01-12 14:55:13'
5. 将时间日期转换为八元组
>>> time.strptime("2011-09-28 10:00:00","%Y-%m-%d %H:%M:%S")
time.struct_time(tm_year=2011, tm_mon=9, tm_mday=28, tm_hour=10, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=271, tm_isdst=-1)
6. 将时间日期转换为时间戳
>>> time.mktime(time.strptime("2011-09-28 10:00:00","%Y-%m-%d %H:%M:%S"))
1317175200.0
>>> time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(1317175200.0))
'2011-09-28 10:00:00'

本文出自 “Happy实验室” 博客,请务必保留此出处http://happylab.blog.51cto.com/1730296/1734130
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: