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)