功能:同步模拟环境代码到正式服务器

  1. 每次更新文件之前,分先将差异文件以列表形式显示出来。
  2. 同步的文件会按原目录形式自动备份到/opt/data_bak/rsync_update_bak目录。
  3. 同步的日志文件会自动保存在/var/log/rsync_web目录。
  4. 同步时会排除exclude_file.txt文件里定义的文件和目录,比如DB配置文件。
  5. 同步后会删除备份目录/opt/data_bak/rsync_update_bak,30天前备份的文件和目录。

流程图


#cat resync_web_update.sh

#!/bin/bash
export LANG=C
  
date=`date +%Y-%m-%d-%H%M`
  
red=`echo -e "\033[0;31m"`
blue=`echo -e "\033[0;36m"`
white=`echo -e "\033[37m"`
  
rsync=/usr/bin/rsync
rsync_bak_dir=/opt/data_bak/rsync_update_bak
exclude_web_file=/root/sh/rsync_online_web/exclude_web_file.txt
exclude_res_file=/root/sh/rsync_online_web/exclude_res_file.txt
www_bak_dir=/opt/data_bak/rsync_update_bak/www/$date
res_bak_dir=/opt/data_bak/rsync_update_bak/res/$date
logs=/var/log/rsync_web
  
#删除历史备份函数
del_rsync_history(){
    del_rsync_history=${rsync_bak_dir:?error}                                  #删除历史目录是否定义,如果未定义程序退出,不在往下执行。
        if [ $del_rsync_history != "/opt/data_bak/rsync_update_bak"  ];then    #判断删除历史目录是否正确,避免误删除
                printf $red
                echo "$del_rsync_history File directory error !!!"
                echo "Exit..."
                sleep 3
                printf $white
                exit
        fi
  
    echo "find $del_rsync_history -mtime +30 | xargs rm -rf"
    find $del_rsync_history -mtime +30 | xargs rm -rf
}
  
#同步是否成功函数
is_ok(){
        if [ $? -eq 0 ];then
                printf $blue
                echo "file update Success"
                printf $white
        else
                printf $blue
                echo "file update Fail !!!"
                printf $white
        fi
}
  
#同步排除文件是否存在函数
file_web_exist(){
        if [ ! -f $exclude_web_file ];then
                printf $red
                echo "$exclude_web_file file does not exist !!!"
                printf $white
                exit
        fi
}
 
file_res_exist(){
        if [ ! -f $exclude_res_file ];then
                printf $red
                echo "$exclude_res_file file does not exist !!!"
                printf $white
                exit
        fi
}
  
#日志目录是否存在
if [ ! -d $logs ];then
        mkdir -p $logs
fi
  
#目标文件夹
target_www=/opt/web/test/
target_res=/opt/web/test/res/
  
 
 
ip=192.168.1.100
user=rsyncuser
pass=/root/sh/rsync_online_web/rsyncpass
  
#源文件夹
source_www=$user@$ip::web_www
source_res=$user@$ip::web_res
  
#同步流程
if "$1" "www" ];then
     file_web_exist         #判断同步排除文件是否存在
     $rsync -vzrtopg \
            -n \
            --progress \
            --delete-after \
            --exclude-from=$exclude_web_file \
            --password-file=$pass \
            $source_www $target_www
  
    printf $blue
    echo "-----------------------------------------------------"
    echo "  Are you sure update www.test.com ?[Y/y]"
    echo "-----------------------------------------------------"
    printf $white
    read -p ">  " s
    if [ $s == "Y" -o $s == "y" ];then
  
        if [ ! -d $www_bak_dir ];then
                mkdir -p $www_bak_dir
        fi
  
            $rsync  -vzrtopg \                          #同步参数,-v显示详细信息,-z传输文件压缩,-r递归模式,-t保持文件时间信息,-o保持文件属主信息,-p保持文件权限,-g保持文件组信息
                    --progress \                        #显示rsync备份过程
                    --delete-after \                    #同步后删除文件
                    --exclude-from=$exclude_web_file \  #排除文件列表
                    --backup \                          #备份
                    --backup-dir=$www_bak_dir \         #备份目录
                    --log-file=$logs/www.test.com.log \ #日志文件
                    --log-file-format="%f" \            #日志格式
                    --password-file=$pass \             #rsync密码
                    $source_www $target_www             #将source_www文件及目录同步到target_www目录
            is_ok                                       #判断是否同步成功函数
            del_rsync_history                           #删除历史备份文件函数
    else
        printf "No choice,Exit...\n"
        exit  
    fi
  
elif "$1" "res" ]; then
file_res_exist
       $rsync   -vzrtopg \
                -n \
                --progress \
                --delete-after \
                --exclude-from=$exclude_res_file \
                --password-file=$pass \
                $source_res $target_res
  
        printf $blue
        echo "-----------------------------------------------------"
        echo "  Are you sure update res.test.com ?[Y/y]"
        echo "-----------------------------------------------------"
        printf $white
        read -p ">  " s
    if [ $s == "Y" -o $s == "y" ];then
  
    if [ ! -d $res_bak_dir ];then
            mkdir -p $res_bak_dir
    fi
  
            $rsync  -vzrtopg \
                    --progress \
                    --delete-after \
                    --exclude-from=$exclude_res_file \
                    --backup \
                    --backup-dir=$res_bak_dir \
                    --log-file=$logs/res.test.com.log \
                    --log-file-format="%f" \
                    --password-file=$pass \
                    $source_res $target_res
                    is_ok
                    del_rsync_history
    else
                printf "No choice,Exit...\n"
                 exit
        fi
   
else
    echo "----------------------------------------------------------------------------------------"
    printf $blue
    printf "\twww.test.com\n"
    printf "\tUsage: /root/sh/rsync_online_web/rsync_test_web_update.sh   {www|res}\n"
    printf $white
    echo "----------------------------------------------------------------------------------------"
fi