我正在使用带有Fabric3 1.13.1的python 3.6。以下是我正在使用的代码的简化版本。
from fabric.api import *
from file import func
env.hosts = ['user@myserver:22' ]
env.passwords={'user@myserver:22':'password'}
def test():
func() # function defined in func
此代码保存在名为fabfile.py的文件中。当我在终端中运行fab test
时,执行开始为
['user @ myserver:22']执行任务'test'
但根据htop,正在使用 localhost 的资源而不是 myserver 。并且 myserver 没有启动任何进程。
如果找不到 myserver ,Fabric是否会以静默方式恢复为localhost?
修改的 我也试过
execute(func(), hosts = ['myserver'])
在一个单独的python文件中,以及在fabfile中,这两种方式都优于 localhost !
编辑2
似乎在远程主机上运行的唯一事情是
run("commands_to_run")
#这将从列表env.hosts
答案 0 :(得分:1)
您需要调用run()
来执行远程主机上的shell命令。
http://docs.fabfile.org/en/1.14/api/core/operations.html#fabric.operations.run
例如:
def test():
local("hostname")
run("hostname")
another_function()
这将在本地计算机和远程主机上运行hostname
shell命令。
Fabric不支持在远程主机上执行任意Python函数。 another_function()
将始终在本地计算机上运行。
答案 1 :(得分:1)
根据您的Edit1,您没有正确使用execute
。
执行中的第一个参数应该是调用run。不同之处在于主机将从第二个参数而不是env.hosts
中获取。
def func():
run( "commands_to_run" )
execute(func, hosts = ['myserver'])