paint-brush
Automatización de la implementación a través de SSH con Python Fabric: cómo funcionapor@agzuniverse
12,600 lecturas
12,600 lecturas

Automatización de la implementación a través de SSH con Python Fabric: cómo funciona

por Aswin G5m2021/04/17
Read on Terminal Reader
Read this story w/o Javascript

Demasiado Largo; Para Leer

Python Fabric es una biblioteca de Python de código abierto que se utiliza para ejecutar comandos de forma remota a través de SSH. Fabric es compatible con Python 2 y 3 y se puede usar para implementar un proyecto básico en un servidor remoto a través de Gitlab CI usando Python Fabric. Fabric usa una biblioteca llamada Paramiko debajo del capó para manejar el lado SSH de las cosas, podemos pasar argumentos al cliente SSH de Paramiko. Paramiko es un administrador de contexto de Python con la ayuda de los administradores de contexto de Python, pero también hay muchas otras formas de hacerlo.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Automatización de la implementación a través de SSH con Python Fabric: cómo funciona
Aswin G HackerNoon profile picture

Una de las formas más básicas en que se implementa un proyecto es mediante SSH en un host remoto seguido de la ejecución de algunos comandos básicos. Además de la implementación, esto también puede ser útil para ejecutar cualquier comando que desee en un host remoto, como cuando se activa una canalización de CI/CD. En este artículo, analizaré cómo implementar un proyecto básico en un servidor remoto a través de Gitlab CI usando Python Fabric.

¿Qué es la tela?

Fabric es una biblioteca de Python de código abierto que se utiliza para ejecutar comandos de forma remota a través de SSH.

Fabric es compatible con Python 2 y 3. Para usarlo con Python3, instálelo con:

 pip3 install fabric

Dado que el objetivo final aquí es usar Fabric en una canalización de implementación automatizada, en realidad no necesita tener Fabric instalado en su máquina local (a menos que sea allí donde se ejecute su canalización).

La instalación de fabric también instala el

 fab
stub binario, que esencialmente permite que fabric lea y ejecute comandos definidos en un archivo llamado fabfile.

Creando un archivo fab

Crear un archivo llamado

 fabfile.py
y comenzar con el siguiente código:

 from fabric import task @task def deploy (ctx) : print( "Inside the task!" )

Esto define una tarea llamada "implementar" que se puede pasar como argumento al binario fabuloso para su ejecución. los

 @task
decorador (que es el equivalente en Python de un cierre: una subrutina que toma otra subrutina como parámetro o devuelve otra subrutina) se usa para convertir el
 deploy
función a una tarea que puede ser ejecutada por el binario fabuloso. La función debe tomar un argumento de contexto, que se da como
 ctx
en este caso.

Al ejecutar esto ejecutando

 fab deploy
del mismo directorio que
 fabfile.py
, "¡Dentro de la tarea!" se imprimirá como salida.

Ahora, use esto para hacer lo que Fabric está diseñado: conectar un host remoto y ejecutar comandos en él.

 from fabric import Connection, task @task def deploy (ctx) : with Connection( "HOST" ) as c: with c.cd( "/home/project/path/" ): c.run( "docker-compose down" ) c.run( "git pull origin master --recurse-submodules --rebase" ) c.run( "docker-compose up --build -d" )

Aquí, reemplaza

 HOST
con el nombre o la dirección IP del host al que está estableciendo una conexión. Desde allí, puede ejecutar cualquier comando que el usuario con el que ha iniciado sesión tenga permiso para ejecutar.
 c.cd()
se utiliza para garantizar que los comandos restantes se ejecuten desde esa carpeta en particular. Las órdenes que he dado después de esto con
 c.run()
son solo ejemplos. Reemplácelos con lo que necesita ejecutar.

En este ejemplo, uso los administradores de contexto de Python con la ayuda de

 with
bloques, pero hay muchas otras maneras de hacer esto también. Puede leer la documentación de Fabric para explorar otras formas de hacer esto.

