持续部署&使用Ansible(+ Docker?)进行AWS自动扩展

时间:2014-04-14 09:10:39

标签: amazon-ec2 docker ansible continuous-deployment autoscaling

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

我们目前正在使用Ansible:

  • 系统配置(来自裸OS映像)
  • 经常手动触发的代码部署。

同样的Ansible playbook能够从头开始配置本地Vagrant dev VM或生产EC2实例。

我们现在想在EC2中实现自动缩放,这需要对"treat servers as cattle, not pets"哲学进行一些更改。

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

下一个重要问题是如何在这个新世界中进行部署,其中一次性实例出现了。在半夜。我能想到的选择是:

  1. 为每个部署烘焙新的完全部署的AMI ,创建新的AS Launch配置并使用该更新AS组。听起来非常非常麻烦,但由于采用了清晰的平板方法,因此也非常可靠,并且将确保任何系统更改代码所需的将在此处。此外,在实例启动时不需要额外的步骤,所以up&跑得更快。
  2. 使用不经常更改的基础AMI ,在启动时自动从git获取最新的应用代码,启动网络服务器。一旦它完成,就像以前一样根据需要进行手动部署。但是如果新代码依赖于系统配置的更改(新包,权限等)呢?看起来你必须开始处理代码版本和系统/ AMI版本之间的依赖关系,而"只是做一个完整的ansible运行"方法更集成,更可靠。这不仅仅是实践中潜在的头痛吗?
  3. 使用Docker?我有一个强大的预感它可能有用,但我还不确定它是如何适合我们的图片。我们是一个相对独立的Django前端应用程序,只有RabbitMQ + memcache作为服务,我们永远不会在同一台主机上运行。那么使用包含系统包+最新代码的Ansible构建Docker镜像有什么好处,而不是让Ansible直接在EC2实例上进行?
  4. 你是怎么做到的?任何见解/最佳实践? 谢谢!

3 个答案:

答案 0 :(得分:9)

这个问题非常基于意见。但是为了给你我的看法,我只想用Ansible预先安装AMI,然后使用CloudFormation通过Autoscaling,Monitoring和预先制作的AMI来部署你的堆栈。这样做的好处是,如果您将大部分应用程序堆栈预先烘焙到AMI中,则自动缩放UP将更快地发生。

Docker是另一种方法,但在我看来,它在您的应用程序中添加了一个额外的层,如果您已经在使用EC2,则可能不需要该层。如果您想在单个服务器中进行容器化,Docker可能非常有用。也许你在服务器上有一些额外的容量,而Docker将允许你在同一台服务器上运行那个额外的应用程序而不会干扰现有的应用程序。

说过有些人发现Docker不是以某种方式优化单个服务器中的资源,而是以某种方式允许您在容器中预先烘焙应用程序。因此,当您部署新版本或新代码时,您只需要在服务器上复制/复制这些docker容器,然后停止旧容器版本并启动新容器版本。

我的两分钱。

答案 1 :(得分:1)

混合解决方案可以为您提供所需的结果。将头码头图像存储在S3中,在启动时使用简单的提取和运行脚本预先烘烤AMI(或将其传递到具有用户数据的库存AMI)。通过将头部图像移动到最新的稳定版本进行版本控制,您还可以通过使fetch脚本足够智能来基于可在实例启动时配置的实例标记来识别要获取的docker版本,从而实现新版本的测试堆栈。

答案 2 :(得分:0)

您还可以将AWS CodeDeploy与AutoScaling和构建服务器一起使用。我们为Jenkins使用CodeDeploy插件。

此设置允许您:

  1. 在Jenkins执行您的构建
  2. 上传到S3存储桶
  3. 逐个部署到所有EC2,这些EC2是指定的AWS Auto-Scaling组的一部分。
  4. 只需按一下按钮即可!

    以下是AWS教程:Deploy an Application to an Auto Scaling Group Using AWS CodeDeploy