持续部署:使用Ansible和Docker实施

本文介绍如何使用Ansible(一个配置管理和自动化平台)替代CoreOS,结合Docker实现在Ubuntu上的持续部署。文章详细阐述了Ansible的角色、部署流程,包括蓝绿色部署的实现,并提供了相关部署脚本的GitHub链接。最后,讨论了Docker和容器如何简化部署,以及Ansible在简化配置管理中的作用。
摘要由CSDN通过智能技术生成

本文是“ 持续集成,交付和部署”系列的一部分。

上一篇文章介绍了实现持续部署的几种方法。 具体来说,它描述了如何使用Docker实施应用程序以将应用程序部署为容器,以及使用nginx进行反向代理,以成功利用蓝绿色部署技术。 所有这些都在CoreOS之上运行, CoreOS是专门为运行Docker容器而设计的操作系统。

在本文中,我们将尝试使用Ansible (用于配置和管理计算机的开源平台)执行相同的过程。 我们将使用Ubuntu代替CoreOS。

本文中使用的源代码可以在GitHub repo vfarcic / provisioning (目录为ansible)中找到。

Ansible

ansiblelogo_transparent_web Ansible是用于配置和管理计算机的开源软件平台。 它结合了多节点软件部署,临时任务执行和配置管理。 它通过SSH管理节点。 模块可以处理JSON和标准输出,并且可以用任何编程语言编写。 系统使用YAML表示系统的可重用描述。

与Ansible合作的首选方式是与角色。 它们描述了为设置某些内容而应运行的一组任务。 在我们的案例中,我们将在bdd.yml中描述5个角色。

前四个角色(etcd,confd,docker和nginx)将确保提供蓝绿色部署所需的工具。 例如, Docker角色定义如下:

它使用apt-get,Python PIP和Docker-py安装Docker。 我们需要Docker来管理我们的容器。 Docker-py是Ansible Docker模块所需的Python库,我们将使用它运行nginx容器。

如您所见,Ansible非常易于使用和理解。 只需阅读YML文件,就可以轻松了解发生了什么。 与Puppet和Chef等类似工具相比,简单性是它的主要优势之一。 在简短介绍Ansible之后,我们所要做的就是寻找一个执行所需任务的模块(即易于安装Debian软件包)并将其描述为YML任务。

部署方式

安装完工具后,就该看看最后一个Ansible 角色bdd了 。 这就是部署发生的地方。 但是,在我们继续之前,让我解释一下我开始致力于该目标之前的目标。

部署应遵循蓝绿色技术。 当应用程序运行时,我们将与旧版本并行部署一个新版本。 将要使用的容器已经通过了各种单元和功能测试,使我们有理由相信每个发行版都能正常工作。 但是,我们仍然需要在部署后对其进行测试,以便最终验证我们部署的内容是否正常运行。 一旦所有部署后测试通过,我们就准备将新版本发布给公众。 我们可以通过更改nginx反向代理以将所有请求重定向到新部署的版本来实现。 换句话说,我们应该遵循以下步骤。

  • 拉最新版本的应用程序容器
  • 运行最新的应用程序版本而不停止现有版本
  • 运行部署后测试
  • 通知etcd有关新版本(端口,名称等)的信息
  • 更改nginx配置以指向新版本
  • 停止旧版本

如果执行上述所有操作,则应完成零停机时间。 在任何给定的时刻,我们的应用程序都应该可用。

在上述过程之上,无论是否使用Ansible,部署都应有效。 尽管使用它有很大帮助,但所有基本元素都应位于服务器本身上。 这意味着脚本和配置应该在我们要部署到的计算机上,而不应该在中央服务器上。

bdd角色在后面。

第一项任务是确保存在模板资源bdd.toml 。 confd使用它来指定什么是模板,什么是目标,以及应该执行的命令(在我们的情况下为nginx容器的重启)。

