2012-07-14 55 views
0

我用布給我寫rsync的包裝,變量env.host_string將被執行()來運行任務進行設置。爲了得到env.host_string,我跑( 'PWD')第一,並運行rsync的。如何迫使織物運行之前,連接到遠程主機()執行?

,纔有可能確保用戶組env.hosts之前的一些檢查站抵達,如病情SRC == env.host_string?

from fabric.api import run, env, task, abort 
from string import Template 

@task 
def sync_to_same_dir(src, path): 
    env.host_string 
    cmd_template = Template("""rsync --dry-run -e ssh -avr [email protected]$src_host:$path/ $path/""") 
    if path.endswith("/"): 
     path = path[:-1] 

    run("pwd") # it's a work around 
    if src == env.host_string: 
     abort("cannot rysnc to the same host") 
    cmd = cmd_template.substitute(path=path, user=env.user, src_host=src) 
    run(cmd) 

我覺得從面料的源代碼的答案。有一個簡單的想法:如何運行檢查主機需要的?

@needs_host 
def put(local_path=None, remote_path=None, use_sudo=False, 
    mirror_local_mode=False, mode=None): 
    """ 
    Upload one or more files to a remote host. 
    """ 

我跟蹤needs_host它會詢問主機,當用戶沒有指定任何主機:

No hosts found. Please specify (single) host string for connection: 

我們可以重寫任務爲:

from fabric.network import needs_host 

@task 
@needs_host 
def the_task_needs_host(): pass 

回答

1

什麼你想要做什麼?任務知道這是用什麼主W/O有任何其他面料電話:

fab -f host-test.py foo 
[98.98.98.98] Executing task 'foo' 
98.98.98.98 
98.98.98.98 

Done. 

這裏是腳本如:

#!/user/bin/env python 

from fabric.api import * 

env.user = 'mgoose' 

@task 
@hosts("98.98.98.98") 
def foo(): 
    print(env.host) 
    print(env.host_string) 

所以你沒有做什麼特別的瞭解主持人的任務已經開始。

+0

感謝答覆,但我想,以確保用戶已設置的主機之前的一些方法調用或檢查點。我會改進我的問題。 – qrtt1 2012-07-15 07:06:31

+0

它只是python。所以檢查:如果env.hosts不是None:...;就足夠了。 – Morgan 2012-07-15 18:44:42

+0

我在源代碼中找到解決方案:) – qrtt1 2012-07-16 13:29:51

相關問題