Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有结构库的动态主机和并行任务_Python_Ssh_Automation_Fabric_Paramiko - Fatal编程技术网

Python 具有结构库的动态主机和并行任务

Python 具有结构库的动态主机和并行任务,python,ssh,automation,fabric,paramiko,Python,Ssh,Automation,Fabric,Paramiko,有没有办法在多个并行任务之间动态修改主机?这就是我目前所拥有的 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_

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

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
列表中的所有主机上运行。我还尝试动态修改和构建roledefs,但得到了相同的结果

编辑:还有,有没有办法设置并行执行队列,使多个并行任务并行执行而不是顺序执行

编辑:通过让每个任务返回输出,并解析输出以构建新的主机列表以传递给execute(),我成功地获得了所需的最终结果:


这是可行的,但有很多原因。有更好的方法吗?

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

如果task_1所做的只是一个检查,为什么不将此逻辑合并到task_2中

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)