Neat idea, though I feel like it would be better implemented as a command line tool using ncurses or something similar so it could be used on any Unixy system (including logged into another server, for example)
True. Usually when creating a shell loop like this, I prepend 'echo' in front of 'ssh...' as a dry run first. I also wouldn't actually use something like this for commands that are destructive in nature. Usually it's for things like running informational commands ('rpm -q', 'uptime', etc). Of course anything can become destructive if you fat-finger it hard enough.
Like how SSH agent forwarding can allow you to hop from box to box with the SSH keys loaded onto your local machine's SSH agent? Found that one a few months ago, made me reflect on what I've been doing in life the past 10 years not thoroughly reading UNIX man pages.
ssh is magic. checkout -X for X11 forwarding to run remote GUI apps, and -R which lets you set up a reverse SSH tunnel when you need to connect to a machine behind a firewall.
Now combine that with dsh (http://www.netfort.gr.jp/~dancer/software/dsh.html.en) and authorized_keys, you can _really_ get in trouble. dsh is similar to this Cluster SSH, but is appropriate for use in scripts, cron jobs, etc.
Example:
dsh -Mg all-machines -F 20 'do something'
-M: Prepend any line of output with the machine that emitted it
-g: runs the group all-machines (just a text file in etc/dsh/group)
-F 20: forks at most 20 copies of ssh in the background so you don't overload the server you're running this from
Good point about not needing semicolons for multiple-line stuff (assuming the EOL's are not escaped, as you have it in your example). I blame the PHP I spent all week immersed in...bleh.
This like these always makes me uneasy. Yes, you can do stuff on X number of machines all at the same time. That also means you can break things all at the same time.
Only use I can see if for multi-system stats - which should be handled differently anyhow, but that's a different story. Perhaps running htop, bwm-ng, iftop or other similar tools. Would certainly be scary to do anything other than that...
I use csshx, and I highly recommend it. One annoyance is that on password entry screens it occasionally does not show the password prompt. But generally speaking it's a great utility.
This tool looks awesome. For some of us, it's the first time at the running 20 EC2 instances at once rodeo, and a tool like this is helpful for testing and developing the parallelization and maintenance tasks that everyone else is being condescending about.
This seems like something that would be much better if integrated into a tool like Fabric or Capistrano that already knows how to send SSH commands to a bunch of different servers.
Does anything like that exist? I guess the downside would be fixing problems if your command failed in 1 or 2 of 10 or 20 servers… Then you'd have to open up a separate session to those servers to figure out what was going on.
Cluster SSH is a terrific tool. When I learned of it I coded up a quick python script to play selected tracks of MIDI files and used CSSH to play Bach's Toccata and Fugue in D minor polyphonically on ~20 computers' PC speakers.
It was also fun to terrify first year students with 20 cd trays ejecting at the same time...
C-b % [n times, n panes]
C-b M-5 [tiled layout]
### ssh into your servers in each pane, or whatever
C-b : setw sy <tab> [short for "synchronize-panes"]
### have synced fun!
This is a great tool to do mass changes to our 1200 CPU compute cluster. The best part about this is, it will map all of the hosts with the same output together and reduce this down to just one instance of the output, with the affected hostnames listed together. So instead of 500 instances of the same output data I get one. This comes in handy for finding hosts which are different than what I'm looking for.
Simple example:
--------------------------------------------------------------------------------
compute[0009,0051,0187] (3 HOSTS)
--------------------------------------------------------------------------------
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rootvg-rootlv
58G 14G 42G 25% /
--------------------------------------------------------------------------------
compute[0013,0038,0044,0046,0065,0103,0125,0142,0195,0213,0216,0234] (12 HOSTS)
--------------------------------------------------------------------------------
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rootvg-rootlv
58G 11G 44G 19% /
--------------------------------------------------------------------------------
compute0247 (1 HOST)
--------------------------------------------------------------------------------
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rootvg-rootlv
58G 7.6G 47G 15% /
I suppose april fools is the reason we've gotten so far through this discussion that only scattered mentions of fabric or puppet/chef?
I've certainly done my share of ssh in a for loop, but if you're seriously considering this you almost certainly want to look into puppet/chef/cfengine/etc.
Now that <a href="http://devstructure.com>blueprint</a>; exists, it's radically simple to turn your current environment into chef/puppet deploy script. That said, distributed shell tools like this are still tremendously useful and should be part of any cluster stack.
60 comments
[ 2.9 ms ] story [ 125 ms ] threadExactly.
One-offs are easy to test interactively with cssh, and despite what anyone thinks, there are always one-offs in the real world.
In short, use automation with care.
Thank you for this comment, I never knew you could pass commands to ssh.
Example:
dsh -Mg all-machines -F 20 'do something'
-M: Prepend any line of output with the machine that emitted it
-g: runs the group all-machines (just a text file in etc/dsh/group)
-F 20: forks at most 20 copies of ssh in the background so you don't overload the server you're running this from
Good point about not needing semicolons for multiple-line stuff (assuming the EOL's are not escaped, as you have it in your example). I blame the PHP I spent all week immersed in...bleh.
It's under 15 identical machines, so it is more trouble than it is worth to set up Puppet or something of that sort.
I use fabric http://fabfile.org/ which is insanely easy to use.
I use it even if I have one machine to deploy to. Better keep them deployments repeatable ...
Came in useful from time-to-time.
also for clusters i wrote a python script using libcloud that connects multiple terminals and does some bastardized map/reduce type helper ideas:
http://gist.github.com/281504
http://www.iterm2.com
Does anything like that exist? I guess the downside would be fixing problems if your command failed in 1 or 2 of 10 or 20 servers… Then you'd have to open up a separate session to those servers to figure out what was going on.
It was also fun to terrify first year students with 20 cd trays ejecting at the same time...
http://taktuk.gforge.inria.fr/kanif/
This is a great tool to do mass changes to our 1200 CPU compute cluster. The best part about this is, it will map all of the hosts with the same output together and reduce this down to just one instance of the output, with the affected hostnames listed together. So instead of 500 instances of the same output data I get one. This comes in handy for finding hosts which are different than what I'm looking for.
Simple example:
I've certainly done my share of ssh in a for loop, but if you're seriously considering this you almost certainly want to look into puppet/chef/cfengine/etc.