如何在不使用fabfile的情况下使用Fabric在远程主机上并行发出命令?

时间:2016-07-09 04:17:35

标签: python parallel-processing fabric

我有一个Python脚本,它使用Fabric在远程主机上启动测试,获取测试的otuput文件,并进行一些解析。 Python脚本不是fabfile。

我想并行启动并运行测试。我读过关于使用" @ parallel"装饰者,但我读过的所有例子都将脚本作为fabfile。

我的代码是这样的:

from fabric.api import *

# Copy the testfile on each of the hosts.  This is sequential, it could be
# done in parallel but doing it in parallel is not that important
def copy_test(host_list, testfile_name):
    for x in host_list:
        env['host_string'] = x

        target_testfile_name = "/tmp/" + testfile_name

        put(testfile_name, target_testfile_name)


@parallel  # Would this decorator work?
def run_test(host_list, testfile_name):

    target_testfile_name = "/tmp/" + testfile_name
    for x in host_list:
        env['host_string'] = x
        run(target_testfile_name)


if __name__ == '__main__':

    HOSTS = ['10.10.10.10', '10.10.10.11', '10.10.10.12', '10.10.10.13']

    testfile_name = "foo.py"

    copy_test(HOSTS, testfile_name)

    # I would like to launch run_test() in parallel
    run_test(HOSTS, testfile_name)        

这是代码的简化版本。我没有包含所有内容,但是我传递了主机的配置信息,这限制了我使用这个脚本作为fabfile,我发出了类似的内容:

  

" fab -H' 10.10.10.10' copy_test"

     

" fab -H' 10.10.10.10' RUN_TEST" -P

我可以使用threading.Threads库执行run_test(),但我宁愿这样做是最后的手段。

正如您所看到的,我没有将它作为fabfile运行。

有没有办法可以使用Fabric的并行执行模型执行run_test()而不执行我的脚本作为" fabfile"?

1 个答案:

答案 0 :(得分:0)

我无法发表评论,所以我会将答案更改为您的主要内容:

i.circle-text {
    font-size: 14pt;
    font-weight: bold;
    color: #FFF;
    font-style: normal;
}

如果您使用if __name__ == '__main__': HOSTS = ['10.10.10.10', '10.10.10.11', '10.10.10.12', '10.10.10.13'] testfile_name = "foo.py" execute(copy_test,HOSTS, testfile_name) # I would like to launch run_test() in parallel execute(run_test,HOSTS, testfile_name) 调用该函数并且您的函数已execute()它将并行启动