1.rsync的編譯安裝 tar -zxf rsync-3.1.3.tar.gz cd rsync-3.1.3 ./configure --prefix=/usr/local/rsync-3.1.3 --disable-ipv6 2.rsync的配置文件: [root@web3:~]# more /usr/local/rsync/etc/rsyncd.conf uid = apache gid = users port = 873 use chroot = no #hosts allow = 192.168.9.3 #hosts deny = 192.168.10.0/24 pid file = /usr/local/rsync/rsyncd.pid lock file = /usr/local/rsync/rsync.lock #log file = /usr/local/rsync/logs/rsyncd.log [apache] comment=all web path=/ read only=no secrets file=/usr/local/rsync/etc/rsyncd.passwd auth users=apache 密碼文件: [root@web3:~]# cat /usr/local/rsync/etc/rsyncd.passwd apache:apachepass 3.rsync的啟動腳本 [root@web3:~]# cat /etc/init.d/rsync #!/bin/bash #this script for start|stop rsync daemon service #date:2012/2/13 status1=$(ps -ef | egrep "rsync --daemon.*rsyncd.conf" | grep -v 'grep') #pidfile="/etc/rsync/rsyncd.pid" pidfile="/usr/local/rsync/rsyncd.pid" #start_rsync="rsync --daemon --config=/etc/rsync/rsyncd.conf" start_rsync="rsync --daemon --config=/usr/local/rsync/etc/rsyncd.conf" function rsyncstart() { if [ "${status1}X" == "X" ];then rm -f $pidfile ${start_rsync} status2=$(ps -ef | egrep "rsync --daemon.*rsyncd.conf" | grep -v 'grep') if [ "${status2}X" != "X" ];then echo "rsync service start.......OK" fi else echo "rsync service is running !" fi } function rsyncstop() { if [ "${status1}X" != "X" ];then kill -9 $(cat $pidfile) status2=$(ps -ef | egrep "rsync --daemon.*rsyncd.conf" | grep -v 'grep') if [ "${statusw2}X" == "X" ];then echo "rsync service stop.......OK" fi else echo "rsync service is not running !" fi } function rsyncstatus() { if [ "${status1}X" != "X" ];then echo "rsync service is running !" else echo "rsync service is not running !" fi } function rsyncrestart() { if [ "${status1}X" == "X" ];then echo "rsync service is not running..." rsyncstart else rsyncstop rsyncstart fi } case $1 in "start") rsyncstart ;; "stop") rsyncstop ;; "status") rsyncstatus ;; "restart") rsyncrestart ;; *) echo echo "Usage: $0 start|stop|restart|status" echo esac # 自動啟動rsync服務腳本 [root@web3:~]# cat /usr/local/zabbix_agents_3.2.0/scripts/start_rsy.sh #!/bin/bash count_num=`ps -ef|grep 'rsync --daemon'|grep -v grep|wc -l` echo $count_num rm -f /usr/local/rsync/rsyncd.pid if [ $count_num -eq 0 ];then /etc/init.d/rsync start fi ###########使用rsync同步腳本的示例 # vim /usr/local/worksh/jenkins_task/rsync_cbs_chinasoft_com.sh #!/bin/bash ##############jenkins拉取git代碼同步到web3上,然后觸發web3上的該腳本進行 ws/eus/eop 三個機房同步#################### ###### rsync cbs.chinasoft.com data ###################################### passwd="/data/www/.rsync/rsyncd.pass" # ws_cbs_ip ws_cbs_ip_list="192.168.254.1 192.168.254.2" # eus_cbs_ip eus_cbs_ip_list="1.1.1.1" # eop_cbs_ip eop_cbs_ip_list="2.2.2.2" ############################################################# # 同步所有機房 function cbs_rsync_all() { # rsync ws_cbs for ws_cbs_ip in $ws_cbs_ip_list do echo "####################rsync ws_cbs start################################" echo $ws_cbs_ip rsync -zavP --delete --exclude=logs/ --exclude=cache/ --password-file=$passwd /data/cbs.chinasoft.com/ apache@$ws_cbs_ip::apache/data/cbs.chinasoft.com/
# 添加如下對執行結果的判斷,如果執行失敗就退出程序,這樣可以避免當代碼要求強一致的時候,有些沒有同步到也報success
if [[ $? == 0 || $? == 23 ]];then
rsync_edit=1
else
rsync_edit=0
echo "`date` rsync發布失敗! -> editUrls.txt"
exit 1
fi
echo "################### rsync ws_cbs end #######################" done # rsync eus_cbs for eus_cbs_ip in $eus_cbs_ip_list do echo "####################rsync eus_cbs start################################" echo $eus_cbs_ip rsync -zavP --delete --exclude=logs/ --exclude=cache/ --password-file=$passwd /data/cbs.chinasoft.com/ apache@$eus_cbs_ip::apache/data/cbs.chinasoft.com/ echo "################### rsync eus_cbs end #######################" done # rsync eop_cbs for eop_cbs_ip in $eop_cbs_ip_list do echo "####################rsync eop_cbs start################################" echo $eop_cbs_ip rsync -zavP --delete --exclude=logs/ --exclude=cache/ --password-file=$passwd /data/cbs.chinasoft.com/ apache@$eop_cbs_ip::apache/data/cbs.chinasoft.com/ echo "################### rsync eop_cbs end #######################" done } # 只同步網宿機房 function cbs_rsync_ws() { # rsync ws_cbs for ws_cbs_ip in $ws_cbs_ip_list do echo "####################rsync ws_cbs start################################" echo $ws_cbs_ip rsync -zavP --delete --exclude=logs/ --exclude=cache/ --password-file=$passwd /data/cbs.chinasoft.com/ apache@$ws_cbs_ip::apache/data/cbs.chinasoft.com/ echo "################### rsync ws_cbs end #######################" done } # 只同步美西機房 function cbs_rsync_eus() { # rsync eus_cbs for eus_cbs_ip in $eus_cbs_ip_list do echo "####################rsync eus_cbs start################################" echo $eus_cbs_ip rsync -zavP --delete --exclude=logs/ --exclude=cache/ --password-file=$passwd /data/cbs.chinasoft.com/ apache@$eus_cbs_ip::apache/data/cbs.chinasoft.com/ echo "################### rsync eus_cbs end #######################" done } # 只同步歐洲德國機房 function cbs_rsync_eop() { # rsync eop_cbs for eop_cbs_ip in $eop_cbs_ip_list do echo "####################rsync eop_cbs start################################" echo $eop_cbs_ip rsync -zavP --delete --exclude=logs/ --exclude=cache/ --password-file=$passwd /data/cbs.chinasoft.com/ apache@$eop_cbs_ip::apache/data/cbs.chinasoft.com/ echo "################### rsync eop_cbs end #######################" done } ##################### MAIN ############################### usage () { echo "" echo " Please Input server infomation!" echo "" echo " USAGE: `basename $0` [all|cbs_ws|cbs_eus|cbs_eop]" echo "" } if [ $# != 1 ] then usage >&2 exit 1 fi OPT=$1 case $OPT in all) echo "start rsync `basename $0` to all cbs servers" cbs_rsync_all ;; cbs_ws) echo "start rsync `basename $0` to ws_cbs_servers" cbs_rsync_ws ;; cbs_eus) echo "start rsync `basename $0` to eus_cbs_servers" cbs_rsync_eus ;; cbs_eop) echo "start rsync `basename $0` to eop_cbs_servers" cbs_rsync_eop ;; *) echo "Usage:`basename $0` [all|cbs_ws|cbs_eus|cbs_eop]" ;; esac #########腳本使用示例 ./rsync_cbs_chinasoft_com.sh all # 同步所有機房 ./rsync_cbs_chinasoft_com.sh cbs_eus # 同步美西機房 常用示例: 1.推送本地文件目錄 /data/cbs.chinasoft.com 到遠程服務器的 /data/cbs.chinasoft.com/ 目錄: rsync -zavP --delete --exclude=logs/ --exclude=cache/ --password-file=$passwd /data/cbs.chinasoft.com/ apache@192.168.3.10::apache/data/cbs.chinasoft.com/ 2.主動拉取遠程服務器的目錄 [root@localhost 2018-11]# cat /opt/platform/rsync_datacollection_new_wuchao.sh #!/bin/bash SIP="192.168.10.207" ps -ef | grep "${SIP}::apache/opt/platform/downloader/all" | grep -v grep | awk '{print $2}' | xargs kill -9 ps -ef | grep "${SIP}::apache/opt/platform/datacollection/all" | grep -v grep | awk '{print $2}' | xargs kill -9 DATE_1="`date -d '-1 day' +%Y-%m`" DATE0="`date -d '0 day' +%Y-%m`" for a in `seq -2 0` do DATE="`date -d "${a} day" +%Y-%m`" # 拉取遠程服務器 192.168.10.207 上 的 /opt_log/platform_logs/datacollection/all/ 目錄到本地的 /opt/platform/datacollection/all/ 目錄 /usr/bin/rsync -avrp -P --password-file=/etc/rsnyc_for_logs_by_Wanjie.scrt apache@${SIP}::apache/opt_log/platform_logs/datacollection/all/$DATE /opt/platform/datacollection/all/ /usr/bin/rsync -avrp -P --password-file=/etc/rsnyc_for_logs_by_Wanjie.scrt apache@${SIP}::apache/opt_log/platform_logs/downloader/all/$DATE /opt/platform/downloader/all/ ######################### cms_back主動拉取cms遠程服務器的db數據進行備份 [root@localhost 2018-11]# cat /opt/cms_dbback.sh #!/bin/bash SIP="192.168.1.3" ps -ef | grep "${SIP}::apache/data/MySQL_Data_Backup" | grep -v grep | awk '{print $2}' | xargs kill -9 # 拉取遠程服務器cms 192.168.1.3 上 的mysql數據庫備份 /data/MySQL_Data_Backup 目錄到本地的 /data/cmsdb_back/ 目錄 /usr/local/rsync/bin/rsync -avrp -P --password-file=/opt/cmsdbback.pass apache@${SIP}::apache/data/MySQL_Data_Backup /data/cmsdb_back/
問題分析:
同步多次都不能把本地文件和遠端文件保持一致
#!/bin/bash
#############################################
# uat和pro獲取代碼源頭都是一個相同目錄: /data/www/vhosts/u.chinasoft.com/httpdocs/
# uat只發布一台服務器進行驗證,生產環境發布兩台
chinasoft_iplist="1.1.1.1 1.1.1.2"
function chinasoft_eus_rsync()
{
for ip in $chinasoft_iplist
do
echo "-- start pub --- 預發布到外網 ${ip} ----------------------------------------"
#/usr/local/bin/rsync -vaRzP --bwlimit=1000 --exclude='.env' --exclude='runtime/' --exclude='config.py' --exclude='docs/' --password-file=/data/www/.rsync/rsyncd.pass /data/www/vhosts/u.chinasoft.com/httpdocs/ apache@$ip::apache/data/www/vhosts/u.chinasoft.com/httpdocs/
/usr/local/bin/rsync -zavP --bwlimit=1000 --exclude='.env' --exclude='runtime/' --exclude='config.py' --exclude='docs/' --password-file=/data/www/.rsync/rsyncd.pass /data/www/vhosts/u.chinasoft.com/httpdocs/ apache@$ip::apache/data/www/vhosts/u.chinasoft.com/httpdocs/
if [[ $? == 0 || $? == 23 ]];then
rsync_edit=1
else
rsync_edit=0
echo "`date` rsync發布失敗! -> editUrls.txt"
exit 1
fi
echo -e "-- end pub rsync ${ip} ----------------------------------------------------------\n\n"
done
echo "-- end pub all rsync success----------------------------------------------------------"
exit 0
}
# 執行同步
chinasoft_eus_rsync
# 現象:同步后始終有文件不同,多次同步亦然
# rsync -vaRzP
更換為如下即可
rsync -vazP
限制根目錄的配置示例:
[root@sz_publish01:~]# cat /usr/local/rsync/etc/rsyncd.conf uid = apache gid = users port = 873 use chroot = no #hosts allow = 192.168.9.3 #hosts deny = 192.168.10.0/24 pid file = /usr/local/rsync/rsyncd.pid lock file = /usr/local/rsync/rsync.lock #log file = /usr/local/rsync/logs/rsyncd.log reverse lookup = no [apache_project] comment=all web path=/data/www/vhosts/ read only=no secrets file=/usr/local/rsync/etc/rsyncd.passwd auth users=apache [apache] comment=all web path=/ read only=no secrets file=/usr/local/rsync/etc/rsyncd.haiwai auth users=apache # 同步示例 function mms_rsync_all() { # rsync huadong for huadong_ip in $huadong_mms_web_ip_list do echo "####################rsync huadong start################################" echo $huadong_ip rsync -zavP --delete $exclude_list --password-file=$passwd /data/www/vhosts/mms_task/ apache@${huadong_ip}::apache_project/mms_task/ #調用初始化腳本 run_init_sh ${huadong_ip} 2025 echo "################### rsync huadong end #######################" done }
按照模塊授權,每個模塊一個密碼,這樣可以避免因誤操作刪除整個根目錄文件
# 新的推送規則 /usr/local/rsync/bin/rsync -zavP --password-file="/data/www/.rsync/rsyncd.szpublish" /data/www/vhosts/apiservice.chinasoft.com/httpdocs/ apache@172.18.54.140::apache_apiservice_chinasoft_com # 注意密碼文件格式
# cat /usr/local/rsync/etc/rsyncd.apiservice.chinasoft.com
apache:pass
# 一定要修改客戶端和服務端密碼文件權限,否則無法正常同步
# chmod 600 /usr/local/rsync/etc/rsyncd.apiservice.chinasoft.com
[root@sz_publish01:/data/www/vhosts/apiservice.chinasoft.com]# more /usr/local/rsync/etc/rsyncd.conf uid = apache gid = users port = 873 use chroot = no #hosts allow = 192.168.9.3 #hosts deny = 192.168.10.0/24 pid file = /usr/local/rsync/rsyncd.pid lock file = /usr/local/rsync/rsync.lock log file = /usr/local/rsync/logs/rsyncd.log reverse lookup = no # 后續拿掉 [apache_project] comment=all web path=/data/www/vhosts/ read only=no secrets file=/usr/local/rsync/etc/rsyncd.passwd auth users=apache # 1.購物車中文服務項目 [apache_www-api_chinasoft_com] comment=www-api.chinasoft.com path=/data/www/vhosts/www-api.chinasoft.com/httpdocs/ read only=no #log file = /usr/local/rsync/logs/rsyncd_www-api.chinasoft.com.log secrets file=/usr/local/rsync/etc/rsyncd.www-api.chinasoft.com auth users=apache # 2.購物車中文服務項目 [apache_product-api_chinasoft_com] comment=www-product-api.chinasoft.com path=/data/www/vhosts/product-api.chinasoft.com/httpdocs/ read only=no secrets file=/usr/local/rsync/etc/rsyncd.product-api.chinasoft.com auth users=apache # 3.購物車中文服務項目 [apache_apiservice_chinasoft_com] comment=apiservice.chinasoft.com path=/data/www/vhosts/apiservice.chinasoft.com/httpdocs/ read only=no secrets file=/usr/local/rsync/etc/rsyncd.apiservice.chinasoft.com auth users=apache # 4.購物車中文服務項目 [apache_product-service_chinasoft_com] comment=product-service.chinasoft.com path=/data/www/vhosts/product-service.chinasoft.com/httpdocs/ read only=no secrets file=/usr/local/rsync/etc/rsyncd.product-service.chinasoft.com auth users=apache # N.此處為注釋 [apache] comment=all web path=/ read only=no secrets file=/usr/local/rsync/etc/rsyncd.haiwai auth users=apache [apache@sz_publish01:/usr/local/worksh/jenkins_rsync]$ more alisz_rsync_apiservice.chinasoft.com.sh #!/bin/bash ##############公司jenkins拉取git代碼同步到 sz_publish01(1.1.1.1) 上,然后觸發 sz_publish01 上的該腳本同步到web服務器#################### #1. rsync apiservice.chinasoft.com #2. 初始化腳本 by pengll 2020.04.03 ## 定義排除的目錄,線上一般排除logs文件夾 passwd="/data/www/.rsync/rsyncd.pass.apiservice.chinasoft.com" exclude_list="--exclude=logs/" # 盡量使用IP地址,多個IP用空格隔開 hnsz_ip_list="192.168.1.10 192.168.1.11" # 發布單台機器 hnsz_ip_list_web01="192.168.1.10" hnsz_ip_list_web02="192.168.1.11" # 代碼發布目錄,一般為/data/www/vhosts/${project_dir} project_dir="apiservice.chinasoft.com/httpdocs" # 同步所有機房,目前只有華南深圳一個機房 function rsync_hnsz_all() { for ip in ${hnsz_ip_list} do echo "#################### Run rsync ${ip} start ################################" rsync -zavP --delete $exclude_list --password-file=$passwd /data/www/vhosts/${project_dir}/ apache@${ip}::apache/data/www/vhosts/${project_dir}/ echo "################### Run rsync ${ip} end #######################" done } # 同步華南深圳機房的第1台web機器 function rsync_hnsz_web1() { for ip in ${hnsz_ip_list_web01} do echo "#################### Run rsync ${ip} start ################################" rsync -zavP --delete $exclude_list --password-file=$passwd /data/www/vhosts/${project_dir}/ apache@${ip}::apache/data/www/vhosts/${project_dir}/ echo "################### Run rsync ${ip} end #######################" done } # 同步華南深圳機房的第2台web機器 function rsync_hnsz_web2() { for ip in ${hnsz_ip_list_web02} do echo "#################### Run rsync ${ip} start ################################" rsync -zavP --delete $exclude_list --password-file=$passwd /data/www/vhosts/${project_dir}/ apache@${ip}::apache/data/www/vhosts/${project_dir}/ echo "################### Run rsync ${ip} end #######################" done } ##################### MAIN ############################### usage () { echo "" echo " Please Input server infomation!" echo "" echo " USAGE: `basename $0` [all|apiservice_web01|apiservice_web02]" echo "" } if [ $# != 1 ] then usage >&2 exit 1 fi OPT=$1 case $OPT in all) echo "start rsync ${project_dir} to ${hnsz_ip_list} servers" rsync_hnsz_all echo "rsync ${project_dir} to ${hnsz_ip_list} Done" ;; apiservice_web01) echo "start rsync ${project_dir} to ${hnsz_ip_list_web01} servers" rsync_hnsz_web1 ;; apiservice_web02) echo "start rsync ${project_dir} to ${hnsz_ip_list_web02} servers" rsync_hnsz_web2 ;; *) echo "Usage:`basename $0` [all|apiservice_web01|apiservice_web02]" ;; esac
rsync同步時報錯:
------------ 域名:images.chinasoft.fr 服務器:192.168.0.1 動作:同步 ------------
sending incremental file list
cannot delete non-empty directory: images.chinasoft.fr/httpdocs/images/multimedia/dvd-ripper-platinum
cannot delete non-empty directory: images.chinasoft.fr/httpdocs/images/multimedia/dvd-ripper-platinum
cannot delete non-empty directory: images.chinasoft.fr/httpdocs/images/mobile/iphone-ringtone-maker
cannot delete non-empty directory: images.chinasoft.fr/httpdocs/images/mobile/iphone-ringtone-maker
cannot delete non-empty directory: images.chinasoft.fr/httpdocs/images/mobile
/usr/bin/rsync -avzP --password-file=/data/www/.rsync/rsyncd.pass --delete $exclude --exclude=logs/* --exclude=cache/* --exclude=.svn /data/www/vhosts/${domain} apache@$ip::apache/data/www/vhosts/
# 分析:發現是部分目錄比如.svn 被排除了,實際上很多目錄下是有這個文件的,需要加上這個參數即可 --delete-excluded
/usr/bin/rsync -avzP --password-file=/data/www/.rsync/rsyncd.pass --delete --delete-excluded $exclude --exclude=resource.chinasoft.com --exclude=logs/* --exclude=cache/* --exclude=.svn /data/www/vhosts/${domain} apache@$ip::apache/data/www/vhosts/