我想为某些任务尝试使用fabric2,这需要在多个主机上运行多个命令。所以我使用threadingGroup
是因为我想同时进行。这是下面的代码
with fabric.ThreadingGroup(*hosts) as tg:
try:
tg.run('uptime')
tg.run('last -xF| grep boot')
现在,我需要一次知道结构一次正在处理哪个主机,因为我需要根据第二个run
命令的结果对主机进行一些处理。我尝试对此进行了很多梳理,但在此上却找不到很多。一般而言,甚至面料文档也几乎没有关于组的信息。
如果我愿意牺牲如下所示的并发性,我可以实现这一目标。
def runner(cxn):
try:
cxn.run('uptime')
reboots = cxn.run("last -xF|grep boot")
except Exception:
pass
for c in Group(*hosts):
runner(c)
但是这种方法击败了使用threadingGroup
的整个方法,因为它不是并行运行,而是顺序执行。
那么有没有一种方法可以用fabric2实现,或者我应该只坚持用fabric1。
答案 0 :(得分:0)
GroupResult
操作中的run
将告诉您每个主机上命令的输出。
例如:
with fabric.ThreadingGroup(*hosts) as tg:
try:
tg.run('uptime')
results = tg.run('last -xF| grep boot')
for connection, result in results.items():
if connection.host == 'host1':
# do some stuff here