8

我想知道是否有人有部署到带有结构的 ec2 上的负载均衡器后面的多个服务器的经验

我已经使用了一段时间的结构,并且没有任何问题,或者部署到多个服务器,但是在这种情况下我想做的是(假设我有十个实例正在运行)取消注册一半 (5)来自我的负载均衡器的盒子,将我的代码部署到它们并运行烟雾测试,如果一切看起来都不错,请再次向负载均衡器注册它们并取消注册剩余的 5 个实例并部署到它们,然后将它们注册回负载均衡器。

我完成任何单个任务(注销、运行测试、部署等)都没有问题,我只是不知道如何以简单的方式组织我的主机,以便我可以部署前半部分,然后是后半部分. Fabric 似乎设置为在所有主机上按顺序运行相同的任务(主机 1 上的任务 1、主机 2 上的任务 1、主机 1 上的任务 2、主机 2 上的任务 2 等等)

我的第一个想法是创建一个任务来处理注销、部署和测试的第一部分,然后为服务器的后半部分设置 env.hosts,但我觉得这似乎有点做作。

以前有没有人用 Fabric 模拟过类似的东西?

4

6 回答 6

5

您可以通过定义角色(用于聚合主机)并在一个角色上执行任务,然后在第二个角色上运行测试和部署来简化这一过程。

示例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')

更多链接:

于 2012-05-01T21:47:08.493 回答
3

您想使用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() 调用,然后运行所有 deallocate,然后运行所有代码推送等。

然后进行某种检查,然后继续其他人运行所述任务。

于 2012-05-01T21:36:46.227 回答
1

我已经成功地将 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

如果您需要处理一部分主机,我建议您使用标签。

于 2013-01-20T01:14:46.723 回答
0

或者您可以简单地编写一个设置一些变量的方法,例如:

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

您需要在当前机器上更改的任何变量

在运行部署命令之前,运行:

fab live deploy

详细信息:http ://simionbaws.ro/programming/deploy-with-fabric-on-multiple-servers/

于 2014-03-04T20:23:41.847 回答
0

Fabric 未设置为在所有主机上运行相同的任务。

除了-H您可以使用命令行参数为特定任务显式设置主机这一事实之外,您还可以使用模式和 更新的模式来完成您想要的操作。

更新:这里显示了如何使用roles

于 2012-05-01T20:49:08.807 回答
-1

您可以将一个列表(或任何可迭代的)传递给主机装饰器,而不是干预 env.hosts。就像是:

def deploy(half_my_hosts):
    @hosts(half_my_hosts)
    def mytask():
        # ...
    mytask()

然后你可以以任何你喜欢的方式拆分你的 env.hosts 并将它传递给 deploy()

于 2012-05-01T20:59:06.470 回答