Fabric
Fabric is a high level Python (2.7, 3.4+) library designed to execute shell commands remotely over SSH, yielding useful Python objects in return::
>>> from fabric import Connection
>>> result = Connection('web1.example.com').run('uname -s')
>>> msg = "Ran {.command!r} on {.connection.host}, got stdout:\n{.stdout}"
>>> print(msg.format(result))
Ran "uname -s" on web1.example.com, got this stdout:
Linux
It builds on top of Invoke_ (subprocess command execution and command-line features) and Paramiko
_ (SSH protocol implementation), extending their APIs to complement one another and provide additional functionality
How is it used?
Core use cases for Fabric include (but are not limited to):
-
Single commands on individual hosts::
>>> result = Connection('web1').run('hostname') web1 >>> result <Result cmd='hostname' exited=0>
-
Single commands across multiple hosts (via varying methodologies: serial,
parallel, etc)::>>> result = SerialGroup('web1', 'web2').run('hostname') web1 web2 >>> result {<Connection host=web1>: <Result cmd='whoami' exited=0>, ...}
-
Python code blocks (functions/methods) targeted at individual connections::
>>> def disk_free(c): >>> uname = c.run('uname -s', hide=True) >>> if 'Linux' in uname: ... command = "df -h / | tail -n1 | awk '{print $5}'" ... return c.run(command, hide=True).stdout.strip() ... err = "No idea how to get disk space on {}!".format(uname) ... raise Exit(err) ... >>> disk_free(Connection('web1')) '33%'
-
Python code blocks on multiple hosts::
>>> def disk_free(c): ... # same as above! ... >>> {c: disk_free(c) for c in SerialGroup('web1', 'web2', 'db1')} {<Connection host=web1>: '33%', <Connection host=web2>: '17%', ...}
In addition to these library-oriented use cases, Fabric makes it easy to integrate with Invoke's command-line task functionality, invoking via a fab
binary stub:
- Python functions, methods or entire objects can be used as CLI-addressable
tasks, e.g.fab deploy
; - Tasks may indicate other tasks to be run before or after they themselves execute (pre- or post-tasks);
- Tasks are parameterized via regular GNU-style arguments, e.g.
fab deploy --env=prod -d
; - Multiple tasks may be given in a single CLI session, e.g.
fab build deploy
; - Much more - all other Invoke functionality is supported - see
its documentation <http://docs.pyinvoke.org>
_ for details.
I'm a user of Fabric 1, how do I upgrade?
We've packaged modern Fabric in a manner that allows installation alongside Fabric 1, so you can upgrade at whatever pace your use case requires. There are multiple possible approaches -- see our detailed upgrade documentation <http://docs.fabfile.org/en/latest/upgrading.html>
_ for details.