This tool leverages the Python asynchronous paradigm and comes with
- a standalone
apssh
command for running remote commands on a bunch of hosts in parallel, as well as theappull
andappush
commands to perform parallel copies, that sysadmins might find useful for their routine jobs, - an API with which one can create
SshJob
objects in conjunction with anasynciojob
'sScheduler
for orchestrating them.
Please refer to http://apssh.readthedocs.io/ for a complete documentation bundle.
Originally, the idea presented here addresses the needs of experimental research, where an experiment often boils down to running jobs like preparing a set of nodes, initializing them, running some bash script, collecting results, all of them having temporal relationships.
To that end, the 2 libraries asynciojobs
and apssh
complement each other
to offer a powerful programing environment that we have branded nepi-ng
; its 2 parts are thus:
asynciojobs
is a microscopic orchestration scheduler for asyncio-based jobs -
see this link for
details.
This is the part that handles the temporal relationships.
apssh
ships with a few classes that allow you to write jobs in the
asynciojobs
sense, that will actually run on ssh:
SshNode
: describe how to reach a node (possible through a gateway)SshJob
: to run one or several remote commands; each of these can beRun
: that is designed to run a command readily available on the target nodeRunScript
: when you have a local script file to run remotely, so there is a need to push it over there prior to running itRunString
: same idea, but you do not even have a local file, it's just a python string in memory; useful to embed your shell code inside a python codePull
orPush
for file transfers over SFTP
As the names may suggest:
- an
SshNode
instance contains the details of the target node (hostname, username, gateway if relevant, etc...), and it can be thought of as an ssh connection; SshJob
, is suitable to run asasynciojobs's
jobs, i.e. inside a scheduler;- an
SshJob
instance contains a list of the actual commands to run, that can be a mix of remote executions and file transfers.
You can see a very simple example of that idea implemented in 2 files
- the python code
- and the related shell script
- plus, a summary of the objects involved is depicted in this figure
Another, simpler example, illustrates how to take advantage of the YAML loader, see
- the
my-first-nepi-ng-script
folder in <https://github.com/fit-r2lab/demos - and in particular the 2 versions named
demo-v1.py
anddemo-v2.py
that implement the exact same behaviour but that use- a pure Python approach (v1)
- the YAML loader (v2)