Fabric:为显式主机调用run()

Fabric: call run() for an explicit host

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

1
2
3
4
from fabric.api import run

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

但是Fabric不允许我这样指定主机名,我发现这是一个很难看的方法:

1
2
3
4
5
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应该为我做的:

In addition to use via the fab fool, Fabric’s components may be imported into other Python code, providing a Pythonic interface to the SSH protocol suite at a higher level than that provided by e.g. Paramiko (which Fabric itself leverages.)


1
2
3
4
5
from fabric.api import settings

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

或者更好地使用execute

1
2
3
4
5
6
from fabric.tasks import execute

data = execute(load_str , hosts = servernames)

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

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

1
env.skip_bad_hosts = True

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

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


看来织物确实是一个错误的工具。上述声明可能来自早期版本。看看run()代码,很明显,在结构中没有可以用于我的目的的模块。

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