[英]Deploying to multiple EC2 servers with Fabric
我想知道是否有人在使用结构的 ec2上部署到负载平衡器后面的多个服务器的经验
我现在已经使用了一段时间的Fabric,并且没有问题,或者部署到多个服务器,但我想在这个场景中做的是(假设我有十个实例运行)de-register half(5)of来自我的负载均衡器的盒子,将我的代码部署到它们并运行冒烟测试,如果一切看起来都很好,再次使用负载均衡器注册它们并取消注册剩余的5个实例并部署到它们,然后将它们注册回负载均衡器。
我完成任何单个任务(取消注册,运行测试,部署等)都没有问题,我只是不知道如何以简单的方式组织我的主机,以便我可以部署上半部分,然后是下半部分。 Fabric似乎设置为按顺序在所有主机上运行相同的任务(主机1上的任务1,主机2上的任务1,主机1上的任务2,主机2上的任务2等)
我的第一个想法是创建一个任务来处理取消注册,部署和测试的第一部分,然后为服务器的后半部分设置env.hosts,但我觉得这似乎有点过分了。
以前有没有人用Fabric模仿类似的东西?
您可以通过定义角色 (用于主机聚合)和在一个角色上执行任务,然后在第二个角色上运行测试和部署来简化此操作。
roledefs
示例:
env.roledefs = {
'first_half': ['host1', 'host2'],
'second_half': ['host3', 'host4'],
}
def deploy_server():
...
# deploy one host from current role here
def deploy():
# first role:
env.roles = ['first_half']
execute('deploy_server')
test() # here test deployed servers
# second role:
env.roles = ['second_half']
execute('deploy_server')
更多链接:
您想使用execute()函数。 这将允许您执行以下操作:
def update():
deallocate()
push_code()
smoke_test() #could fail fast
reallocate()
def deploy():
execute(update, hosts=first_five)
execute(update, hosts=last_five)
您还可以在部署中对每个deallocate,push_code和smoke_test任务执行execute()调用,然后运行所有deallocates然后运行所有代码推送等。
然后进行某种检查,然后继续运行所述任务的其他人。
我已成功将Fabric与boto结合起来。 我使用boto填充主机列表。 您可以使用@parallel装饰器来限制一次执行的主机数量。 该命令如下所示;
fab running deploy
代码看起来像这样;
@task
@runs_once
def running():
ec2conn = ec2.connect_to_region(region)
reservations = ec2conn.get_all_instances(filters={'instance-state-name': 'running'})
instances = list(chain.from_iterable(map(lambda r: r.instances, reservations)))
env.hosts = list(chain.from_iterable(map(lambda i: i.public_dns_name, instances)))
@task
@parallel(pool_size=5)
def deploy():
# do stuff on n<=5 hosts in parallel
如果您需要处理主机的子部分,我建议使用标签。
或者你可以简单地编写一个设置一些变量的方法,例如:
def live():
global PATH, ENV_PATH
env.hosts = ["22.2.222.2"]
env.user = 'test'
PATH = '/path/to/project'
# optional, is using virtualenv
ENV_PATH = '/path/to/virtualenv'
# overwri
在当前机器上需要更改的任何变量
在运行deploy命令之前,运行:
fab live deploy
详细信息: http : //simionbaws.ro/programming/deploy-with-fabric-on-multiple-servers/
您可以将列表(或任何可迭代的)传递给主机装饰器,而不是插入env.hosts。 就像是:
def deploy(half_my_hosts):
@hosts(half_my_hosts)
def mytask():
# ...
mytask()
然后你可以用你喜欢的任何方式拆分你的env.hosts并将它传递给deploy()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.