【发布时间】:2016-02-13 04:21:59
【问题描述】:
我需要从角色定义中对主机进行排序,以便它们可以按特定顺序运行这些任务。
我正在实施 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.
如何在运行时更改主机列表?
【问题讨论】:
-
我对 bdr 的了解不够,但如果您首先需要 node-02,为什么不直接更改
env.roledefs中的顺序 - 也许我误解了您。你能提供你所拥有的“解决方案”,这样我就可以做出正面和反面。谢谢。 -
哈维尔,谢谢。我目前的解决方案是为每项任务强制使用服务器。但没有按预期工作。现在我正在比较上面解释的两个测试的 env 输出,以便找到触发器
-
好的。你能更好地解释你需要什么。忘记postgres,只解释你需要fabric做什么——或者更好的是,你想让它做什么(通常不同)。一些 sudo 代码有时会大有帮助。
-
@Javier,抱歉,虽然我之前编辑过。是不是更清楚了?
标签: python fabric postgresql-bdr