A estas alturas, es posible que haya notado que solo el nombre de host a menudo no es suficiente para establecer una conexión. ¿Qué pasa con el nombre de usuario y la clave privada para establecer una conexión SSH? Esto no es inmediatamente obvio, pero debido a que Fabric usa una biblioteca llamada Paramiko bajo el capó para manejar el lado SSH de las cosas, podemos pasar argumentos a Paramiko.

 SSHclient.connect
método usando el
 connect_kwargs
argumento en Fabric's Connection. Esto se parece a lo siguiente:

 from fabric import Connection, task @task def deploy (ctx) : with Connection( "HOST" , user= "USERNAME" , connect_kwargs={ "key_filename" : "~/.ssh/your_key" } ) as c: with c.cd( "/home/project/path/" ): c.run( "docker-compose down" ) c.run( "git pull origin master --recurse-submodules --rebase" ) c.run( "docker-compose up --build -d" )

de paramiko

 SSHclient.connect
toma una
 key_filename
argumento, que especifica el nombre de archivo de la clave que se utilizará. Ahora está pasando toda la información necesaria para establecer una conexión a través de SSH.

También puede pasar la clave SSH como una instancia de Paramiko

 pkey.Pkey
class, o hacer uso de un montón de otras opciones, que puede encontrar en la documentación de Paramiko .

Por supuesto, es mucho más seguro cargar todo esto como variables de entorno. Al usar Gitlab CI, mientras configura las variables de entorno, puede elegir que la clave esté disponible como un archivo en lugar de una cadena, que es necesaria para que funcione con el

 key_filename
argumento.

Aquí hay una captura de pantalla de la sección Variables en la configuración de Gitlab CI/CD con el nombre de host agregado como una cadena y la clave agregada como un archivo.

Es posible que desee cargar estos valores de otras formas según cómo esté organizado su equipo y según sus requisitos de seguridad.

Con estas variables de entorno en su lugar, el fabfile cambia a esto:

 import os from fabric import Connection, task @task def deploy (ctx) : with Connection( os.environ[ "HOST" ], user= "USERNAME" , connect_kwargs={ "key_filename" : os.environ[ "DEPLOY_KEY_FILE" ]}, ) as c: with c.cd( "/home/project/path/" ): c.run( "docker-compose down" ) c.run( "git pull origin master --recurse-submodules --rebase" ) c.run( "docker-compose up --build -d" )

Configuración de Gitlab CI

Ahora que el archivo fab está listo, todo lo que tenemos que hacer es ejecutarlo con el paquete Python Fabric. Esto se puede hacer de la forma que desee: manualmente, usando acciones de Github, etc. Aquí tengo un ejemplo de cómo ejecutarlo con el CI de Gitlab.

Para ello, crea un

 .gitlab-ci.yml
archivo en la raíz del proyecto. A continuación se muestra un ejemplo:

 image: "python:3.6" stages: - deploy deploy_to_production: stage: deploy script: - pip3 install fabric - fab deploy only: - master

Este es un archivo de configuración básico que debería ser fácil de entender si está familiarizado con el CI de Gitlab. Solo tiene un trabajo llamado

 deploy_to_production
que ejecuta dos cosas (Usa una imagen de Python 3 como base):
 pip3 install fabric
para instalar Fabric, y
 fab deploy
, lo que hace que Fabric lea nuestro
 fabfile.py
y ejecute la tarea llamada "implementar" en él.

Conclusión

Fabric tiene muchas más opciones que las que se describen aquí, como enviar la contraseña de sudo al host remoto cuando sea necesario, manejar múltiples hosts, etc. Vale la pena revisar su documentación si planea hacer uso de eso.

En conclusión, esta es una forma realmente simple y efectiva de crear scripts mediante programación para que se ejecuten a través de SSH y activarlos desde métodos comunes, como a través de una herramienta de CI/CD.

Espero que hayas encontrado útil esta publicación. Puedes encontrarme en Twitter y LinkedIn .