使用rsync同步文件
背景
1. 在开发机上远程开发,svn提交代码
2. 开发过程中,需要同步代码到测试机上进行测试。测试机出于安全考虑,不允许连接svn。
我之前是直接使用scp批量同步所有文件到测试机,现在安全策略收紧,不允许使用scp了。
咨询了运维,可以搭建rsync来进行机器间的文件同步。
这里假设有两台机器:开发机10.0.0.1和测试机10.0.0.2。
1. 在两台机器上搭建rsync。
tar -zvf rsync-3.1.2.tar.gz
cd rsync-3.1.2
./configure --prefix=/usr/local/rsync
make
make install
下面的配置文件只需要在测试机上添加。
/etc/rsyncd.conf 指定rsync的配置
#以什么身份运行rsync
uid = root
gid = root
use chroot = no
#同时连接的最大连接数,0则不限制
max connections=0
#日志格式%h远端的主机名,%o操作类型,send/recv,%f文件名,%l文件长度,单位byte,%b真实传输的字节数
log format = %h %o %f %l %b
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
#模块名
[test]
#同步的文件目录
path = /data/web/test
#欢迎信息
comment = rsync from other
#只读
read only = no
#允许拉取文件列表
list = on
#secrets file中的用户名
auth users = rsyncuser
#密码文件位置
secrets file = /etc/rsync.pas
/etc/rsync.pas为允许访问的用户密码列表
rsyncuser:123456
这里记得添加完rsync.pas
文件后,修改下文件属性。
chmod 600 /etc/rsync.pas
启动测试机上的rsync进程。
kill -9 $(pidof rsync)
rm -f /var/run/rsyncd.pid
/usr/bin/rsync --port=8730 --address=10.0.0.2 --daemon
2. 在开发机上同步文件
执行同步命令。
rsync -azv --delete --port=8730 /data/image/v2.0.2/ rsyncuser@10.0.0.2::test
输入密码,然后就能看到同步的文件列表了。
这里我们同步的时候,需要把.svn
、.swp
等其他隐藏目录文件排除掉的。
新建文件exclude.list
文件,里面每一行一个需要排除的文件。
.*
同时我们也不想每次输入密码,新建文件rsync_client.pas
,内容为同步用户的密码,注意这个为明文。
123456
修改rsync_client.pas
文件权限和属主,这里需要把属主改为执行同步的用户,否则会报权限不足的错误。
chown dondon:users rsync_client.pas
chmod 600 rsync_client.pas
执行同步命令。
/usr/local/rsync/bin/rsync -azv --delete --port=8730 /data/image/v2.0.2/ rsyncuser@10.0.0.2::test --exclude-from=/usr/local/rsync/exclude.list --password-file=/usr/local/rsync/rsync_client.pas
之前使用scp同步文件,有一个缺点,svn里删除的文件,测试机上是不会删除的。
但是rsync就可以同步所有文件的状态,包括已删除的。
这里建议把重启rsync和同步文件的命令写成shell,添加到alias里,这样每次就不需要写这么长的命令了。
abc:~/image/v2.0.2> syncfile ./
sending incremental file list
deleting test.txt
./
web/index.php
sent 23519 bytes received 238 bytes 47514.00 bytes/sec
total size is 5923997 speedup is 249.36