我的组织的网站是在前端WebServers上运行的Django应用程序+ AWS中的一些背景处理服务器。

我们目前为两者使用ASSIble:

  • 系统配置(来自裸os图像)
  • 频繁手动触发的代码部署。

相同的ansible playbook能够从头开始提供本地VAGRANT DEV VM,或生产EC2实例。

我们现在想要在EC2中实现自动阶段,这需要对A “进行一些更改服务器作为牛,不是宠物“哲学。

第一个先决条件是从静态管理的ANSIBE清单移动到动态,EC2基于API的一个,完成。

下一个大问题是如何在这个新世界中部署,其中一次性的实例在半夜上升和下降。我可以想到的选项是:

  1. 烘焙新的全部部署的AMI,每个部署,创建一个新的作为启动配置,并将其更新为组。听起来非常非常繁琐,也是非常可靠的,因为清洁的板岩方法,并确保任何系统改变代码需要在这里。此外,实例启动不需要额外的步骤,逐渐快速运行。
  2. 使用基础AMI 不会经常更改,自动从GIT上获取最新的应用程序代码,启动WebServer。一旦起来,就像之前一样,根据需要进行手动部署。但是,如果新代码取决于系统配置(新包,权限等)的更改,该怎么办?看起来您必须开始在代码版本和系统/ AMI版本之间处理依赖关系,而“只做完整的Ansible Run”方法更加集成且更可靠。它不仅仅是练习的潜在头痛吗?
  3. 使用docker?我有一个强壮的亨希,它可能有用,但我不确定它如何适应我们的照片。我们是一个相对独立的Django前端应用程序,只有rabbitmq + memcache作为服务,我们永远不会在同一主机上运行。那么,使用包含系统包+最新代码的Ansibe构建Docker图像,而不是在EC2实例上直接执行它
  4. 你是怎么做到的?任何见解/最佳实践? 谢谢!

有帮助吗?

解决方案

这个问题是非常意见的。但只是为了给你我的手,我刚刚用Ansible捕获AMI,然后使用CloudFormation通过自动播放,监控和预烘烤的Amis部署您的堆栈。这样做的优点是,如果您拥有预先烘焙到AMI自动播放的大多数应用程序堆栈,则会更快地发生UP

Docker是另一种方法,但在我看来,如果您已经使用EC2,您可能不需要在应用程序中添加额外的图层。如果您认为想要在单个服务器中包含Containize,Docker可以非常有用。也许您在服务器中有一些额外的容量,Docker将允许您在同一服务器上运行该额外应用而不干扰现有服务器。

表示,有些人发现Docker不用于优化单个服务器中的资源,而是以一种方式优化,而是允许您在容器中预释放您的应用程序的方式。因此,当您部署新版本或新代码时,您必须要做的就是在服务器上复制/复制这些Docker容器,然后停止旧的容器版本并启动新的容器版本。

我的两美分。

其他提示

混合溶液可以给您所需的结果。将头部Docker映像存储在S3中,用简单的获取预订AMI并在开始时运行脚本(或通过用户数据将其传递给库存AMI)。通过将头部图像移动到最新的稳定版本,您可以通过使获取脚本智能扫描到最新的稳定版本来实现新版本的测试堆栈,以便根据实例启动可配置的实例标记来识别要获取的Docker版本。

You can also use AWS CodeDeploy with AutoScaling and your build server. We use CodeDeploy plugin for Jenkins.

This setup allows you to:

  1. perform your build in Jenkins
  2. upload to S3 bucket
  3. deploy to all the EC2s one by one which are part of the assigned AWS Auto-Scaling group.

All that with a push of a button!

Here is the AWS tutorial: Deploy an Application to an Auto Scaling Group Using AWS CodeDeploy

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top