1

我想使用fabric作为工具来收集所有服务器负载并在之后处理这些值,我想到了这样的事情:

from fabric.api import run

for servername in servernames:
    load_str = run('cat /proc/loadavg | cut -d' ' -f1', host=servername)

但是fabric不允许我以这种方式指定主机名,我发现这种IMO丑陋的方式:

from fabric.api import env, run

for servername in servernames:
    env.host_string = servername
    load_str = run('cat /proc/loadavg | cut -d' ' -f1')

还有更优雅的方式吗?

直接使用 paramiko,正如这里建议的那样,促使我编写一个自己的模块来抽象它 - 引用 fabrics 网站,这正是 fabric 应该为我做的:

除了通过 fab 傻瓜使用之外,Fabric 的组件还可以导入到其他 Python 代码中,从而为 SSH 协议套件提供一个比 Paramiko 提供的更高级别的 Pythonic 接口(Fabric 本身利用了它)。

4

3 回答 3

1

看来,织物确实是错误的工具。上面引用的声明可能来自早期版本。查看run()代码很明显,fabric 中没有可用于我的目的的模块。

paramiko 周围有一些小的抽象层,例如这个

于 2010-08-27T09:07:43.740 回答
1

这个问题提供了一个解决方案:

如何在 Fabric 文件中设置目标主机

于 2011-06-17T07:36:28.503 回答
1
from fabric.api import settings

for servername in servernames:
    with settings(host_string=servername):
        load_str = run('cat /proc/loadavg | cut -d' ' -f1')

或更好地使用执行

from fabric.tasks import execute

data = execute(load_str , hosts = servernames)

def load_str():
    return run('cat /proc/loadavg | cut -d' ' -f1') 

我建议设置跳过无法访问的主机

env.skip_bad_hosts = True
于 2014-11-27T22:32:12.887 回答