第二项任务是确保confd模板(bdd.conf.tmpl)[https://github.com/vfarcic/provisioning/blob/master/ansible/roles/bdd/files/bdd.conf.tmpl]存在。 每次部署时,此模板与bdd.toml一起都会更改nginx代理以指向新版本。 这样我们就不会中断我们的服务。

第三个任务确保存在部署脚本deploy-bdd.sh ,并且运行最后一个脚本。

从Ansible的角度来看,仅此而已。 真正的“魔术”在于部署脚本本身。 让我们经历一下。

我们从发现我们应该进行蓝色还是绿色部署开始。 如果当前的是蓝色,我们将部署绿色,反之亦然。 有关当前部署的“颜色”的信息存储在etcd项/ bdd / color中。

BLUE_PORT=9001
GREEN_PORT=9002
CURRENT_COLOR=$(etcdctl get /bdd/color)
if [ "$CURRENT_COLOR" = "" ]; then
  CURRENT_COLOR="green"
fi
if [ "$CURRENT_COLOR" = "blue" ]; then
  PORT=$GREEN_PORT
  COLOR="green"
else
  PORT=$BLUE_PORT
  COLOR="blue"
fi

做出决定后,我们将停止并删除现有的容器(如果有的话)。 请记住,当前版本将继续运行,直到最后才受影响。

docker stop bdd-$COLOR
docker rm bdd-$COLOR

现在,我们可以从新版本启动容器,并与现有版本并行运行。 在这种情况下,我们将部署BDD Assistant容器vfarcic / bdd

docker pull vfarcic/bdd
docker run -d --name bdd-$COLOR -p $PORT:9000 vfarcic/bdd

一旦新版本启动并运行,我们就可以运行最后一组测试。 假设所有不需要部署的测试都已经执行。 在使用BDD Assistant的情况下,单元(Scala和JavaScript)和功能测试( BDD场景 )作为Dockerfile中描述的容器构建过程的一部分运行。 换句话说,只有在作为构建过程一部分运行的所有测试通过的情况下,容器才会被推送到存储库。 但是,在部署之前运行测试通常是不够的。 我们应该验证已部署的应用程序是否按预期工作。 在此阶段,我们通常正在运行集成和压力测试。 测试本身也是一个容器,一旦执行完成,容器就会运行并自动删除(参数-rm)。 需要注意的重要一点是,默认情况下,主机上的本地主机是通过172.17.42.1从容器中访问的。

在这种特殊情况下,使用PhantomJS无头浏览器运行一组BDD方案。

docker pull vfarcic/bdd-runner-phantomjs
docker run -t --rm --name bdd-runner-phantomjs vfarcic/bdd-runner-phantomjs 
  --story_path data/stories/tcbdd/stories/storyEditorForm.story 
  --composites_path /opt/bdd/composites/TcBddComposites.groovy 
  -P url=http://172.17.42.1:$PORT -P widthHeight=1024,768

如果所有测试都通过了,我们应该使用etcd存储有关新版本的信息,并运行confd来更新我们的nginx配置。 在此之前,nginx会将所有请求重定向到旧版本。 如果到目前为止,在此过程中没有什么失败,则只有从这一点开始,应用程序的用户才会被重定向到我们刚刚部署的版本。

etcdctl set /bdd/color $COLOR
etcdctl set /bdd/port $PORT
etcdctl set /bdd/$COLOR/port $PORT
etcdctl set /bdd/$COLOR/status running
confd -onetime -backend etcd -node 127.0.0.1:4001

最后,由于我们已经通过nginx反向代理对新版本进行了部署,测试和发布,因此我们准备停止并删除旧版本。

docker stop bdd-$CURRENT_COLOR
etcdctl set /bdd/$CURRENT_COLOR/status stopped

可在GitHub repo vfarcic / provisioning中找到deploy-bdd.sh脚本的源代码。

一起运行

让我们来看看它的作用。 我准备了一个Vagrantfile,它将创建一个Ubuntu虚拟机并运行Ansible剧本,该剧本将安装和配置所有内容,最后部署应用程序。 假设已安装GitVagrantVirtualBox ,请运行以下命令。

git clone https://github.com/vfarcic/provisioning.git
cd provisioning/ansible
vagrant up

第一次运行可能需要一段时间,因为Vagrant和Ansible将需要下载很多内容(操作系统,软件包,容器等)。 请耐心等待,尤其是在带宽较慢的情况下。 好消息是,每次连续运行都会更快。

要模拟新版本的部署,请运行以下命令。

vagrant provision

如果您通过SSH切换到虚拟机,则可以看到正在运行的版本从蓝色(端口9001)变为绿色(端口9002),并且在每次我们运行无用信息调配时都发生了相反的变化。

vagrant ssh
sudo docker ps

在部署之前,之中和之后,该应用程序将不中断(零停机时间)可用。 您可以通过在喜欢的浏览器中打开http:// localhost:8000 /来进行检查。

摘要

如您所见,使用Docker和容器大大简化了部署。 而在更传统的设置中,Ansible需要安装一堆东西(JDK,Web服务器等),并确保正确设置数量不断增加的配置文件,对于容器来说,Ansible的主要作用是使确保已配置操作系统,已安装Docker并正确设置了其他几件事。 换句话说,Ansible将继续发挥作用,而其重要工作部分将通过容器和不可变部署的概念(我们部署的内容不可更改)大大简化。 我们不会使用新版本更新应用程序。 相反,我们正在部署全新的容器并删除旧的容器。

本文使用的所有代码都可以在GitHub repo vfarcic / provisioning内部的ansible目录中找到。

下一篇文章将探讨如何使用其他配置工具执行相同的过程。 我们将探索厨师,木偶和盐。 最后,我们将尝试比较所有四个。 敬请关注!

翻译自: https://www.javacodegeeks.com/2015/01/continuous-deployment-implementation-with-ansible-and-docker.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值