Amazon web services 如何在不同的AWS VPC子网中使用ansible进行滚动升级?

Amazon web services 如何在不同的AWS VPC子网中使用ansible进行滚动升级?,amazon-web-services,ansible,continuous-deployment,Amazon Web Services,Ansible,Continuous Deployment,我们正在AWS VPC的一个公共子网中运行一个持续集成服务器(jenkins),我们希望在提交到master时触发升级,作为构建后任务 最简单的方法是让ansible在机器中使用ssh,拉取最新的主机,重新启动服务,然后继续下一个;但是,由于CI主机运行在不同的子网中,我们无法访问服务器 我们的自动缩放配置用户数据脚本在启动时自动获取存储库的头,因此我们需要做的就是终止ELB中的所有现有实例,所有实例都让自动缩放来启动新实例 问题是,我不知道如何在剧本中指定,在终止下一个实例之前,它应该等待一个

我们正在AWS VPC的一个公共子网中运行一个持续集成服务器(jenkins),我们希望在提交到
master
时触发升级,作为构建后任务

最简单的方法是让ansible在机器中使用ssh,拉取最新的
主机
,重新启动服务,然后继续下一个;但是,由于CI主机运行在不同的子网中,我们无法访问服务器

我们的自动缩放配置用户数据脚本在启动时自动获取存储库的
,因此我们需要做的就是终止ELB中的所有现有实例,所有实例都让自动缩放来启动新实例

问题是,我不知道如何在剧本中指定,在终止下一个实例之前,它应该等待一个新实例启动并运行


另一个可行的方法是,一次启动所有新实例,当它们启动并运行时,从ELB分离并终止所有旧实例(但我也找不到有关如何执行此操作的示例!)。

另一个方法是使用新ELB和所有新实例创建新的自动缩放组。当它们启动时,您可以对新的ELB运行测试,确认一切正常,然后切换DNS。这种方法的关键在于厄尔巴鄂河的预热。如果你的网站很忙,新的ELB将不会处理流量,除非你要求亚马逊为你“预热”

如果您想检查服务器是否已启动或关闭,您可以从Jenkins服务器执行此操作,尽管它需要能够访问VPC内的实例

---
name: Deployment playbook
hosts: all

tasks:
  # Using port 2222 here but you can use port 80 or 443
  - name: Wait for new deployment instance to come up.
    local_action: wait_for host=your_new_deployment_host port=2222

  - name: Shutdown or terminate old servers
    local_action: command ec2-terminate-instances <your-old-server-instance-id>
如果您想检查端口8888上Jenkins中的http

ssh -f -N -R8888:localhost:80  jenkins@yourjenkinsserver.com -S /tmp/control-socket-http
这里的技巧是,您需要按顺序启动新服务器,因为您总是使用Jenkins服务器上的同一端口8888进行检查。在完成检查后,您还需要终止隧道。从Jenkins服务器:

name: Terminate tunnel HTTP
local_action: shell ssh -p 2222 localhost 'ssh -S /tmp/control-socket-http -O exit yourjenkinsserver.com'

name: Terminate tunnel SSH
local_action: shell ssh -p 2222 localhost 'ssh -S /tmp/control-socket -O exit yourjenkinsserver.com'

有很多移动的片段,但应该可以做到这一点。

您想让所有这些都完全自动化吗?是的,我们希望在每次提交到某个分支时,都能在CI服务器中自动完成
name: Terminate tunnel HTTP
local_action: shell ssh -p 2222 localhost 'ssh -S /tmp/control-socket-http -O exit yourjenkinsserver.com'

name: Terminate tunnel SSH
local_action: shell ssh -p 2222 localhost 'ssh -S /tmp/control-socket -O exit yourjenkinsserver.com'