我想使用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本身利用它。)
答案 0 :(得分:1)
看起来面料确实是错误的工具。
上面引用的声明可能来自早期版本。
查看run()
代码,很清楚,结构中没有可用于我的目的的模块。
paramiko周围有一些小的抽象层,例如: this one
答案 1 :(得分:1)
这个问题提供了一个解决方案:
答案 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