Paramiko - Implementación para el uso de SSH

imagen / reynermedia
  
27 de Noviembre de 2015   1  

Hace unos meses atrás tuve la necesidad de comenzar a automatizar diferentes procesos en los servidores de producción donde tengo algunos proyectos escritos en Python y lo primero que se me vino a la mente fue utilizar Fabric. Lamentablemente esta  librería (que por cierto es muy famosa) aún no cuenta con soporte para Python 3, es exclusivo para Python 2.5 a 2.7, increiblemente cierto! pero bueno! necesitaba cubrir diferentes requerimientos de automatización en la oficina y no podía quedarme con los brazos cruzados. 

Afortunadamente, encontré que Fabric se encuentra desarrollado con una librería muy buena llamada Paramiko que, a pesar de ser más sencilla y con funciones más crudas para el uso de SSH, ofrece soporte para Python 2.6+ a 3.3.+ lo que hace que sea mucho más sofisticado que Fabric.

El día de hoy les mostraré algunos ejemplos muy pequeños de cómo utilizar esta librería y ya lo demás lo dejaré a su imaginación para generar scripts más potentes para correr en sus servidores remotos :)

Instalación.

La recomendación es siempre instalar paramiko utilizando pip de la siguiente manera:

pip install paramiko

 

Estableciendo una conexión inicial.

Antes de ejecutar algún comando en nuestro servidor vía ssh, necesitamos crear un objeto del tipo SSHClient el cual será el encargado de enviar todas nuestras peticiones al servidor y manejar las respuestas que sean devueltas. Este código lo he envuelto en una función y me ha quedado de la siguiente manera:

import paramiko

def get_connection():
    ssh = paramiko.SSHClient()  # Iniciamos un cliente SSH
    ssh.load_system_host_keys()  # Agregamos el listado de host conocidos
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # Si no encuentra el host, lo agrega automáticamente
    ssh.connect('itnovaretest.ddns.net', username='root', password='iso120625')  # Iniciamos la conexión.
    return ssh

 

Ejemplo de uso.

Suponiendo que necesitamos reiniciar nuestro servidor web nginx y gunicorn para actualizar los cambios finalizados en un proyecto Django, podríamos utilizar el siguiente script:

def restart_nginx(ssh_obj):
    stdin, stdout, stderr = ssh_obj.exec_command("sudo service nginx restart")


def reload_supervisor(ssh_obj):
    stdin, stdout, stderr = ssh_obj.exec_command("sudo supervisorctl reload")


def restart_services():
    print("Iniciamos la conexión")
    ssh_obj = get_connection()
    print("Reiniciamos nginx")
    restart_nginx(ssh_obj)
    print("Reiniciamos supervisor")
    reload_supervisor(ssh_obj)
    print('Finalizado correctamente')


restart_services()

 

Aquí vemos que la función principal es "restart_services" que solamente manda llamar a la función "restart_nginx" y "reload_supervisor", pasando siempre como primer parámetro la conexión previamente establecida con nuestro servidor.

¿Sencillo verdad? Esta es una pequeña demostración de lo fácil que es utilizar esta librería y espero que les pueda servir para trabajar en alguno de sus proyectos.



Alex Dzul

FullStack Python / Django Developer. #jslove

Temas relacionados