<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DevOps技术分享 &#187; gitlab</title>
	<atom:link href="http://www.showerlee.com/archives/tag/gitlab/feed" rel="self" type="application/rss+xml" />
	<link>http://www.showerlee.com</link>
	<description>与你共同学习运维开发</description>
	<lastBuildDate>Mon, 19 Oct 2020 05:51:41 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6</generator>
		<item>
		<title>Jenkins+Ansible+Gitlab自动化部署三剑客</title>
		<link>http://www.showerlee.com/archives/1880</link>
		<comments>http://www.showerlee.com/archives/1880#comments</comments>
		<pubDate>Fri, 11 Mar 2016 05:00:47 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Ansible]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[gitlab]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1880</guid>
		<description><![CDATA[最近一直在学习Ansible的一些playbook的写法, 所以一直没有怎么更新, 想到目前大家对诸如salt [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	
</p>
<p>
	最近一直在学习<a href="http://www.showerlee.com/archives/tag/ansible" title="查看Ansible中的全部文章" class="tag_link">Ansible</a>的一些playbook的写法, 所以一直没有怎么更新, 想到目前大家对诸如saltstack, docker, <a href="http://www.showerlee.com/archives/tag/ansible" title="查看Ansible中的全部文章" class="tag_link">Ansible</a>等自动化部署相关的工具很感兴趣, 但又苦于没有可学习的中文实例, 这里我就把我这几个月所接触到目前国外比较流行的部署经验给大家分享一下.
</p>
<p>
	<span style="line-height:1.5;">首先给大家介绍的是Ansible, 恩, 重要的问题说三遍, 不是Saltstack, Ansible作为一个python写的自动化部署工具, 确实较之前我所接触的Chef, saltstack, puppet更有自己的一些优势, 首先就是agentless, 无需在Linux client安装任何服务即可无缝连接Linux default ssh端口进行部署(windows需要安装winrm 开启ssh服务), 这点其实我觉得非常重要, 可以想象很多公司本身是对network管理非常严格的, 在部署一个产品的同时你需要考虑很多时间成本, 使用其他部署工具本身非常棘手的问题就是去申请开端口, client量少的话, 我们可以去等, 多的话本身你去request, waiting, unblock port等等long long process.... 最后会耗费很长时间. 这个对很多产品本身就是很致命的. 不推荐Saltstack的原因也是因为其需要在每台agent逐一去安装client service并测试, 这本身就会耗费一些时间成本.</span>
</p>
<p>
	<span style="line-height:1.5;">其他呢? 其实我觉得就是容易上手, 语法简单, 有现成模板让你去学习, 加之是我们非常喜爱的python语法, why not?</span>
</p>
<p>
	<span style="line-height:1.5;">Jenkins不用我多说, 估计懂行的人都在用它, 开源, 轻量级, 兼容性和扩展性强, 直观的GUI管理这都是它的优势, 配合Ansible我觉得用起来会非常easy going.</span>
</p>
<p>
	<span style="line-height:1.5;">最后提一下Gitlab, 为什么要用Gitlab? 他作为一个代码版本控制系统和部署有什么关系呢? 其实这里就涉及一个我们Ansible playbook管理问题, 试想我们需要维护一个公司庞大的server集群, 我们所有需要部署的机器或者产品会对应我们相对的部署脚本, 我们使用的Ansible playbook如果只是保存在Ansible Server的具体某个目录, 这本身就不便于我们进行编写维护更新(想想每次都跑到远程去编写playbook或者每次在本地编写好后再upload到远程我都会脑补数以万计的草泥马从我眼前呼啸而来).</span>
</p>
<p>
	<span style="line-height:1.5;">这里Gitlab就给我们提供一个非常方便以及直观的Playbook management. 我们需要做的其实就是在Gitlab去建立一个对应产品或者server的playbook仓库, 然后我们在本地写好后直接commit到这个仓库, 最后在部署的时候, 去让Jenkins pull这个playbook到其workspace, 并作为一个Job去run这个playbook, 这样是不是很规范, 而且便于管理?</span>
</p>
<p>
	<span style="line-height:1.5;">当然Ansible本身企业版Tower也会提供一个类似管理并维护playbook以及监控ansible本身running process的GUI管理系统, 用起来也很不错, 但作为收费版本, 我们在这里就不做过多阐述了.</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">这里我推荐Jenkins和Ansible可以安装到同一个环境作为部署server, Gitlab作为版本控制系统可单独部署在另一台server.</span>
</p>
<p>
	<span style="color:#E53333;">总结:</span>
</p>
<p>
	<span style="color:#E53333;">Jenkins首先从Gitlab去抓取我们写好的具体产品的playbook, 并使用virtualenv下的Ansible相关命令, 保证我们在一个clean的环境下使用stable version去批量部署我们的产品到远程client.</span>
</p>
<p>
	
</p>
<p>
	<span style="color:#E53333;font-size:16px;">Let's go.....</span>
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;">一. 安装环境</span>
</p>
<p>
	System: CentOS 6.7 x64 (deploy.example.com)
</p>
<p>
	Jenkins:&nbsp;Jenkins ver. 1.650
</p>
<p>
	Ansible: Ansible 2.1.0
</p>
<p>
	Gitlab:&nbsp;GitLab 7.14.3
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;">二. Jenkins配置</span>
</p>
<p>
	我们创建deploy用户作为jenkins_user, workspace为deploy家目录下的jenkins目录.
</p>
<p>
	# su - root
</p>
<p>
	# adduser deploy
</p>
<p>
	# wget -O /etc/yum.repos.d/jenkins.repo <a href="http://pkg.jenkins-ci.org/redhat/jenkins.repo" rel="nofollow">http://pkg.jenkins-ci.org/redhat/jenkins.repo</a>
</p>
<p>
	<span style="line-height:1.5;"># rpm --import <a href="https://jenkins-ci.org/redhat/jenkins-ci.org.key" rel="nofollow">https://jenkins-ci.org/redhat/jenkins-ci.org.key</a></span>
</p>
<p>
	<span style="line-height:1.5;"># yum install jenkins -y</span>
</p>
<p>
	<span style="line-height:1.5;"># vi&nbsp;/etc/sysconfig/jenkins</span>
</p>
<p>
	<span style="line-height:1.5;"> </span>
</p>
<pre class="prettyprint lang-bsh">...
JENKINS_HOME="/home/deploy/jenkins"
JENKINS_USER="deploy"
...</pre>
<p>
	# service jenkins start
</p>
<p>
	浏览器访问Jenkins页面
</p>
<p><a href="http://deploy.example.com:8080" rel="nofollow">http://deploy.example.com:8080</a></p>
<p>
	安装完成, 以下是我已经配置好的一些Jenkins&nbsp;Job.
</p>
<p>
	<span style="line-height:1.5;"></span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-0.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-0-1024x338.png" alt="QQ20160311-0" width="1024" height="338" class="alignnone size-large wp-image-1884" /></a>
</p>
<p>
	这里我们使用一个国内PHP网站模板phpcms作为我们需要部署的产品进行本次范例演示, 在进行最终的Build前我们需要做一些准备工作, 稍后我们会回到这个界面.
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;">三. Ansible配置</span>
</p>
<p>
	这里我们需要配置virtualenv去隔离我们ansible的发行版本为最新版本2.1.0, 默认pip或者yum安装的1.9版本因为BUG以及对windows不兼容的原因, 这里不推荐使用.
</p>
<p>
	配置步骤传送门:&nbsp;<a href="http://www.showerlee.com/archives/1862" target="_blank">http://www.showerlee.com/archives/1862</a>
</p>
<p>
	Ansible-playbook范例传送门:&nbsp;<a href="http://www.showerlee.com/archives/1649" target="_blank">http://www.showerlee.com/archives/1649</a>
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;">四. Gitlab配置</span>
</p>
<p>
	部署并使用传送门:&nbsp;<a href="http://www.showerlee.com/archives/1285" target="_blank">http://www.showerlee.com/archives/1285</a>
</p>
<p>
	我们最终会创建一个ansible playbook仓库&nbsp;git@git.example.cn:showerlee/Ansible-showerlee.git, 并在本地编写好我们的规则, 最终commit到这个仓库, 以便Jenkins去调用我们的部署<span style="line-height:1.5;">规则.</span>
</p>
<p>
	<span style="color:#E53333;">这里博主单独clone出来一份部署phpcms的playbook仓库</span><span style="color:#E53333;">, 算是给大家的福利:</span>
</p>
<p>
	<a href="https://git.showerlee.com/showerlee/leon-playbook-phpcms1.1" target="_blank"><span style="color:#E53333;"><a href="https://git.showerlee.com/showerlee/leon-playbook-phpcms1.1" rel="nofollow">https://git.showerlee.com/showerlee/leon-playbook-phpcms1.1</a></span><span style="color:#E53333;"></span></a>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-2.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-2-1024x500.png" alt="" width="800" height="391" class="alignnone size-large wp-image-1885" title="" align="" /></a>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-3.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-3-1024x250.png" alt="" width="800" height="195" class="alignnone size-large wp-image-1886" title="" align="" /></a>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-4.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-4-1024x274.png" alt="" width="800" height="214" class="alignnone size-large wp-image-1887" title="" align="" /></a>
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;">五.最终部署</span>
</p>
<p>
	<span style="color:#337FE5;font-size:14px;">准备工作完毕, 我们接下来给大家介绍Jenkins Job配置.</span>
</p>
<p>
	<span style="color:#337FE5;font-size:14px;">1.创建一个new item</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-5.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-5.png" alt="QQ20160311-5" width="354" height="313" class="alignnone size-full wp-image-1888" /></a>
</p>
<p>
	<span style="color:#337FE5;font-size:14px;">2. 创建一个freestyle Job, 命名规则"产品名-环境", 这里我们为Phpcms-Dev</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-6.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-6-1024x306.png" alt="" width="800" height="239" class="alignnone size-large wp-image-1889" title="" align="" /></a>
</p>
<p>
	<span style="color:#337FE5;font-size:14px;">3. Job配置</span>
</p>
<p>
	<span style="color:#337FE5;">1). 定制Build参数.</span>
</p>
<p>
	这里Dynamic Choice Parameter用来通过Groovy脚本来抓取这个git仓库的所有branch, 并作为一个多选项, 方便我们在最终Build前去选择我们需要的这个产品Branch分支.
</p>
<p>
	Groovy抓取Git branch代码:
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">def gettags = ("git ls-remote -h <a href="mailto:git@git.showerlee.com">git@git.showerlee.com</a>:showerlee/phpcms.git").execute()  
gettags.text.readLines().collect { it.split()[1].replaceAll('refs/heads/', '')  }.unique() </pre>
<p>
	
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-11.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-11-1024x425.png" alt="" width="800" height="332" class="alignnone size-large wp-image-1895" title="" align="" /></a>
</p>
<p>
	Choice Parameter也是用来给我们Job定制Build前的可选参数, 不过这里的参数可以直接写死
</p>
<p>
	deploy_environment为我们的参数名, 定义我们的部署环境名,&nbsp;prod, qa为我们具体的可选项, 定义我们产品的两个环境.
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-8.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-8-1024x427.png" alt="" width="800" height="334" class="alignnone size-large wp-image-1892" title="" align="" /></a><span style="color:#337FE5;">2). 源代码管理</span>
</p>
<p>
	我们可以利用Jenkins内置的Source Code Management工具去抓取远程Git或者SVN仓库的代码到本地, 这里我们抓取存放在我们Gitlab上的Playbook到Jenkins的workspace目录, 用来进行后续部署工作, 这个仓库如需认证,&nbsp;我们可以在Credentials add这个仓库的用户账号密码, 其余均保持默认即可(默认Jenkins default不支持Git, 需要到其后台安装Git插件)
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-9.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-9-1024x557.png" alt="" width="800" height="435" class="alignnone size-large wp-image-1894" title="" align="" /></a>
</p>
<p>
	<span style="color:#337FE5;">3). Execute shell进行最终的CLI部署.</span>
</p>
<p>
	这个Build模块下的Execute shell方法是Jenkins比较常用并非常核心的功能, 用来执行我们部署过程中核心的命令.
</p>
<p>
	开头和结尾的set +x,&nbsp;set&nbsp;-x用来关闭和打开该部分的扩展参数及命令
</p>
<p>
	<span>开启virtualenv和加载ansible环境变量</span>
</p>
<pre class="prettyprint"># source /home/deploy/.virtualenv/bin/activate
# . /home/deploy/.virtualenv/ansible/hacking/env-setup -q</pre>
<p>
	<span>进入该Job的workspace目录下保存该playbook的仓库子目录下, 检查ansible版本, 并执行最终的部署命令.</span>
</p>
<pre class="prettyprint lang-bsh">cd $WORKSPACE/leon-playbook-phpcms1.1
ansible --version
ansible-playbook -i inventory/$deploy_environment ./deploy.yml -e project=phpcms -e branch=$branch_selector -e env=$deploy_environment</pre>
<p><span style="color:#E53333;">注: -i&nbsp;用来自定义ansible host文件路径, ./deploy.yml为ansible-playbook入口文件, -e 后可跟给当前session添加的环境变量.</span> </p>
<p>
	<span style="color:#E53333;">这里</span><span style="color:#E53333;">$deploy_environment</span> <span style="color:#E53333;">$branch_selector 为该Job定义好的可选参数, 详见3-1)</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-10.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-10-1024x266.png" alt="" width="800" height="208" class="alignnone size-large wp-image-1891" title="" align="" /></a>
