Динамические хосты и параллельные задачи с библиотекой Fabric

Есть ли способ динамически изменять хосты между несколькими параллельными задачами? Это то, что у меня есть до сих пор.

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инициализируется при запуске, потому что он работает на всех хостах в начальном списке env.hosts, определенном в init_hosts(). Я также пробовал динамически изменять и создавать определения ролей, но получил тот же результат.

Изменить: Кроме того, есть ли способ настроить очередь параллельного выполнения, чтобы несколько параллельных задач выполнялись параллельно, а не последовательно?

Редактировать: мне удалось получить желаемый конечный результат, заставив каждую задачу возвращать вывод и анализируя вывод для создания нового списка хостов, чтобы передать его в 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)

Это работает, но это грубо по многим причинам. Есть ли лучший способ?

12
задан dj29 15 May 2012 в 17:45
поделиться