繁体   English   中英

Fabric库的动态主机和并行任务

[英]Dynamic Hosts and Parallel Tasks with Fabric library

有没有办法在多个并行任务之间动态修改主机? 这就是我到目前为止所拥有的。

def init_hosts():
    env.hosts = [host1,host2,host3,host4]

@parallel
def task_1():
    if condition is False:
        env.hosts.remove(env.host)

@parallel
def task_2():
    run('uname -s')

显然我缺少一些env参数,但我只希望task_2在满足task_1条件的主机上运行。 看来task_2的主机列表在启动时被初始化,因为它在init_hosts()中定义的初始env.hosts列表中的所有主机上运行。 我也尝试动态修改和构建roledef,但结果相同。

编辑:另外,有没有办法设置并行执行队列,以便并行执行多个并行任务而不是顺序执行?

编辑:我设法通过让每个任务返回输出来获得我想要的最终结果,并解析输出以构建新的主机列表以传递给execute():

def init_hosts():
    env.hosts = [host1,host2,host3,host4]

@parallel
def task_1():
    if condition is False:
        return False
    else:
        return True

@parallel
def task_2():
   run('uname -s')

def run_tests():
   results = execute(task_1)
   successful_hosts = [k for k in results.iterkeys() if results[k]]
   execute(test_2, hosts=successful_hosts)

这有效,但由于很多原因,这很糟糕。 有没有更好的办法?

并行执行使用fork,因此不共享(返回)状态更改。 因此,在一个并行运行的任务中更改env变量不会影响该任务运行的任何其他实例,也不会在调用之前更改全局设置的任何内容。

如果所有task_1都在进行检查,为什么不将这个逻辑合并到task_2中呢?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM