2017-05-19 11 views
2

私は現在ParamikoをSSHクライアントとして置き換える方法を考え出しています。これまでのところ、このドラフトを試してみました:Python SSH:paramikoの代わりにfabric.apiを使用する

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 

さんが言わせて、別のスクリプトからこれを実行する:

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") 

結果:

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

は誰が正しい方向に私を指すもらえますか?なぜできないfabric.api.executeは実行時にホストパラメータを認識しますか?


回答:私はこれを行うことにより、それを修正することができました

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") 

答えて

0

私はあなたのコードで混乱ビットは、executeは、一般的にタスクを実行するために使用されています。しかし、workerはタスクではありません。ワーカーは、実行する呼び出しの呼び出しである1つのライナーにすぎません。だからそれは私にはworkerを削除することができますと思われる。

最初に私はこのテストフレームワークがあなたが使用しているものが何であるか疑問に思っていました。それはtestという名前の別のpythonファイルだと分かりました!

最後に、これらの精巧なメカニズムの代わりに、env dictionaryにホストを設定するだけではどうですか?

関連する問題