如何从fabric2组获取正在处理的主机

时间:2018-12-06 10:34:40

标签: python fabric

我想为某些任务尝试使用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。

1 个答案:

答案 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