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 |
这个问题提供了一个解决方案:
如何在结构文件中设置目标主机
看来织物确实是一个错误的工具。上述声明可能来自早期版本。看看
在Paramiko周围有一些小的抽象层,例如这个抽象层