Découverte Rpyc

Il y a peu de temps j’ai découvert RPYC https://rpyc.readthedocs.io/en/latest/

L’outil est pratique pour piloter des machines a distance a travers ssh.

Pourquoi ne pas utiliser Ansible  ?

Disons que c’est une méthode différente.
Ansible est très pratique (je l’utilise parfois), beaucoup de module et grosse communauté mais je préférerais écrire du python pour faire des boucle, des while etc, et je dois bien dire que je ne suis pas très fan du yaml …

RPYC permet de faire discuter deux connexion python ensemble, par exemple, je suis capable de créer une liste (python) sur un serveur1, de la récupérer sur mon poste (python local) pour la renvoyer via RPYC sur une connexion python du serveur2

Je découvre donc les possibilités, voici un bout de code d’exemple :


import rpyc 
from rpyc.utils.classic import upload_package 
from rpyc.utils.zerodeploy import MultiServerDeployment 
from rpyc.utils.zerodeploy import DeployedServer 
from plumbum import SshMachine 
import ldap3 
import pyasn1 
 
# create the deployment 
 
list_host=['mysrv.domain.lan'] 
list_ssh=[] 
 
for f in list_host: 
    mach = SshMachine(f, user="root", keyfile="/home/user/.ssh/id_ed25519",port="22") 
    list_ssh.append(mach) 
 
 
def get_etc_file(): 
    import glob 
    allfile = [] 
    for i in glob.glob('/etc/*'): 
        allfile.append(i) 
    return allfile 
 
def get_ldap_version(): 
    import ldap3 
    return ldap3.__version__ 
 
 
dep = MultiServerDeployment(list_ssh) 
conns = dep.classic_connect_all() 
 
for conn in conns: 
 
    run_get_etc_file = conn.teleport(get_etc_file) 
    print(run_get_etc_file()) 
 
    rpyc.classic.upload_package(conn, ldap3) 
    rpyc.classic.upload_package(conn, pyasn1) 
    run_get_ldap_version = conn.teleport(get_ldap_version) 
 
    print(run_get_ldap_version()) 

Dans l’exemple ici on a quelque chose d’intéressant, j’utilise rpyc.classic.upload_package, en gros les serveurs sur lequel je me connecte n’ont pas le paquet ldap3, mais il est installé sur ma machine, du coup avec rpyc je le pousse dans la connexion python instancier avec rpyc, (je le l’install pas sur le serveur !), et du coup il est utilisable. teleport lui me permet d’envoyer une fonction sur le python distant pour ensuite l’executer sur le distant. J’aime bien l’idée.

Je découvre l’outil et je vois un potentiel intéressant. Attention je n’ai pas fais de réel test en prod ni d’utilisation intensive, mais j’aime bien l’idée.