</p>
<p>
	
</p>
<p>
	配置完毕后, save保存.
</p>
<p>
	<span style="color:#337FE5;font-size:14px;">4. 执行Job.</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-12.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-12-1024x336.png" alt="" width="800" height="263" class="alignnone size-large wp-image-1897" title="" align="" /></a>
</p>
<p>
	选择master分支和prod环境
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-13.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-13.png" alt="QQ20160311-13" width="859" height="302" class="alignnone size-full wp-image-1898" /></a>
</p>
<p>
	
</p>
<p>
	查看该Job最终的console output, 也就是显示我们实际在CLI下的输出结果.
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-14.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-14.png" alt="QQ20160311-14" width="347" height="684" class="alignnone size-full wp-image-1899" /></a>
</p>
<p>
	
</p>
<h1 class="build-caption page-headline" style="color:#333333;font-family:Helvetica, Arial, sans-serif;">
	Console Output<br />
</h1>
<pre class="prettyprint lang-bsh">Started by user Leon Li
Building in workspace /home/deploy/jenkins/workspace/Phpcms-Dev
 &gt; git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 &gt; git config remote.origin.url <a href="mailto:git@git.showerlee.com">git@git.showerlee.com</a>:showerlee/Ansible-showerlee.git # timeout=10
Fetching upstream changes from <a href="mailto:git@git.showerlee.com">git@git.showerlee.com</a>:showerlee/Ansible-showerlee.git
 &gt; git --version # timeout=10
 &gt; git fetch --tags --progress <a href="mailto:git@git.showerlee.com">git@git.showerlee.com</a>:showerlee/Ansible-showerlee.git +refs/heads/*:refs/remotes/origin/*
 &gt; git rev-parse refs/remotes/origin/master^{commit} # timeout=10
 &gt; git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 6bf787dcad68219d8eee09cecb83cbca36edbef1 (refs/remotes/origin/master)
 &gt; git config core.sparsecheckout # timeout=10
 &gt; git checkout -f 6bf787dcad68219d8eee09cecb83cbca36edbef1
 &gt; git rev-list 6bf787dcad68219d8eee09cecb83cbca36edbef1 # timeout=10
[Phpcms-Dev] $ /bin/sh -xe /tmp/hudson7452069223867148990.sh
+ set +x
ansible 2.1.0 (devel 6ddea3e915) last updated 2016/02/16 16:13:32 (GMT +800)
  lib/ansible/modules/core: (detached HEAD 8d126bd877) last updated 2016/02/16 16:19:09 (GMT +800)
  lib/ansible/modules/extras: (detached HEAD f6c5ed987f) last updated 2016/02/16 16:19:40 (GMT +800)
  config file = /home/deploy/jenkins/workspace/Phpcms-Dev/leon-playbook-phpcms1.1/ansible.cfg
  configured module search path = /home/deploy/active-ansible-modules/

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [127.0.0.1]

TASK [deploy : Backup current source code] *************************************
changed: [127.0.0.1]

cmd: mv /data/deploy_dir/phpcms /data/deploy_dir/phpcms_master_1457681152

start: 2016-03-11 15:25:54.774716

end: 2016-03-11 15:25:54.927415

delta: 0:00:00.152699

TASK [deploy : Get new source code] ********************************************
changed: [127.0.0.1]

TASK [deploy : Check if caches/configs/database.php exists] ********************
ok: [127.0.0.1]

TASK [deploy : Check if test_dir exists] ***************************************
ok: [127.0.0.1]

TASK [deploy : debug] **********************************************************
ok: [127.0.0.1] =&gt; {
    "msg": "/data/deploy_dir/phpcms_master_1457681152/caches/configs/database.php exists"
}

msg: /data/deploy_dir/phpcms_master_1457681152/caches/configs/database.php exists

TASK [deploy : debug] **********************************************************
ok: [127.0.0.1] =&gt; {
    "msg": "/data/deploy_dir/phpcms_master_1457681152/test_dir exists"
}

msg: /data/deploy_dir/phpcms_master_1457681152/test_dir exists

TASK [deploy : Copy remote necessary original config to new release when Product env] ***
changed: [127.0.0.1] =&gt; (item={u'name': u'db_config', u'dir': u'caches/configs/database.php'})
changed: [127.0.0.1] =&gt; (item={u'name': u'version_config', u'dir': u'caches/configs/version.php'})

msg: All items completed

results: [
  {
    "src": "/data/deploy_dir/phpcms_master_1457681152/caches/configs/database.php", 
    "changed": true, 
    "group": "deploy", 
    "uid": 606, 
    "dest": "/data/deploy_dir/phpcms/caches/configs/database.php", 
    "checksum": "91869c2faa244f8c5de8a586636c6b4f3c0a2817", 
    "md5sum": "fd88a78a4629bca012a79d22fdcecadd", 
    "owner": "deploy", 
    "_ansible_no_log": false, 
    "item": {
      "name": "db_config", 
      "dir": "caches/configs/database.php"
    }, 
    "state": "file", 
    "gid": 608, 
    "mode": "0644", 
    "invocation": {
      "module_args": {
        "src": "/data/deploy_dir/phpcms_master_1457681152/caches/configs/database.php", 
        "directory_mode": null, 
        "force": true, 
        "remote_src": true, 
        "dest": "/data/deploy_dir/phpcms/caches/configs/database.php", 
        "selevel": null, 
        "seuser": null, 
        "setype": null, 
        "group": null, 
        "content": null, 
        "serole": null, 
        "original_basename": null, 
        "delimiter": null, 
        "mode": "0644", 
        "regexp": null, 
        "owner": null, 
        "follow": false, 
        "validate": null, 
        "backup": false
      }
    }, 
    "size": 302
  }, 
  {
    "src": "/data/deploy_dir/phpcms_master_1457681152/caches/configs/version.php", 
    "changed": true, 
    "group": "deploy", 
    "uid": 606, 
    "dest": "/data/deploy_dir/phpcms/caches/configs/version.php", 
    "checksum": "d0eaedb46a36303eb3f3e2a77cc2a623062eff3c", 
    "md5sum": "7917d8199b7c6d5bc87ff3035a72670e", 
    "owner": "deploy", 
    "_ansible_no_log": false, 
    "item": {
      "name": "version_config", 
      "dir": "caches/configs/version.php"
    }, 
    "state": "file", 
    "gid": 608, 
    "mode": "0644", 
    "invocation": {
      "module_args": {
        "src": "/data/deploy_dir/phpcms_master_1457681152/caches/configs/version.php", 
        "directory_mode": null, 
        "force": true, 
        "remote_src": true, 
        "dest": "/data/deploy_dir/phpcms/caches/configs/version.php", 
        "selevel": null, 
        "seuser": null, 
        "setype": null, 
        "group": null, 
        "content": null, 
        "serole": null, 
        "original_basename": null, 
        "delimiter": null, 
        "mode": "0644", 
        "regexp": null, 
        "owner": null, 
        "follow": false, 
        "validate": null, 
        "backup": false
      }
    }, 
    "size": 127
  }
]

TASK [deploy : Copy dir test_dir to new release when Product env] **************
changed: [127.0.0.1]

cmd: cp -a /data/deploy_dir/phpcms_master_1457681152/test_dir /data/deploy_dir/phpcms/

start: 2016-03-11 15:26:16.966237

end: 2016-03-11 15:26:17.069705

delta: 0:00:00.103468

TASK [deploy : Get php version] ************************************************
changed: [127.0.0.1 -&gt; localhost]

cmd: python /home/deploy/jenkins/workspace/Phpcms-Dev/leon-playbook-phpcms1.1/roles/deploy/files/get_php_version.py <a href="http://www.showerlee.com" rel="nofollow">http://www.showerlee.com</a>

start: 2016-03-11 15:26:17.468311

end: 2016-03-11 15:26:51.560313

delta: 0:00:34.092002

stdout: PHP/5.4.13

TASK [deploy : debug] **********************************************************
ok: [127.0.0.1] =&gt; {
    "msg": {
        "changed": true, 
        "cmd": "python /home/deploy/jenkins/workspace/Phpcms-Dev/leon-playbook-phpcms1.1/roles/deploy/files/get_php_version.py <a href="http://www.showerlee.com" rel="nofollow">http://www.showerlee.com</a>", 
        "delta": "0:00:34.092002", 
        "end": "2016-03-11 15:26:51.560313", 
        "rc": 0, 
        "start": "2016-03-11 15:26:17.468311", 
        "stderr": "", 
        "stdout": "PHP/5.4.13", 
        "stdout_lines": [
            "PHP/5.4.13"
        ], 
        "warnings": []
    }
}

msg: {
  "changed": true, 
  "end": "2016-03-11 15:26:51.560313", 
  "stdout": "PHP/5.4.13", 
  "cmd": "python /home/deploy/jenkins/workspace/Phpcms-Dev/leon-playbook-phpcms1.1/roles/deploy/files/get_php_version.py <a href="http://www.showerlee.com" rel="nofollow">http://www.showerlee.com</a>", 
  "start": "2016-03-11 15:26:17.468311", 
  "delta": "0:00:34.092002", 
  "stderr": "", 
  "rc": 0, 
  "stdout_lines": [
    "PHP/5.4.13"
  ], 
  "warnings": []
}

TASK [deploy : debug] **********************************************************
ok: [127.0.0.1] =&gt; {
    "msg": "PHP/5.4.13"
}

msg: PHP/5.4.13

PLAY RECAP *********************************************************************
127.0.0.1                  : ok=12   changed=5    unreachable=0    failed=0   

Finished: SUCCESS</pre>
<p>
	
</p>
<p>
	这样我们就利用Jenkins+Ansible+Gitlab, 成功部署phpcms到远程Client.</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1880">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="Jenkins+Ansible+Gitlab自动化部署三剑客" href="http://www.showerlee.com/archives/1880">http://www.showerlee.com/archives/1880</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1880/feed</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
	</channel>
</rss>
