0

ファブリックを使用して rsync ラッパーを作成しています。変数 env.host_string は execute() によってタスクを実行するように設定されます。env.host_string を取得するには、まず run('pwd') を実行し、rsync を実行します。

条件 src == env.host_string などのチェックポイントが到着する前に、ユーザーが env.hosts を設定したことを確認することは可能ですか?

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 $user@$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)

fabricのソースコードから答えを見つけました。簡単なアイデアがあります:必要に応じてチェックホストを実行する方法は?

@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
4

1 に答える 1

1

あなたは何をしようとしているのですか?タスクは、他のファブリック呼び出しを使用せずに、使用しているホストを認識しています。

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)

そのため、タスクが実行されているホストを知るために特別なことをする必要はありません。

于 2012-07-14T20:24:20.177 に答える