Ejecutando comandos en multiples servidores

Uno de los problemas con los que me he encontrado en estas ultimas semanas es la de trabajar de manera sistemática ejecutando el mimo comando sobre varios servidores (un poco menos 200 servidores).

Debido a que esto es mas que molesto (sobre todo por lo rutinario), entonces recordando el viejo comando "expect" empecé a buscar algún script para poder automatizar un poco este tipo de tarea.

Así es como me encontré con los el repositorio de script de nixCraft, de donde rescate un simpático script para poder ingresar a un servidor ssh pasando de parametro la clave, el servidor y el comando a ejecutar.

Despues de unas modificaciones al script el mismo quedo algo mas o menos asi:

#!/usr/bin/expect -f
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# For use:
# ./sshlogin.exp password server command arg1
#
# ----------------------------------------------------------------------
# Basado en http://bash.cyberciti.biz/security/expect-ssh-login-script/
# ----------------------------------------------------------------------

# set Variables
set password [lrange $argv 0 0]
set ipaddr [lrange $argv 1 1]
set scriptname [lrange $argv 2 2]
set arg1 [lrange $argv 3 3]
set timeout -1

# now connect to remote UNIX box (ipaddr) with given script to execute
spawn -noecho ssh -o "ConnectTimeout 10" root@$ipaddr $scriptname $arg1
match_max 100000

expect {
# first time
"*continue connecting*" { send -- "yes\r"; exp_continue }

# for passphase key
"*passphrase*" { send -- "$password\r"; exp_continue }

# for password
"*assword*" { send -- "$password\r"; exp_continue }

# for timeout
"timeout" { exit }
}


Con ese script podemos, por ejemplo saber cuanto tiempo lleva encendido alguno de nuestros servidores:

./sshlogin.exp la_clave el_server uptime

Con esto, solo hemos resuelto la mitad del problema, que es poder ejecutar el comando sin tener que esperar a que nos pida la clave. Pero la segunda parte es la mas facil.

Vamos a partir generando un archivo con los servidores y sus claves, algo asi como:

servidor_1:clave_1
servidor_2:clave_2
servidor_3:clave_3

Y con un simple script como el siguiente, podemos recorrer el listado de servidores y claves y ejecutar el comando en todos ellos:

#!/bin/bash
mkdir -p log
for linea in `cat server.lst`
do
server=`echo $linea |awk -F":" '{ print $1 }'`
clave=`echo $linea |awk -F":" '{ print $2 }'`

./sshlogin.exp $clave $server "(wget -q -O - http://miservidorweb.com/inventario.sh|bash)" > log/$server
done

Con esto podemos descargar un script de un servidor y ejecutarlo en el servidor remoto y guardar el resultado en la maquina local.

2 comentarios:

MAbeeTT

5 de enero de 2009, 19:15

¿Puede ser que el último blockquote esté vacío? ¿Y que eso sea un error :P?

Saludus!!

Pablo Vargas

5 de enero de 2009, 23:09

Efectivamente el primer script (sshlogin.exp) tenia un error, producto de tocar el script a ultimo momento. :)

Ahi quedo corregido y funcionando sin problemas.

Gracias.