2012-02-05 47 views
3

給予以下fabfile:有沒有辦法在結構文件中進行滾動部署?

from fabric.api import env, run 

env.user = 'implicit_user' 
env.hosts = ['host1', '[email protected]', 'host3'] 

def print_user(): 
    with hide('running'): 
     run('echo "%(user)s"' % env) 

當我們運行fab print_user,我們得到:

[host1] out: implicit_user 
[[email protected]] out: explicit_user 
[host3] out: implicit_user 

Done. 
Disconnecting from host1... done. 
Disconnecting from host2... done. 
Disconnecting from host3... done. 

但是,我非常要進行整個fab print_user順序,以10秒的間隔在這兩者之間做出確保先前的主機在下一個主機將動作關閉之前完成其操作:

[host1] out: implicit_user 
<10 seconds here...> 
[[email protected]] out: explicit_user 
<10 seconds here...> 
[host3] out: implicit_user 
<10 seconds here...> 

Done. 
Disconnecting from host1... done. 
Disconnecting from host2... done. 
Disconnecting from host3... done. 

有沒有辦法做到這一點?我應該如何調整我的fabfile來實現它?

回答

5

除非您通過命令行指定並行,否則您的文件已經按順序執行。要明確這個順序執行,請使用@serial decorator

您是否希望延遲處理失敗? warn_only=False將導致您的一個順序任務失敗以終止任務(其他主機不會運行任務)。這也在下面的例子中看到,只要運行false(它具有失敗退出狀態),剩下的主機就不會運行任務。

from fabric.api import * 
from fabric.decorators import hosts, parallel, serial 
import random 

@task 
@serial 
@with_settings(warn_only=False) 
def maybe_fail(): 
    if random.randint(0,3) == 0: 
     run("/bin/false") 
    else: 
     run("/bin/true") 

如果你真的想這個10秒鐘的延遲我想你可以作出這樣的休眠10一個裝飾或者在你的任務結束正好眠。

+1

謝謝。這太棒了;)我正在嘗試。 – 2012-02-09 05:28:51

相關問題