2012-07-22 46 views
5

我正在編寫一個腳本以在多個主機上啓動負載生成實驗。我可以編寫一個bash腳本來啓動多個ssh會話,但我希望能夠使用更加結構化的東西。由於我對我的大多數腳本使用Python,我認爲Fabric看起來是一個不錯的選擇。將不同參數傳遞到結構中的不同主機

唯一的問題是我需要傳遞少量的主機特定數據與每個命令(實際上只是一個ID或計數器),我想並行運行它們。

換句話說,我想要做一些類似於下面的事情,其中​​host_num對於每個主機都是不同的(可能只是遞增)。

@parallel 
def launch(): 
    with cd('/working/dir'): 
     run("./start/script -id=%d", host_num) 

這是可能的面料?如果沒有,是否有另一種工具可以用來完成同樣的事情?

回答

3

您可以檢查用戶/主機。每個任務都知道環境中,他們目前在運行:

env.hosts = ['[email protected]', '[email protected]'] 

@task 
def test(): 
    print '%(user)[email protected]%(host)s' % (env) 

    if env.host == 'host1.com': 
     id = 1 
    elif ... 

    run('echo "%s"' % (id)) 

隨意寫的更優雅的方式:)(一個建議是字典使用類似案例的ID查詢語句)

+2

感謝。這太糟糕了,沒有更好的機制 - 如果你想在不同的主機上運行相同的腳本,這種方法看起來不太好。 – bsowell 2012-07-23 14:14:33

+0

這仍然會並行嗎?我遇到同樣的挑戰,但我有20臺主機,這些主機在運行時會分解(AWS EC2實例)。所以,我認爲提前編寫「if-then」陳述難以奏效。 – 2016-06-16 14:30:22

2

如果您想對您在任務內運行的主機進行一些自省,我會建議引用env.host變量。每個任務都知道它是env狀態,儘管它們並不共享這個狀態,因爲它們都以分叉的形式運行。還有一個number of other env vars在您的處置。

相關問題