2014-08-29 43 views
0

我有一个项目,我需要ssh到大量的服务器频繁地调用一个命令。我认为这是可能的从一个python脚本,但我的要求似乎消除所有潜在的解决方案。我只能从中间堡垒服务器访问服务器,并且只能使用与ssh代理一起转发的ssh公钥。因此,我的要求是:如何通过ssh代理与ssh代理并行执行ssh代理以在python中进行身份验证?

  • 并行的ssh,所以我不是等待数小时到所有服务器上运行命令完成
  • SSH公钥的支持,我无法使用密码认证
  • SSH进行代理的支持,我不能没有通过SSH代理服务器去
  • SSH代理支持直接ssh到服务器,因为我需要让我的(预加载)SSH公钥通过代理服务器发送到服务器

paramiko似乎提供了以上所有的第一个要求(并行ssh支持)的例外。我发现了一个parallel-ssh模块(https://github.com/pkittenis/parallel-ssh),它可以作为paramiko的一个薄包装器,但是,它似乎缺少对并行ssh和公钥验证以外的其他任何API的支持。

这里是我已经有了,现在,这几个地方的服务器不需要代理或ssh代理访问的工作原理:

#!/usr/bin/python2.7 

import sys 
if 'threading' in sys.modules: 
     raise Exception('threading module loaded before patching!') 
import gevent.monkey; gevent.monkey.patch_thread() 
import paramiko 
from pssh import ParallelSSHClient 

paramiko.util.log_to_file("filename.log") 
hosts = ['ocb100','netllama'] 
client_key = paramiko.DSSKey.from_private_key_file('/home/netllama/.ssh/id_dsa') 
client = ParallelSSHClient(hosts, pkey=client_key) 

cmds = client.exec_command('uptime') 
+0

考虑Fabric - 它专门设计用于在许多ssh'd服务器上运行命令。 HTTP://www.fabfile。org/ – johntellsall 2014-08-29 21:16:04

+0

您可以在不同线程中同时运行多个paramiko客户端。那是你需要的吗? – tdelaney 2014-08-29 21:51:07

+0

我希望避免管理线程的开销,但如果这是唯一的方法来获得我需要去的地方,我会试试看。 – netllama 2014-08-30 01:08:29

回答

0

你前面提到的能满足并行-SSH模块你的要求。特别是对于代理和代理转发:

  • SSH代理支持 - 本地代理和隧道的支持,也是异步
  • SSH代理转发 - 默认被启用。 forward_ssh_agent=True创建一个ParallelSSH对象。

你使用ParallelSSH例如:

from pssh import ParallelSSHClient 
hosts = ['ocb100','netllama'] 
client = ParallelSSHClient(hosts, proxy_host='bastion') 
output = client.run_command('uptime') 
for host in output: 
    for line in output[host]['stdout']: 
     print(line) 

执行从一个运行SSH代理自动加载的上述用户SSH密钥,你不需要指定pkey说法。

如果您需要更改登录的用户,可以设置user参数,例如ParallelSSHClient(hosts, user='netllama')

根据this issue,在9月4日向ParallelSSH添加了SSH代理转发支持。

ParallelSSH已经使用gevent按照文档异步执行所有网络请求,它不使用线程或多处理,例如结构。你为此不需要那些gevent进口。

ParallelSSH的文档是here

编辑:更新了最新库API