2017-05-19 2 views
2

Ich versuche, Paramiko als SSH-Client für eine Reihe von Skripts, die ich derzeit habe, Paramiko zu ersetzen, bis jetzt kam ich mit diesem Entwurf zum Testen :Python SSH: Verwenden von fabric.api als Alternative zu paramiko

ssh_handler.py

import sys 
from fabric.api import run 
from fabric.api import task 
from fabric.api import execute 
from fabric.network import disconnect_all 


def worker(command): 
    run(command) 


@task 
def cmd(host, command): 

    host_list = list() 

    if isinstance(host, (str, unicode)): 
     host_list.append(host) 

    elif isinstance(host, list): 
     host_list += host 

    else: 
     sys.exit(1) 

    # run the command 
    execute(worker(command), hosts=host_list) 

    # disconnect 
    disconnect_all() 

    return 

Wenn diese von einem anderen Skript ausgeführt wird, sagen wir mal:

testing.py

import ssh_handler 


node_list = ["192.168.0.1", "192.168.0.2"] 

for node in node_list: 
    ssh_handler.cmd(node, "uptime") 

Ergebnisse in:

./testing.py 
No hosts found. Please specify (single) host string for connection: ^C 

Könnte mir jemand auf die richtige Richtung? Warum kann nicht fabric.api.execute die Hosts Parameter während der Zeit der Ausführung erkennen?


Antwort:

Ich konnte es beheben, indem Sie diese:

import sys 
from fabric.api import run 
from fabric.tasks import execute 
from fabric.network import disconnect_all 


class FabricHelper: 
    def __init__(self): 
     self.host_list = list() 
     pass 

    def set_hosts(self, host): 

     if isinstance(host, (str, unicode)): 
      self.host_list.append(host) 
     elif isinstance(host, list): 
      self.host_list += host 
     else: 
      sys.exit(1) 
     return 

    def cmd(self, command): 
     execute(run, command=command, hosts=self.host_list) 
     disconnect_all() 
     return 


if __name__ == "__main__": 

    example = FabricHelper() 
    example.set_hosts(["10.200.10.51", "10.200.10.52"]) 
    example.cmd("uptime") 

Antwort

0

Ich bin ein bisschen von Ihrem Code verwirrt, execute im Allgemeinen eine Aufgabe auszuführen verwendet wird. Aber worker ist keine Aufgabe. Worker ist nur ein One-Liner, der ein Anruf zu einem Anruf ist. So scheint es mir tat worker kann gelöscht werden.

Zuerst fragte ich mich, was dieses Testframework ist, das Sie verwenden, dann erkannte ich, dass es nur eine andere Python-Datei mit dem Namen test ist!

Schließlich, statt all dieser aufwendigen Mechanismen, warum nicht einfach den Host in der env dictionary setzen?

Verwandte Themen