Commit da7e44ee authored by Michael Hanselmann's avatar Michael Hanselmann

Initial import of listrunner

This tool was used and worked on internally for quite a long time. We
decided to include it in Ganeti.

Known issues:
- Code doesn't match rest of Ganeti (e.g. using “print” all over the
  place, hardcoded calls to sys.exit deep in functions)
- Code duplication from Ganeti library (e.g. PingByTcp/netutils.TcpPing,
- Using ssh-agent doesn't work with more than one worker (Paramiko keeps
  the socket open and the file descriptor is used from different
  - No clear separation between parent and child process in code
- Uses getopt instead of optparse
Signed-off-by: default avatarMichael Hanselmann <>
Reviewed-by: default avatarIustin Pop <>
parent c4f10abb
......@@ -324,7 +324,8 @@ qa_scripts = \
qa/ \
dist_sbin_SCRIPTS =
dist_sbin_SCRIPTS = \
nodist_sbin_SCRIPTS = \
......@@ -397,6 +398,7 @@ man_MANS = \
man/ganeti.7 \
man/ganeti-cleaner.8 \
man/ganeti-confd.8 \
man/ganeti-listrunner.8 \
man/ganeti-masterd.8 \
man/ganeti-noded.8 \
man/ganeti-os-interface.7 \
ganeti-listrunner(8) Ganeti | Version @GANETI_VERSION@
ganeti-listrunner - Run commands in parallel over multiple machines
**ganeti-listrunner** ``-l`` *logdir*
{``-x`` *executable* | ``-c`` *shell-cmd*}
{``-f`` *hostfile* | ``-h`` *hostlist*}
[``-a`` *aux-file*]
[``-b`` *batch-size*]
[``-u`` *username*]
**ganeti-listrunner** is a tool to run commands in parallel over multiple
machines. It differs from ``dsh`` or other tools in that it asks for the
password once (if not using ``ssh-agent``) and then reuses the password to
connect to all machines, thus being easily usable even when public key
authentication or Kerberos authentication is not available.
It can run either a command or a script (which gets uploaded first and deleted
after execution) on a list of hosts provided either via a file (one host per
line) or as a comma-separated list on the commandline. The out‐ put (stdout and
stderr are merged) of the remote execution is written to a logfile. One logfile
per host is written.
The options that can be passed to the program are as follows:
``-l`` *logdir*
The directory under which the logfiles files should be written.
``-x`` *executable*
The executable to copy and run on the target hosts.
``-c`` *shell-cmd*
The shell command to run on the remote hosts.
``-f`` *hostfile*
The file with the target hosts, one hostname per line.
``-h`` *hostlist*
Comma-separated list of target hosts.
``-a`` *aux-file*
A file to copy to the target hosts. Can be given multiple times, in which case
all files will be copied to the temporary directory. The executable or the
shell command will be run from the (temporary) directory where these files
have been copied.
``-b`` *batch-size*
The host list will be split into batches of batch-size which will be processed
in parallel. The default if 15, and should be increased if faster processing
is needed.
``-u`` *username*
Username to connect as instead of the default root username.
Use an existing ssh-agent instead of password authentication.
The exist status of the command will be zero, unless it was aborted in some way
(e.g. ^C).
Run a command on a list of hosts::
listrunner -l logdir -c "uname -a" -h host1,host2,host3
Upload a script, some auxiliary files and run the script::
listrunner -l logdir -x -a seed.dat -a golden.dat -h host1,host2,host3
dsh(1), cssh(1)
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment