Scripts for testing multiple XOs: Difference between revisions
m (New page: == 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...) |
m (→Introduction) |
||
Line 2: | Line 2: | ||
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, name of the script, and timestamp). |
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, name of the script, and timestamp). |
||
== Ideal use scenario == |
|||
Given the following files... |
|||
<pre> |
|||
in xo-ip-list.txt |
|||
------------------- |
|||
12.34.56.01 |
|||
12.34.56.02 |
|||
12.34.56.03 |
|||
<pre> |
|||
<pre> |
|||
in run-this-script.sh |
|||
----------------------- |
|||
#!/bin/bash |
|||
ps |
|||
</pre> |
|||
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. |
|||
<pre> |
|||
mchua@master-machine:~$ ./test-multiple-xos --iplist xo-ip-list.txt --script run-this-script.sh --folder testresults |
|||
</pre> |
|||
...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. |
|||
<pre> |
|||
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 |
|||
</pre> |
|||
== Procedure so far == |
== Procedure so far == |
Revision as of 20:08, 29 October 2008
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, name of the script, and timestamp).
Ideal use scenario
Given the following files...
in xo-ip-list.txt ------------------- 12.34.56.01 12.34.56.02 12.34.56.03 <pre> <pre> 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<=255;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.