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

时间:2010-08-25 14:43:14

标签: fabric

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

from fabric.api import run

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

但是面料不允许我这样指定主机名,我发现这个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,按照建议here推动我编写一个自己抽象的模块 - 引用Fabric网站,这正是面料应该为我做的:

  

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

3 个答案:

答案 0 :(得分:1)

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

paramiko周围有一些小的抽象层,例如: this one

答案 1 :(得分:1)

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

How to set target hosts in Fabric file

答案 2 :(得分: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