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

时间:2014-04-01 20:34:19

标签: amazon-web-services ansible continuous-deployment

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

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

我们的自动调节配置用户数据脚本在启动时自动获取存储库的HEAD,因此我们需要做的就是终止ELB中的所有现有实例,所有实例都允许自动调节以启动新的的。

问题在于我不知道如何在剧本中指定它应该等到新实例启动并运行之后再终止下一个实例。

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

2 个答案:

答案 0 :(得分:0)

另一种选择是使用新的ELB和所有新实例创建一个新的自动缩放组。当它们启动时,您可以对新的ELB运行测试,确认一切正常,然后将DNS转过来。这种方法的问题在于ELB预热。如果您的网站繁忙,新的ELB将无法处理流量,除非您要求亚马逊为您“预热”它。

答案 1 :(得分:0)

如果要检查服务器是否已启动或关闭,可以从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>

要解决VPC问题,您可以设置从启动时您的服务器到您的Jenkins服务器(公共IP)的ssh隧道,如下所示:

ssh -f -N -R2222:localhost:22  jenkins@yourjenkinsserver.com -S /tmp/control-socket

如果你想在端口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'

很多动人的作品应该可以解决问题。