96598, Southpole
info@raskitoma.com

Como hacer que un servidor envíe una orden de reinicio(reboot) a otro

Created with Sketch.

reboot reiniciar

Resulta que en ocasiones necesitamos hacer que un servidor envíe una orden de reinicio(reboot) a otro, y esto, no es una tarea fácil.  Caso particular: Un servidor local NAS, que demora en inicializarse y monta los recursos compartidos en la red.  Otro servidor remoto que se inicializa rápidamente y necesita montar esos recursos del servidor local, que por el momento no están disponibles.

Con un par de simples comandos y configuraciones aqui y allá, les explicaré cómo hacerlo.

Requisitos

En el servidor a ser reiniciado (remoto)

Primero, debemos asegurarnos que exista un user que se le permita hacer uso del comando reboot.  La forma más sencilla es utilizar al user root y que este pueda conectarse mediante ssh. (también podemos utilizar un usuario con permisos para el efecto)

Para hacerlo basta con editar, en mi caso Ubuntu, el archivo sshd_config ubicado en /etc/ssh/sshd_config:

sudo nano /etc/ssh/sshd_config

Luego, ubicamos una sección con el nombre de «# Authentication:». Dentro de esta sección existirá el parámetro PermitRootLogin que estará comentado (es decir tiene un # antes del mismo). Simplemente bastará con editar esta linea, eliminando el #.  En caso de no existir este parámetro, lo ingresamos, de manera que esto quede así:

# Authentication:
#LoginGraceTime 2m
PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

Grabamos los cambios, y reiniciamos el servidor de SSH:

sudo service sshd restart

En el servidor que va a dar la orden (local)

En mi caso, el servidor local en dar la orden de reinicio, está basado en FreeBSD sin embargo voy a poner los comandos necesarios en Ubuntu.

Voy a usar uno de los jails de mi servidor local como «maquina para dar la orden», y lo hago por las siguientes razones:

  1. Los servicios de samba/afp, etc. son los primeros en arrancar.  Los jails, demoran un poco más.  Esto me asegura que los shares ya estén disponibles en la red ya que son el propósito de este ejercicio.
  2. Seguridad: la contraseña de un superusuario va a estar disponible.  Preferible esconderla dentro de un jail,

Instalar sshpass en el servidor local

sshpass es un comando que permite transmitir la contraseña de un usuario al comando ssh. Esto permitirá, en un solo comando, tener acceso al servidor al que vamos a enviar la orden de reinicio.

Para instalar sshpass, solo debemos ejecutar el siguiente comando:

pkg install sshpass

Y en ubuntu sería:

sudo apt-get install sshpass

Configurando sshpass

Para poder utilizar sshpass, debemos hacer una conexión al servidor remoto mediante ssh de manera tradicional, ya que necesitamos confirmar el RSA fingerprint.  Sino hacemos esto, sshpass no va a funcionar.

ssh root@<ip del servidor remoto>

Esto nos pedirá la contraseña, la misma que ingresamos. Cuando nos muestre la información del RSA fingerprint, simplemente respondemos «Y» (yes).

Una vez que estemos conectados al servidor remoto, simplemente ejecutaremos el comando exit para volver al prompt del servidor local.

Para probar que sshpass funciona, simplemente ejecutamos el siguiente comando en el servidor local:

sshpass -p <la contraseña> ssh root@<ip del servidor remoto>

Esto a continuación nos mostrará el prompt del servidor remoto, confirmando que la instalación ha sido correcta, sin necesidad de ingresar clave o contraseña alguna.

Enviando el comando de reinicio al servidor remoto

Para enviar el comando de reinicio, vamos a utilizar una de las propiedades de ssh que permite, en la misma linea de comandos, enviar instrucciones.  Esto, es de gran utilidad, no sólo para un ejercicio como el actual, sino para multiples aplicaciones.

Primero, debemos estar seguros que el servidor remoto al que vamos a enviar la orden de reinicio, no lo esté usando nadie. Una vez confirmado esto, simplemente debemos ejecutar este comando:

sshpass -p <la contraseña> ssh root@<ip del servidor remoto> reboot

Tan pronto lo ingresemos, nos responderá que la conexión fue «cerrada por el host», obviamente porque se está reiniciando.

Automatizando, porque sino, no tiene sentido…

Para automatizar el proceso de enviar la orden de reinicio(reboot) al servidor remoto, en nuestro servidor local debemos poner el comando dentro del crontab del servidor (en mi caso el crontab del jail).

Primero, lo más importante, cambiar el editor (detesto usar vi):

setenv VISUAL /usr/local/bin/nano

Este comando hará que el editor sea nano y no vi.  A continuación editaremos el crontab del servidor mediante el comando:

crontab -e

Al final de todas las entradas del crontab, ingresamos la siguiente linea:

@reboot sshpass -p <la contraseña> ssh root@<ip del servidor remoto> reboot

En lenguaje humano significa: «Al momento de terminar de reiniciar, ejecuta el siguiente comando: reinicia el servidor remoto»

Para probarlo, basta con reiniciar nuestro equipo local, obviamente asegurándonos que no haya usuarios conectados.  En mi caso fue más fácil ya que solo tuve que reiniciar el jail, que en la práctica es lo mismo:

iocage restart mi_jail

Nos daremos cuenta que una vez que completa de reiniciarse el servidor local, a continuación el remoto hará lo propio gracias a la orden de reinicio enviada.

Consideraciones finales

Esta guía hace uso de cuestiones un poco inseguras(permitir que un usuer root pueda hacer ssh, transmision de contraseña y grabado de la misma en un crontab), simplemente por cuestiones de simplicidad.

Sin embargo, en la red, pueden encontrar una guía de como crear un usuario en el servidor remoto con el único propósito y permisos para reiniciar el equipo.  Si consideran necesario, me dejan en los comentarios sus opiniones al respecto para escribir una guía de como lograr esto de aquí, que fue lo que finalmente hice en mi caso.

 

A %d blogueros les gusta esto: