TLDR: Running commands at multiple hosts with Fabric

Published on

Recently someones asked me how to perform a connection to a server to run the command df -h using ssh to display the disk usage of the machine. After a quick chat, I discovered that the question was more than just a single check to a server. It was to extend that to multiple servers.

The answer to the question was quick and came with a “click”. How about to document these quick tips at the blog? It can help someone and also help me to remind me how to do something if I need it in the future. With that in mind, I created this series of posts that I kindly baptized as TLDR the abbreviation for Too Long ** D**idn’t Read.

Now moving to the actual tip, to automate repetitive tasks like at the question above or on more complex processes like on software deployment there is a handy python library called Fabric that we are going to use to help us on that.

To install Fabric you can use pip:

$ pip install Fabric3

Then we create the fabfile.py with the following content:

from fabric.api import env, run

env.hosts = ['user1@server1', 'user2@server2']


def disk_usage():
    run('df -h')

With the file ready, you need to run this command:

$ fab disk_usage
[user1@server1] Executing task 'disk_usage'
[user1@server1] run: df -h
[user1@server1] out: Filesystem      Size  Used Avail Use% Mounted on
[user1@server1] out: /dev/root        20G  2.2G   17G  12% /
[user1@server1] out: devtmpfs        488M     0  488M   0% /dev
[user1@server1] out: tmpfs           490M     0  490M   0% /dev/shm
[user1@server1] out: tmpfs           490M   51M  440M  11% /run
[user1@server1] out: tmpfs           5.0M     0  5.0M   0% /run/lock
[user1@server1] out: tmpfs           490M     0  490M   0% /sys/fs/cgroup
[user1@server1] out: tmpfs            98M     0   98M   0% /run/user/0
[user1@server1] out:

[user2@server2] Executing task 'disk_usage'
[user2@server2] run: df -h
[user2@server2] out: Filesystem      Size  Used Avail Use% Mounted on
[user2@server2] out: /dev/root        20G  3.9G   15G  22% /
[user2@server2] out: devtmpfs        488M  4.0K  488M   1% /dev
[user2@server2] out: none            4.0K     0  4.0K   0% /sys/fs/cgroup
[user2@server2] out: none             98M  352K   98M   1% /run
[user2@server2] out: none            5.0M     0  5.0M   0% /run/lock
[user2@server2] out: none            490M     0  490M   0% /run/shm
[user2@server2] out: none            100M     0  100M   0% /run/user
[user2@server2] out:


Done.

Fabric will run the task in sequence at the host list informed. If you want to run it in parallel use the -P flag:

$ fab disk_usage -P

Bonus

Tip from @luizirber at twitter.

Fabric has a pattern to run its commands at the CLI without needing to write code:

$ fab [options] -- [shell command]

The disk usage command woud be:

$ fab -H 'user1@server1, user2@server2' -- df -h