We are moving Adafruit IO’s node.js services to a group of t2.nano
EC2 instances, and I wanted to document my dsh
setup. I used to use it for managing the backend workers when working on data.sparkfun.com. It came in really handy when I needed to quickly check or kick anything on the servers.
First, you will need to install dsh
using brew
, apt-get
, yum
, etc:
$ brew install dsh
You will need to make a couple config directories for your user:
$ mkdir -p ~/.dsh/group
Create a new dsh.conf
file using your favorite text editor:
$ vim ~/.dsh/dsh.conf
Paste the following config into ~/.dsh/dsh.conf
, and save the file:
showmachinenames = 1
remoteshell = ssh
Now, you can create a dsh
group for the set of servers you would like to send commands to. Create a new file called example
in the ~/.dsh/group
folder using your favorite text editor:
$ vim ~/.dsh/group/example
Enter the host names for your servers, and save the file:
example-1.uniontownlabs.org
example-2.uniontownlabs.org
example-3.uniontownlabs.org
example-4.uniontownlabs.org
Now you can send commands (like uptime
) to all servers in the group using the following command:
$ dsh -g example -w 'uptime'
example-1.uniontownlabs.org: 14:17:44 up 17:15, 0 users, load average: 0.08, 0.03, 0.05
example-2.uniontownlabs.org: 14:17:43 up 16:36, 0 users, load average: 0.00, 0.01, 0.05
example-3.uniontownlabs.org: 14:17:45 up 16:41, 0 users, load average: 0.00, 0.01, 0.05
example-4.uniontownlabs.org: 14:17:45 up 16:41, 0 users, load average: 0.00, 0.01, 0.05
Using -w
will send the command to each server in the order they appear in the group config, and will wait for a response before continuing. If you want to send the commands concurrently to all servers in the list, use the -c
option to send the command:
$ dsh -g example -c 'uptime'
example-1.uniontownlabs.org: 14:22:42 up 17:20, 0 users, load average: 0.00, 0.01, 0.05
example-3.uniontownlabs.org: 14:22:42 up 16:46, 0 users, load average: 0.00, 0.01, 0.05
example-2.uniontownlabs.org: 14:22:41 up 16:41, 0 users, load average: 0.00, 0.01, 0.05
example-4.uniontownlabs.org: 14:22:42 up 16:46, 0 users, load average: 0.10, 0.05, 0.05
You can get an interactive shell for all servers in the group by using the -c
and -i
commands together. Use CTRL-D to exit the session:
$ dsh -g -c -i