如何指定另一个目标来运行除当前为正在运行的Fabric命令设置的命令之外的命令?
我有一个命令download_backup(),它将数据库备份文件从远程主机下载到localhost。由于必须在本地运行,因此host_string是localhost。但是,我需要在远程主机上运行命令以查找最新备份的内容。当我尝试做的时候:
def download_backup():
env.host_string = 'remotehost'
env.user = 'remoteuser'
backup_fn = run('ls -t /usr/local/lib/backups | head -1')
它仍尝试在localhost上运行ls
命令。我是否将其更改为在remotehost上运行?
答案 0 :(得分:8)
您可以使用设置上下文管理器来更改运行特定命令的主机,而不受封闭任务的主机设置的限制。
from fabric.context_managers import settings
with settings(host_string='remote_server'):
run('ls -lart')
答案 1 :(得分:2)
首先,你的命令在localhost上运行的原因是因为env
是一个全局变量,你在本地覆盖它,但是当结构运行命令时却看不到它。您应该在函数之外定义host_string。
env.host_string = 'remotehost'
env.user = 'remoteuser'
def download_backup():
run('ls -t /usr/local/lib/backups | head -1')
要在运行时更改主机,您有几个选择。首先,您可以使用roles
和roledefs
功能。
env.roledefs = {
"ex1": ["host1.example.com"],
"ex2": ["host2.example.com"],
}
env.roles = ["ex1"]
def download_backup():
run("ls -t /usr/local/lib/backups | head -1")
默认情况下,当您运行fab download_backup
时,您将从host1.example.com
获得备份,因为env.roles设置为ex1
。如果要覆盖该设置,可以通过命令行指定角色:
fab -R ex2 download_backup
这会使用ex2
角色启动结构,从而从host2.example.com
获取备份。
另一种选择是利用env
只是一个全局变量的事实。
def download_backup():
run("ls -t /usr/local/lib/backups | head -1")
def download_backup_ex1():
global env
env.host_string = "host1.example.com"
download_backup()
def download_backup_ex2():
global env
env.host_string = "host2.example.com"
download_backup()
我个人更喜欢第一种方法,因为它显然更适合在这种情况下所做的事情,但我可以想象有可能第二种方法可能是更好的选择。