2012-05-15 14 views
12

有沒有辦法在多個並行任務之間動態修改主機?這是我迄今爲止所擁有的。帶有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 paramenters,但我只想task_2對滿足在task_1條件主機上運行。看起來task_2的主機列表在啓動時初始化,因爲它在init_hosts()中定義的初始env.hosts列表中的所有主機上運行。我也嘗試過動態修改和構建roledefs,但結果相同。

編輯:另外,有沒有辦法設置一個並行執行隊列,使多個並行任務並行執行而不是按順序執行?

編輯:我設法讓每個任務返回的輸出,並解析輸出,以建立一個新的主機列表,讓我期望的最終結果傳遞到執行():

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) 

這工作,但它的總數有很多原因。有沒有更好的辦法?

回答

3

並行執行使用分叉,因此不會共享(返回)狀態更改。因此,在並行運行的任務中更改env變量不會影響該任務的任何其他實例運行,也不會在調用任何其他實例之前全局更改。

如果所有task_1做的都是檢查,爲什麼不把這個邏輯合併到task_2中呢?