0

我需要从角色定义中对主机进行排序,以便它们可以按特定顺序运行这些任务。

我正在实施 PostgreSQL BDR ( http://2ndquadrant.com/en-us/resources/bdr/ ) 部署程序。为了成功,您需要在主机中创建一个 BDR 组,然后才加入所有其他主机中的 BDR 组。

用户需要从列表中选择哪个是第一个主机。

----已编辑----

我尝试动态设置 env.hosts 但它不起作用。

env.roledefs = {
  'array1':    [],
}

env.hostsdefs = {
  'array1': [
    {'host': 'data-03', 'server': 'root@data-03'},
    {'host': 'data-01', 'server': 'root@data-01'},
  ],
}

@serial
def sort_and_echo(default_host):
    sort_host(default_host)
    echoing()

@serial
def sort_host(default_host):
    hostnames = env.hostsdefs[env.roles[0]]
    new_hosts = []
    for host in (hostnames):
        if (host['host'] != default_host):
            new_hosts.append(host['server'])
        else:
            new_hosts = [host['server']] + new_hosts
    env.hosts = new_hosts


@serial
def echoing():
    print env.hosts
    print('current host: %s' % (env.host_string))

这样,如果我尝试:

fab -R array1 sort_and_echo:default_host=data-03
['root@data-03', 'root@data-01']
current host: None

Done.

它不会为列表中的每个服务器运行回显。

但是,如果我尝试一种然后在同一命令中回显:

fab -R array1 sort_host:default_host=data-03 echoing

它将提供预期的输出:

[root@data-03] Executing task 'echoing'
['root@data-03', 'root@data-01']
current host: root@data-03
[root@data-01] Executing task 'echoing'
['root@data-03', 'root@data-01']
current host: root@data-01

Done.

如何在运行时更改主机列表?

4

2 回答 2

1

过了一会儿,我解决了我的问题。这比预期的要容易。不需要黑客。

传递 hosts 参数将使主机在数组请求时添加。由于 Fabric 的标准行为是丢弃重复数据删除(查看http://docs.fabfile.org/en/1.10/usage/execution.html#combining-host-lists中的主机列表重复数据删除),它解决了问题。

如果不传递参数,它将使用数组的第一个

env.roledefs = {
'array1': {'hosts': ['root@data-01', 'root@data-03'], }
}

所以当我尝试:

fab -R array1 -H data-03 echoing

它将以正确的顺序运行:

[root@data-03] Executing task 'echoing'
['root@data-03']
current host: root@data-03
[root@data-01] Executing task 'echoing'
['root@data-03']
current host: root@data-01

Done.
于 2016-02-12T20:18:03.397 回答
0

如果我理解正确,您可以执行以下操作:

@task
def environment(*args):
    env.hosts = args

@task
def dev(*args):
    hosts = list(args)
    hosts.append('dev.host1')
    hosts.append('dev.host2')
    environment(*hosts)

@task
@serial # <--- PS. you dont really need this
def echoing():
    print env.hosts
    print('current host: %s' % (env.host_string))

你现在可以这样称呼它:

fab environment:node1.host.com,node2.host.com echoing

或者:

# which is a "predetermined" list
fab dev echoing
# or add stuff to dev
fab dev:qa.node.host.com echoing
# ^^ this will just append the qa host to your existing list
于 2016-02-12T18:07:33.750 回答