4

除了当前为正在运行的 Fabric 命令设置的目标之外,您如何指定不同的目标来运行命令?

我有一个命令 download_backup() 从远程主机下载数据库备份文件到本地主机。由于它必须在本地运行,因此 host_string 是 localhost。但是,我需要在远程主机上运行一个命令来查找最近的备份是什么。当我尝试这样做时:

def download_backup():
    env.host_string = 'remotehost'
    env.user = 'remoteuser'
    backup_fn = run('ls -t /usr/local/lib/backups | head -1')

它仍然尝试ls在 localhost 上运行命令。我是否将其更改为在远程主机上运行?

4

2 回答 2

9

您可以使用设置上下文管理器来更改运行特定命令的主机,而与封闭任务的主机设置无关。

from fabric.context_managers import settings
with settings(host_string='remote_server'):
    run('ls -lart')
于 2012-10-13T22:27:58.007 回答
2

首先,您的命令在 localhost 上运行的原因是因为env它是一个全局变量,并且您在本地覆盖它,但是在 fabric 运行命令时看不到这一点。你应该在你的函数之外定义你的 host_string 。

env.host_string = 'remotehost'
env.user = 'remoteuser'

def download_backup():
    run('ls -t /usr/local/lib/backups | head -1')

要在运行时更改主机,您有几个选项。首先,您可以利用rolesandroledefs功能。

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

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

于 2012-10-13T22:21:34.627 回答