from fabric.api import env
from fabric.api import run
class FabricSupport:
def __init__ (self):
pass
def run(self, host, command):
env.key_filename = 'C:/.ssh/dev.pub'
env.host_string = "%s:%s" % (host, 22)
run(command, timeout=5)
fab = FabricSupport()
def execute(host, txt):
stdout = ""
try:
stdout = fab.run(host, txt)
except Exception, e:
stdout = str(e)
return stdout
result = execute("23.23.23.23", "uname -a")
它只输出以下内容,并无限期地保持不变。超时似乎不起作用。如果它更详细一些,这样我就可以调查到底发生了什么。在
[12.45.241.11:22]运行:uname-a
我今天在Ubuntu主机上遇到了同样的问题。我的问题是活动外壳设置:
env.shell = /bin/sh -l -c
在这个shell中,脚本不会干净地执行远程命令并挂断ssh连接。该控件保留在ssh shell中,导致结构超时。在
设置为:
env.shell = "/bin/bash -c"
一切都还好。在
一般建议:根据主机操作系统检查shell和参数。在
本周我遇到了同样的挂起错误,当我需要在远程计算机上运行一个耗时较长的作业时。在
我通过在中指定'keepalive'选项来解决这个问题fabric.api.env配置。此配置将要求fabric每隔几分钟发送一次keepalive消息。在
http://docs.fabfile.org/en/1.14/usage/env.html#keepalive
我将值设置为30,它不会挂起一个运行3小时的作业。在
我不知道你的最终目标是什么。如果您试图通过在类中使用env来隔离修改env的效果,那么这是行不通的。它是fabric中的模块级全局,无论您在哪里修改它(通过像这里这样的赋值),它将应用于任何后续代码。我想你可能真正想要的是:
请记住,“fab”命令行实用程序不能像原来那样使用它,因为它在fab加载fab文件后立即执行该代码(结果=execute…)。这绝对是图书馆的用途。在
您可以使用roledefs来完成这样的主机组。结果对象将是一个字典,其中每个主机是一个键,相应的值是任务的返回对象。您几乎不想使用裸异常子句,Fabric有自己的方法来防止异常导致程序终止。在
相关问题 更多 >
编程相关推荐