【问题标题】:Python code using Fabric does not use remote hosts使用 Fabric 的 Python 代码不使用远程主机
【发布时间】:2018-03-23 03:14:50
【问题描述】:

我将 python 3.6 与 Fabric3 1.13.1 一起使用。以下是我正在使用的代码的简化版本。

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 上没有任何进程正在启动。

如果 Fabric 找不到 myserver 是否会静默恢复到 localhost?

编辑 我也试过了

execute(func(), hosts = ['myserver'])

在单独的 python 文件中,以及在 fabfile 中,这两种方式都在 localhost 上执行!

编辑 2
似乎在远程主机上运行的唯一东西是 run("commands_to_run") # 这会从列表 env.hosts 中选择主机

【问题讨论】:

    标签: python fabric


    【解决方案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() 将始终在本地计算机上运行。

    【讨论】:

    • 那么我必须做什么才能在远程主机上运行它?我必须先运行(“ssh myserver”)吗?
    • 没有。只需调用 run("command") ,其中“command”是您要在远程服务器上运行的内容。 Fabric 将负责登录和运行它。如果你想在远程服务器上运行一个 python 文件,你可以 run("python /path/to/file.py") where file.py 位于远程服务器上。
    • 谢谢。那行得通,我已经试过了(在你的建议之后)。我想远程执行一个 python 函数,我认为 execute() 函数可以让我这样做,但这也不起作用。有没有办法在特定主机上使用 run() 而无需更改 env.hosts 列表或创建新功能(使用装饰器设置主机)?
    • @Junaid 查看我发布的关于使用执行的答案。
    【解决方案2】:

    根据您的 Edit1,您没有正确使用 execute

    execute 中的第一个参数应该是调用 run。不同之处在于主机将从第二个参数而不是env.hosts 中获取。

    def func():
        run( "commands_to_run" )
    
    
    execute(func, hosts = ['myserver'])
    

    【讨论】:

      猜你喜欢
      • 2017-08-20
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多