Hexo

利用Git Hooks与rsync集群部署

2018-08-08

博客利用Git Hooks自动部署针对的是Git服务和Web服务部署在同一台服务器的情况,然而在做项目的时候,Git服务器和Web服务器往往会分离,而且Web服务器往往不止一台。这篇文章中将会提供一个使用Git hooks与rsync进行集群自动部署的实例。

rsync

rsync具有可以使本地和远程的两台主机之间的数据快速同步镜像远程备份的功能,这个功能类似ssh带scp的命令。rsync还可以实现删除文件和目录的功能,相当于rm命令。一个rsync相当于scp,rm命令,并且还优于它们每个命令,因为rsync具有增量备份的功能。

系统架构

整个系统架构如下图所示。

2018-08-08 系统架构图

开发者通过Git方式完成代码版本控制,待开发完毕将全部代码push到Git服务器上。然后利用Git服务器的Git hooks中通过rsync同步到Web1服务器和Web2服务器上。Git服务器的搭建以及相关操作参照搭建Git服务器。每台计算机的具体配置如下表所示。

计算机 操作系统 IP地址
开发者 Windows7 192.168.1.101
Git服务器 CentOS7.5 10.0.2.1
Web1服务器 CentOS7.5 10.0.2.2
Web2服务器 CentOS7.5 10.0.2.3

原理与流程

  1. 开发者将最新的代码git push到Git服务器上。
  2. 使用rsync复制到Web1服务器和Web2服务器。由于在copy过程中,从开发代码到生产代码其中必然有一些微小的变化,比如数据库配置等信息是不需要变更的,文件的所属和权限有变化。基于这个需求,设计由开发者提交一个shell脚本deploy.sh。
  3. Git服务器在Git hooks里面编写脚本post-update来调用deploy.sh。当然post-update在调用deploy.sh前后需要进行一些基本的现场搭建和清理工作。

另外Git服务器、Web1服务器和Web1服务器都需要安装rsync。Web1服务器和Web2服务器上的rsync以服务端模式工作,配置开机自启动,文件推送时需要认证。Git服务器上的rsync则以客户端模式工作。

rsync安装

一般,CentOS操作系统都会安装rsync,可通过下列命令查看rsync的版本信息。

1
rsync --version

这里需要安装rsync3.1.0以上版本,以支持推送端设置目的端的用户所属功能。操作系统为CentOS7.5的计算机所安装的rsync版本是3.1.2,符合要求。

使用下列命令查询rsync的安装路径,默认安装在/usr/bin/rsync.

1
which rsync

rsync服务器端配置

以web1服务器为例对rsync服务器端进行配置。以下操作以root权限进行。

编辑/etc/rsyncd.conf文件,内容如下。

#基本配置
read only = no
list= yes
uid = root
gid = root
max connections = 4
hosts allow = 10.0.2.1 #只接受指定客户端的访问
use chroot = no
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
ignore errors = yes
timeout = 300
#配置一个模块,模块名web是随意起的,客户端在发起同步时需指定模块名
[web]
path = 写Web站点目录
#客户端推送时必须指定访问的用户为rsync,这个用户是虚拟的,不需要实际创建
auth users = rsync
#设置密码文件位置,这里保存了rsync用户的密码
secrets file = /etc/rsyncd.password

配置文件的说明在注释里面说明,不再累述。

使用如下命令设置该文件的权限为600。

1
chmod 600 /etc/rsyncd.conf

编辑/etc/rsyncd.password密码文件,必须设置为600权限。这个文件是被上面的配置文件中指定使用的。文件的格式为username:password,即如下所示。

rsync:123456

测试启动rsync。

1
rsync --daemon --config=/etc/rsyncd.conf

rsync服务在linux中是由xinetd来托管的。xinetd是一个服务管理器,负责管理一些轻量级的,非独立的服务,比如启动,端口映射,调度这些服务。一般的CentOS操作系统都会安装xinetd。

为了设置rsync的随机启动,首先需要设置xinetd,使它启用rsync,然后启动xinetd进程。最后设置chkconfig xinetd on保证开机同时启动。

