I'd like to use fabric as a tool to gather all server loads and process the values afterward, I thought of something like this:
from fabric.api import run
for servername in servernames:
load_str = run('cat /proc/loadavg | cut -d' ' -f1', host=servername)
but fabric doesn't allow me to specify the hostname this way, I found this IMO ugly way:
from fabric.api import env, run
for servername in servernames:
env.host_string = servername
load_str = run('cat /proc/loadavg | cut -d' ' -f1')
are there more elegant ways?
Us开发者_开发知识库ing paramiko directly, as suggested here pushes me to write an own module that abstracts it - quoting from fabrics website, that's exactly what fabric should do for me:
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.)
This question offers a solution:
How to set target hosts in Fabric file
It appears that fabric really is the wrong tool for that.
The claim quoted above is probably from an earlier version.
Looking at the run()
code it's clear there's no module in fabric that could be used for my purpose.
There are small abstraction layers around paramiko, e.g. this one
from fabric.api import settings
for servername in servernames:
with settings(host_string=servername):
load_str = run('cat /proc/loadavg | cut -d' ' -f1')
or better using execute
from fabric.tasks import execute
data = execute(load_str , hosts = servernames)
def load_str():
return run('cat /proc/loadavg | cut -d' ' -f1')
I'd recommend setting to skip hosts that are not reachable
env.skip_bad_hosts = True
精彩评论