首先,您的命令在 localhost 上运行的原因是因为env
它是一个全局变量,并且您在本地覆盖它,但是在 fabric 运行命令时看不到这一点。你应该在你的函数之外定义你的 host_string 。
env.host_string = 'remotehost'
env.user = 'remoteuser'
def download_backup():
run('ls -t /usr/local/lib/backups | head -1')
要在运行时更改主机,您有几个选项。首先,您可以利用roles
androledefs
功能。
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()
我个人更喜欢第一种方法,因为它显然更适合在这种情况下所做的事情,但我可以想象第二种方法可能是更好的选择。