About PSSH
If we are managing a large number of servers , there are times when we need to execute the same command on all the servers. Sometimes need to copy a file to multiple hosts. For these tasks we can login to each of the servers and execute the command or write a script to automatize the task. Logging to each of the servers and executing a command will take a long time and writing a script to automize the task will need a initial effort. In such cases , tools like pssh , pconsole , Clusterssh comes handy. In this post , we will see how to use pssh.
The pssh manual page says "pssh is a program for executing ssh in parallel on a number of hosts. It provides features such as sending input to all of the processes, passing a password to ssh, saving output to files, and timing out.
Installing PSSH
Pssh is written using python. The installation steps are somewhat different from the traditional method of using the make the 'make' tool to compile a program and then install it. The steps are as follows:
1. Download pssh :
wget http://code.google.com/p/parallel-ssh/downloads/detail?name=pssh- 2.3.1.tar.gz
2. Installing pssh
1.
$tar zxvf pssh-2.3.1.tar.gz
$cd pssh-2.3.1
2. If we don't have setuptools installed , get it downloaded from Internet.
$ wget 'http://peak.telecommunity.com/dist/ez_setup.py'
$ sudo python ez_setup.py
For the above two steps , if there is no Internet access , then we need to download the following two programs from a machine having internet access and copy it to the installing machine under pssh-2.3.1 directory.
$ wget 'http://peak.telecommunity.com/dist/ez_setup.py'
$ wget 'http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c11-py2.4.egg'
$ cp ez_setup.py pssh-2.3.1/
$ cp setuptools-0.6c11-py2.4.egg pssh-2.3.1/
Then execute the following command.
$ sudo python ez_setup.py
Following is the output of the above command.
$ sudo python ez_setup.py
Processing setuptools-0.6c11-py2.4.eggcreating /usr/lib/python2.4/site-packages/setuptools-0.6c11-py2.4.eggExtracting setuptools-0.6c11-py2.4.egg to /usr/lib/python2.4/site-packagesAdding setuptools 0.6c11 to easy-install.pth fileInstalling easy_install script to /usr/binInstalling easy_install-2.4 script to /usr/binInstalled /usr/lib/python2.4/site-packages/setuptools-0.6c11-py2.4.eggProcessing dependencies for setuptools==0.6c11Finished processing dependencies for setuptools==0.6c11
3. If all goes fine , we will execute the below command.
$ sudo python setup.py install
With this , we are done installing 'pssh' .
Using PSSH
Usage: pssh [OPTIONS] command [...]
Important options are:
-h host_file :
Read hosts from the given host_file.
-H host string :
Adding hostnames on the commandline
-l user :
Login to hosts using that user
-o outdir :
Save standard output to files in the given directory.
-A :
Prompt for a password and pass it to ssh.
-i :
Display standard output and standard error as each
host completes.
-O : SSH options in the format used in the SSH configu-
ration file
Examples
1. Supplying hostnames in commandline
$ pssh -A -i -H "node1.example.com node3.example.com" "-O StrictHostKeyChecking=no" -l ssdg uptime
Warning: do not enter your password if anyone else has superuserprivileges or access to your account.Password: [1] 06:22:58 [SUCCESS] node1.example.com 06:22:58 up 3:45, 0 users, load average: 1.07, 1.06, 1.04[2] 06:22:58 [SUCCESS] node3.example.com 06:22:58 up 6:02, 0 users, load average: 2.60, 2.55, 2.54
The -A option will prompt for the password
-i option will display output and error on standard output
-O StrictHostKeyChecking=no : SSH option not to perform Strict
HostKeyChecking
2. Supplying hostnames in a file rather than reading from commandline
$cat nodes.txt
node1.example.com
node3.example.com
$ pssh -h nodes.txt -A -l root -o /tmp/foo uptimeWarning: do not enter your password if anyone else has superuserprivileges or access to your account.Password: [1] 06:15:48 [SUCCESS] node1.example.com[2] 06:15:48 [SUCCESS] node3.example.com
[root@masternode ~]# cat /tmp/foo/nodenode1.example.com node3.example.com
[root@masternode ~]# cat /tmp/foo/node1.example.com
06:15:48 up 3:38, 0 users, load average: 1.00, 1.03, 1.04
[root@masternode ~]# cat /tmp/foo/node3.example.com
06:15:48 up 5:55, 0 users, load average: 2.75, 2.59, 2.55
[root@masternode ~]#