2014-04-01 40 views
1

我们正在运行在我们的AWS VPC的公共子网持续集成服务器(詹金斯),我们想触发升级当有内容提交到master发了一个帖子建设任务......如何在不同的AWS VPC子网中使用ansible进行滚动升级?

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

我们的自动扩展配置用户数据脚本在启动时会自动获取存储库的HEAD,所以我们需要做的就是终止ELB中的所有现有实例,所有这些都会自动调整以启用新的实例。

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

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

+0

你想让它全部自动化吗? – Mxx

+0

是的,我们希望在提交被推送到某个分支时自动在CI服务器中创建它 – fortran

回答

0

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

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问题,您也许可以设置从服务器一个SSH隧道,在启动时您的詹金斯服务器(公网IP)是这样的:

ssh -f -N -R2222:localhost:22 [email protected] -S /tmp/control-socket 

,如果你想检查HTTP在詹金斯8888端口

ssh -f -N -R8888:localhost:80 [email protected] -S /tmp/control-socket-http 

这里的技巧是,你需要打开新的服务器顺序,因为你是人在Jenkins服务器上使用相同的端口8888进行检查。您也需要在完成检查后终止隧道。从你的詹金斯服务器:

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' 

许多移动的部分,但应该做的伎俩。

相关问题