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 :

[pastacode lang= »python » manual= »import%20rpyc%0Afrom%20rpyc.utils.classic%20import%20upload_package%0Afrom%20rpyc.utils.zerodeploy%20import%20MultiServerDeployment%0Afrom%20rpyc.utils.zerodeploy%20import%20DeployedServer%0Afrom%20plumbum%20import%20SshMachine%0Aimport%20ldap3%0Aimport%20pyasn1%0A%0A%23%20create%20the%20deployment%0A%0Alist_host%3D%5B’mysrv.domain.lan’%5D%0Alist_ssh%3D%5B%5D%0A%0Afor%20f%20in%20list_host%3A%0A%20%20%20%20mach%20%3D%20SshMachine(f%2C%20user%3D%22root%22%2C%20keyfile%3D%22%2Fhome%2Fuser%2F.ssh%2Fid_ed25519%22%2Cport%3D%2222%22)%0A%20%20%20%20list_ssh.append(mach)%0A%0A%0Adef%20get_etc_file()%3A%0A%20%20%20%20import%20glob%0A%20%20%20%20allfile%20%3D%20%5B%5D%0A%20%20%20%20for%20i%20in%20glob.glob(‘%2Fetc%2F*’)%3A%0A%20%20%20%20%20%20%20%20allfile.append(i)%0A%20%20%20%20return%20allfile%0A%0Adef%20get_ldap_version()%3A%0A%20%20%20%20import%20ldap3%0A%20%20%20%20return%20ldap3.__version__%0A%0A%0Adep%20%3D%20MultiServerDeployment(list_ssh)%0Aconns%20%3D%20dep.classic_connect_all()%0A%0Afor%20conn%20in%20conns%3A%0A%0A%20%20%20%20run_get_etc_file%20%3D%20conn.teleport(get_etc_file)%0A%20%20%20%20print(run_get_etc_file())%0A%0A%20%20%20%20rpyc.classic.upload_package(conn%2C%20ldap3)%0A%20%20%20%20rpyc.classic.upload_package(conn%2C%20pyasn1)%0A%20%20%20%20run_get_ldap_version%20%3D%20conn.teleport(get_ldap_version)%0A%0A%20%20%20%20print(run_get_ldap_version())%0A » message= »Exemple rpyc » highlight= » » provider= »manual »/]

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.