如何在Fabric命令中定位不同的主机

时间:2012-10-13 21:29:46

标签: python fabric

如何指定另一个目标来运行除当前为正在运行的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上运行?

2 个答案:

答案 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')

要在运行时更改主机,您有几个选择。首先,您可以使用rolesroledefs功能。

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()

我个人更喜欢第一种方法,因为它显然更适合在这种情况下所做的事情,但我可以想象有可能第二种方法可能是更好的选择。