Как заставить ткань подключиться к удаленному хосту до выполнения run()?

Я использую ткань для написания своей оболочки rsync, переменная env.host_string будет установлена ​​с помощью execute() для запуска задачи. Чтобы получить 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 $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)

Я нахожу ответ в исходном коде ткани. Есть простая идея: как запустить проверку хоста по мере необходимости?

@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.
    """

Я отслеживаю need_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

person qrtt1    schedule 14.07.2012    source источник


Ответы (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)

Таким образом, вам не нужно делать ничего особенного, чтобы узнать, на каком хосте находится ваша задача.

person Morgan    schedule 14.07.2012
comment
спасибо за ответ, но я хочу убедиться, что пользователь был установлен хостом перед вызовом какого-либо метода или контрольной точкой. Я уточню свой вопрос. - person qrtt1; 15.07.2012
comment
это просто питон. Итак, проверка: если env.hosts не None: ... ; будет достаточно. - person Morgan; 15.07.2012