- 本处基于saltstack的配置目录里分解rsync的tar包,倒序讲解。
[root@master rsync]# ls
rsyncd.tar.gz 后两个是推复制rsyncd_tui_master.tar.gz rsync_tui_slave.tar.gz
[root@master rsync]# pwd
/srv/salt/rsync
[root@master rsync]# - 解压之后 先从拉复制开始讲解
- [root@master rsyncd]# pwd
/srv/salt/rsync/rsyncd
[root@master rsyncd]# ls
rsyncd.conf rsyncd_master.sh rsyncd.motd rsyncd.secrets rsyncd_slave.sh
配置文件 脚本 欢迎页 密钥 slave脚本
[root@master rsyncd]#
拉复制概念,如下先看脚本理解工作过程。
[root@master rsyncd]# cat rsyncd.conf
uid=root
gid=root
port=873
max connections=0
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
motd file=/etc/rsyncd/rsyncd.motd
read only=yes #配置只读
hosts allow=IP #权限从上到下的优先级
hosts deny=*
[aaa] #共享名称
path=B #共享路径
list=yes
ignore errors
auth users=shych
secrets file=/etc/rsyncd/rsyncd.secrets
[root@master rsyncd]# cat rsyncd_master.sh
#!/bin/bash
read -p "请输入允许获取数据的IP或者IP网段:" a
read -p "共享目录绝对路径:" b
read -p "请输入密码文件的密码:" c
rm -rf /etc/rsyncd
cp -r /usr/src/rsyncd/ /etc/
if [ $? -eq 0 ];then
echo "配置文件完成"
mkdir -p "$b"
cd /etc/rsyncd/
sed -i '10s:IP:'$a':' rsyncd.conf
sed -i 's:0:'$c':' rsyncd.secrets
sed -i '13s:B:'$b':' rsyncd.conf #此处以冒号为分隔符,防止与变量b输入的/冲突
if [ $? -eq 0 ];then
echo "配置文件修改成功"
rsync --daemon --config=/etc/rsyncd/rsyncd.conf
lsof -i:873
if [ $? -eq 0 ];then
echo "服务启动成功"
else
echo "服务启动失败,请检查配置文件"
break
fi
else
echo "配置文件修改失败"
fi
else
echo "配置文件复制失败"
fi
[root@master rsyncd]#
再看下salve的脚本
[root@master rsyncd]# cat rsyncd_slave.sh
#!/bin/bash
read -p "请输入master的共享数据的IP:" a
read -p "请输入master共享目录绝对路径:" b
read -p "请输入密码文件的密码:" c
mkdir -p "$b"
touch /etc/rsyncd.pw
echo "$c" > /etc/rsyncd.pw
chmod 600 /etc/rsyncd.pw
rsync -aczP --delete --password-file=/etc/rsyncd.pw shych@"$a"::aaa "$b" > /dev/zero
if [ $? -eq 0 ];then
echo "数据更新成功"
else
echo "数据更新失败,请检查配置文件和密码文件权限是否为600!"
fi
[root@master rsyncd]#
通过两个脚本可以看吃slave通过运行一个命令来达到与master同步的动作。
拉复制是slave通过计划任务来达到定时出发命令
rsync -aczP --delete --password-file=/etc/rsyncd.pw shych@“
a
"
:
:
a
a
a
"
a"::aaa "
a"::aaa"b” > /dev/zero
综上所述,master上需要有配置文件还需要有欢迎文件rsyncd.motd以及密钥文件
[root@master rsyncd]# cat rsyncd.secrets
shych:0
[root@master rsyncd]#
密钥文件需要跟slave配对,并且执行权限必须是600.否则会报错.
拉复制缺点是并发能力不好,如果同时好多slave同时拉取数据,会导致master负载过大。但是对大文件传输
支持很好。
推复制
- 推复制master端时时监控本地共享目录的文件变化,当检查到有更新时候,就会把更新推送到slave上。优点是抗病发能力强,对大文件传输效果不好。
- [root@master rsyncd_tui_master]# ls
confxml.bak GNU-Linux-x86 rsyncd_tui.sh
[root@master rsyncd_tui_master]# - `[root@master rsyncd_tui_master]# cat rsyncd_tui.sh
#!/bin/bash
read -p “请输入监控文件的路径:” c
read -p “请输入推送的目标IP:” a
read -p “请输入密码文件的密码:” d
mkdir -pv “ c " t o u c h / e t c / r s y n c d . p w e c h o " c" touch /etc/rsyncd.pw echo " c"touch/etc/rsyncd.pwecho"d” > /etc/rsyncd.pw
chmod 600 /etc/rsyncd.pw
rm -rf GNU-Linux-x86/confxml.xml
cp confxml.bak ./GNU-Linux-x86/confxml.xml
cd GNU-Linux-x86
sed -i ‘25s/IP/‘ a ′ / ′ c o n f x m l . x m l s e d − i ′ 24 s : M U L U : ′ a'/' confxml.xml sed -i '24s:MULU:' a′/′confxml.xmlsed−i′24s:MULU:′c’:’ confxml.xml
./sersync2 &
if [ $? -eq 0 ];then
echo “配置文件修改成功!”
else
echo “修改失败,请检查密码文件权限600?”
fi
`
通过代码里可知master只负责监控本地的变化需要GNU-Linux-x86监控插件来实现。并且也需要注意密钥文件的权限。
salve上的部署区别拉复制的master的配置不大。如下:
[root@master rsync_tui_slave]# ls
rsyncd.conf rsyncd.motd rsyncd.secrets rsyncd.sh
[root@master rsync_tui_slave]#
[root@master rsync_tui_slave]# cat rsyncd.sh
#!/bin/bash
killall rsync > /dev/null
read -p "请输入允许获取数据的IP或者IP网段:" a
read -p "共享目录绝对路径:" b
read -p "请输入密码文件的密码:" c
rm -rf /etc/rsyncd
rm -rf /var/run/rsyncd.pid
cp -r /usr/src/rsyncd/ /etc/
if [ $? -eq 0 ];then
echo "配置文件完成"
mkdir -p "$b"
cd /etc/rsyncd/
sed -i '10s:IP:'$a':' rsyncd.conf
sed -i 's:0:'$c':' rsyncd.secrets
sed -i '13s:B:'$b':' rsyncd.conf #此处以冒号为分隔符,防止与变量b输入的/冲突
if [ $? -eq 0 ];then
echo "配置文件修改成功"
rsync --daemon --config=/etc/rsyncd/rsyncd.conf
lsof -i:873
if [ $? -eq 0 ];then
echo "服务启动成功"
else
echo "服务启动失败,请检查配置文件"
break
fi
else
echo "配置文件修改失败"
fi
else
echo "配置文件复制失败"
fi
#作为推复制时候需要手动改配置文件rsyncd.conf的 read only=no
作为推复制时候需要手动改配置文件rsyncd.conf的 read only=no,因为slave是需要被写入数据的。
[root@master rsync_tui_slave]# cat rsyncd.conf
uid=root
gid=root
port=873
max connections=0
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
motd file=/etc/rsyncd/rsyncd.motd
read only=no #注意此处跟拉复制的区别
hosts allow=IP
hosts deny=*
[aaa]
path=B
list=yes
ignore errors
auth users=shych
secrets file=/etc/rsyncd/rsyncd.secrets
通过以上rsync推拉复制的部署,至于个人跟据公司的应用选择用哪种来部署。因便于管理发版更新,jenkins如果出发自动构建,建议采用推复制时时监控jenkins下workspace的项目的变化。如果需要手动审核,也可以推复制用一下命令,就不需要装监控软件了只需要构建时候调用脚本即可,脚本如下:
[root@bussiness-interface-ct deploy]# ls
deploy_m_new.sh program_new
[root@bussiness-interface-ct deploy]#
其中program_new是里包含项目名称文件
[root@bussiness-interface-ct program_new]# ls
CI–aps_approval CI–crf_intell CI–crf_online_aps CI–shlife_loan
jenkins通过调用此脚本 $1 $2 两个参数 如图JOBHOME 和WORKSPACE
赛选出项目的IP和项目名称并与program_new
目录对应判断是否存在此项目,存在的话就把war包通过rsync同步到对应的服务器的tomcat下。
#!/bin/bash
COLOR_WHITE="\033[1;37m"
dir="/usr/local/deploy/program_new"
project=$(ls /usr/local/deploy/program_new)
time=$(date "+%m-%d-%H:%M:%S")
p=$(echo "$1" |awk -F-- '{print $2}')
for i in "$p"; do
echo "${project[@]}" |grep -wq "$1"
if [ $? == 0 ];then
cat $dir/$1 | grep -v "^#" | grep "IP" | awk -F= '{print $2}' |
while read ip
do
if [ "$i" = mobile_loan_static ];then
rsync -av --password-file=/usr/local/deploy/pwd.conf --exclude .svn $2/* ruser@$ip::static
else
rsync -av --password-file=/etc/pwd.conf $2/target/$i.war ruser@$ip::webapps/tomcat/webapps/
fi
if [ $? -ne 0 ];then
exit 1
fi
done
else
echo "$COLOR_WHITE Usage: $0 {project_name}"
fi
done
最关键的就是执行判断之后
rsync -av --password-file=/etc/pwd.conf
2
/
t
a
r
g
e
t
/
2/target/
2/target/i.war ruser@$ip::webapps/tomcat/webapps/
上边命令是推复制 本地推到远程的命令执行。
这里可以插一句:在saltstack部署远程环境时候需要在部署tomcat 之后,部署rsync推复制的客户端slave
到服务器下,并且守护进程开启,随时等待手动更新。其配置如下
[root@master rsync_tui_slave]# ls
rsyncd.conf rsyncd.motd rsyncd.secrets rsyncd.sh
[root@master rsync_tui_slave]#
#!/bin/bash
killall rsync > /dev/null
read -p "请输入允许获取数据的IP或者IP网段:" a
read -p "共享目录绝对路径:" b
read -p "请输入密码文件的密码:" c
rm -rf /etc/rsyncd
rm -rf /var/run/rsyncd.pid
cp -r /usr/src/rsyncd/ /etc/
if [ $? -eq 0 ];then
echo "配置文件完成"
mkdir -p "$b"
cd /etc/rsyncd/
sed -i '10s:IP:'$a':' rsyncd.conf
sed -i 's:0:'$c':' rsyncd.secrets
sed -i '13s:B:'$b':' rsyncd.conf #此处以冒号为分隔符,防止与变量b输入的/冲突
if [ $? -eq 0 ];then
echo "配置文件修改成功"
rsync --daemon --config=/etc/rsyncd/rsyncd.conf
lsof -i:873
if [ $? -eq 0 ];then
echo "服务启动成功"
else
echo "服务启动失败,请检查配置文件"
break
fi
else
echo "配置文件修改失败"
fi
else
echo "配置文件复制失败"
fi
#作为推复制时候需要手动改配置文件rsyncd.conf的 read only=no
[root@master rsync_tui_slave]#
所以综上几个脚本,就可以实现自动发版,而且根据不同的项目名称构建CI UAT各种环境。