1. 背景需求

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


  2. 程序内容

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://[email protected]/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常用的方法.

  1. 获取当前时间的时间戳

>>> 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'