利用Git Hooks与rsync集群部署

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

rsync

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

系统架构

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

系统架构图.jpg

开发者通过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的版本信息。

rsync --version

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

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

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。

chmod 600 /etc/rsyncd.conf

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

rsync:123456

测试启动rsync。

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

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

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

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

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脚本。

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如何加入启动项?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,629评论 18 139
  • 一、什么是rsync rsync是一款开源,快速,多功能的可实现增量的本地或远程的数据镜像同步备份的优秀工具。适用...
    逗比punk阅读 2,416评论 0 1
  • 配置前提: 1台开发电脑,我本地是windows10,(主要用来提交开发的网站代码) 1台git服务器,已安装好g...
    xiaomalover阅读 901评论 0 0
  • git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git b...
    猿万阅读 5,046评论 1 45
  • 今天我和室友三个人去看了西游,十三块钱的票价也是感人。九点半开始十一点结束,现在十二点,来说说我的感受。看之前有几...
    大春兄弟阅读 1,231评论 0 0