我使用fabric来编写我的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)
我从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
答案 0 :(得分: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)
因此,您无需做任何特别的事情来了解您的任务所在的主机。