任务:主机A存放备份的文件夹是/data/backup/主机B名称/axel_coin/,需要备份主机B的/roo/.axel/到存放备份的文件夹,每小时备份一次,将超过7天的备份删除,主机B也要备份主机A的文件夹。

脚本如下

#!/bin/bash

check_step() { #检测上一个命令执行是否成功,如果失败就发送邮件通知
if [[ $? == "0" ]]; then
:
else
echo " "|mail -s "failed rdiff-backup ${1}-${DATE}" ${MAILTO}
fi
}

#Script usage
if [ $# -ne 1 ];then #参数1是要备份的主机名或IP地址
echo "Usage: $0 remote-hostname"
exit 1
else
export PATH=${PATH}:/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
BACKUPFILE=/root/.axel #要备份的文件夹
KEEP_DAYS=7
REHOST="$1" #将参数1赋值给REHOST变量
BACKUPDIR="/data/backup/${REHOST}/axel_coin" #存放备份文件的文件夹
LOG=${BACKUPDIR}/rdiff-backup-data/backup.log #日志文件,改文件由rdiff-backup在备份的时候生成
BAC_USER="gback" #备份用户br/>MAILTO="[email protected]"
DATE=date +%Y%m%d%H%M%S
exec &>/tmp/.backupaxel
fi

#$DIR directory exists ? #判断存放备份的文件夹是否存在
if [ ! -d "$BACKUPDIR" ];then
mkdir -p "$BACKUPDIR" #由于是在根目录创建文件夹,一般用户没有权限,通过puppet创建
fi

#Ridff-backup #执行rdiff-backup远程备份
/usr/bin/rdiff-backup --print-statistics --remote-schema 'ssh -C %s "sudo /usr/bin/rdiff-backup --server"' ${BAC_USER}@${REHOST}::${BACKUPFILE}/ ${BACKUPDIR}/
check_step #调用检测命令是否执行成功的函数

#View backup log
Num=tail -5 ${LOG}|awk '/Error/{print $2}' #查看最新产生的日志中的error字段的值是多少
if [ $Num -ne 0 ];then #如果error的值不为0,就邮件通知
tail -5 ${LOG}|mail -s "failed rdiff-backup ${1}-${DATE}" ${MAILTO}
fi

#Clear backup before 7 days #删除超过7天的备份
rdiff-backup --remove-older-than 7D ${BACKUPDIR}

echo $?

puppet的配置

file { '/data/backup': #为备份用户创建文件夹,确保权限,这样用户可以创建子文件夹了
ensure => 'directory',
owner => 'gback',
group => 'gback',
mode => '0755',
}

include profile::sudo::gback #sudo的配置,让用户可以免密码使用rdiff-backup命令

package {'rdiff-backup': ensure => 'present',} #确保远程主机上安装了rdiff-backup软件

file { '/usr/local/bin/backup_axel_coin.sh': #将备份脚本分发到备份主机,存放目录是/usr/local...........
owner => 'root',
group => 'root',
mode => '0755',
source => 'puppet:///modules/profile/backup_axel_coin.sh',
}

file { '/etc/cron.d/backup_axel_coin':    #设置cron,每小时执行一次,$1写的就是备份的主机名
owner   => 'root',
group   => 'root',
mode    => '0644',
content => "0 * * * * gback /usr/local/bin/backup_axel_coin.sh **$1** 1>/dev/null 2>&1  \n"

}