Scripts for testing multiple XOs
Introduction
Problem to solve: From a central machine, execute a bash script on a given list of IP addresses (of XOs). End with the output of the script on each XO in text documents in the central machine (one per XO, titled with the XO's IP address and name of the script).
Ideal use scenario
Given the following files...
in xo-ip-list.txt ------------------- 12.34.56.01 12.34.56.02 12.34.56.03
in run-this-script.sh ----------------------- #!/bin/bash ps
I should be able to run a command like this, which will remotely run run-this-script.sh on the list of XOs at the IP addresses in xo-ip-list.txt, and save the results to a folder called testresults.
mchua@master-machine:~$ ./test-multiple-xos --iplist xo-ip-list.txt --script run-this-script.sh --folder testresults
...and then see something like this, where each textfile contains the output of run-this-script.sh on the XO whose IP is in its filename.
mchua@master-machine:~$ ls testresults 12.34.56.01-run-this-script.sh.txt 12.34.56.02-run-this-script.sh.txt 12.34.56.03-run-this-script.sh.txt
Procedure so far
- generate a public/private key on your master machine
- copy the public key (~/.ssh/id_dsa.pub) onto all the XOs (/home/olpc/.ssh/authorized_keys)
- make sure the authorized_keys only has write access for user (chmod g-w usually all that's needed)
- then from your master you can remotely run commands as needed (ssh olpc@192.168.1.5 ps aux)
Things left to do
- Write harness that gives the output of the script on each XO in text documents in the central machine (one per XO, titled with the XO's IP address, name of the script, and timestamp).
Known Issues
(From Gary C. Martin)
One thing you'll need to resolve is getting the list of all IP addresses, the three XOs here occasionally play tricks on me (DHCP timeout) and change addresses, so I need to clean out host keys in ~/.ssh/known_hosts from time to time. I guess you could also tell ssh to switch off it's strict host checking. Here's a really quick stab at scanning some subnet and getting the list of active IP addresses to try some other script on:
for (( i=1;i<=254;i+=1 )); do ping -q -c 1 -t 1 192.168.1.${i} > /dev/null && echo 192.168.1.${i}; done
Notes: I've reduced the ping time-out to just wait 1sec before assuming no one is home, this lets the script complete in 1sec per IP address. If you're just testing, trying to ctrl-c out of any for loop is a pain :-) use ctrl-z and then kill % or wait till the script is done.