Question

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?

Using 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.)

Was it helpful?

Solution

This question offers a solution:

How to set target hosts in Fabric file

OTHER TIPS

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top