在CentOS7中,默认不存在文件/etc/xinetd.d/rsync。所以需要使用下面的命令进行创建。

1
vim /etc/xinetd.d/rsync

然后加入以下内容。

service rsync
{
    disable = no
    flags           = IPv6
    socket_type     = stream
    wait            = no
    user            = root
    server          = /usr/bin/rsync #rsync的安装路径
    server_args     = --daemon
    log_on_failure  += USERID
}

注意把disable和server配置正确了。Web2服务器的配置如上所述。

rsync客户端配置

编写密码文件

由于服务端设置了认证才能推送,所以客户端需要编写密码文件,并提前放在一个地方,方便rsync命令调用.假设密码放在/home/git/rsyncd.password文件,同样的这个文件必须为600权限,然后写入如下内容即可。

123456

和服务器端不同的是,这里只填写密码

编写Git hooks脚本

在Git服务器中找到的Web项目对应的仓库(以/path/to/test.git为例),并使用如下命令在其hooks目录下编写post-update脚本。

1
2
cp /path/to/test.git/hooks/post-update.sample /path/to/test.git/hooks/post-update
vim /path/to/test.git/hooks/post-update

对该文件的其它代码进行注释,然后追加以下内容。

GIT_REPO=$HOME/repositories/test.git
TMP_GIT_CLONE=$HOME/tmp/api-test

mkdir -p $TMP_GIT_CLONE
#从本机clone仓库到临时目录
git clone $GIT_REPO $TMP_GIT_CLONE
#进入到临时目录,并执行其中的deploy.sh
cd $TMP_GIT_CLONE && chmod +x deploy.sh && ./deploy.sh
echo 'deploying complete.'
#删除临时目录
rm -rf $TMP_GIT_CLONE

脚本很简单,就是将仓库clone到临时目录,并执行其中的deploy.sh脚本。所以rsync命令应该写在deploy.sh中,并随源码提交。需要注意的是,执行脚本的用户为git服务器上的git用户,权限相对不大。

编写集群部署脚本

在开发者的网站代码的根目录创建一个deploy.sh文件,其中编写rsync同步代码和其他相关代码,下面是例子:

#!/bin/bash

# current dir is the same as this script
# current user is git
# make sure /home/git/rsync.passwd is exist and has 600 permission ( for the rsync password )
# need rsync 3.1.0+ support also server should be 3.1.0+ 

rm -rf .git
rsync -av ./ rsync@10.0.2.2::web --chown=www:www --password-file=/home/git/rsyncd.password --exclude=deploy.sh
rsync -av ./ rsync@10.0.2.3::web --chown=www:www --password-file=/home/git/rsyncd.password --exclude=deploy.sh

注意脚本中的rsync调用:

-av表示归档模式和显示过程,可递归同步。

./ 本地的目录,将当前目录的所有文件作为源,如果不加最后的斜杠,会在目标目录创建一个目录。

rsync@10.0.2.2::web 表示以rsync用户,上传到服务器的web模块,web模块事先在服务端中配置好了。rsync@10.0.2.3::web则同理。如果系统架构不止两台Web服务器,参照上述内容依样画葫芦即可。

–chown=www:www 这就是rsync3.1.0版本以上才有的新功能,可以指定目标文件以username:group的所属组存在。这里取决于web服务器的web服务是以什么用户启动的。

–password-file 指定密码文件,提前在git服务器上放置好
–exclude 排除某些文件不同步

开发者

开发者通过Git Bash在本地对远程仓库进行增加或删除修改操作,接着执行git push相关命令之后,便可完成代码的自动部署。关于Git Bash的相关内容可查看使用Hexo-Vexo搭建个人博客的安装git节。

参考资料

1.利用rsync实现自动化部署的一种方案
2.githook+rsync简单实现web部署
3.Git版本控制,rsync同步文件,完成线上部署
5.Rsync服务器的安装与配置详解
6.centos7安装rsync
7.rsync如何加入启动项?