Python 结构-测试到多个主机的SSH连接
我有一个Python脚本,它使用fabric库测试到多个主机的SSH连接。我想在一个列表中收集所有结果:Python 结构-测试到多个主机的SSH连接,python,ssh,fabric,Python,Ssh,Fabric,我有一个Python脚本,它使用fabric库测试到多个主机的SSH连接。我想在一个列表中收集所有结果: ... import fabric from fabric.api import * results = [] @parallel def test_connection(): global results try: run('ls') results += "%s: SUCCESS" % env.host except Exception as e:
...
import fabric
from fabric.api import *
results = []
@parallel
def test_connection():
global results
try:
run('ls')
results += "%s: SUCCESS" % env.host
except Exception as e:
results += "%s: FAILURE. Exception: %e" % (env.host, e)
if __name__ == '__main__':
tasks.execute(test_connection)
print results
当我执行脚本时,我得到以下结果:
Traceback (most recent call last):
File "./test_ssh.py", line 99, in <module>
tasks.execute(test_connection)
File "/Library/Python/2.7/site-packages/fabric/tasks.py", line 387, in execute
multiprocessing
File "/Library/Python/2.7/site-packages/fabric/tasks.py", line 277, in _execute
return task.run(*args, **kwargs)
File "/Library/Python/2.7/site-packages/fabric/tasks.py", line 174, in run
return self.wrapped(*args, **kwargs)
File "./test_ssh.py", line 96, in test_connection
results += "%s: FAILURE. Exception: %e" % (env.host, e)
UnboundLocalError: local variable 'results' referenced before assignment
回溯(最近一次呼叫最后一次):
文件“/test_ssh.py”,第99行,在
任务。执行(测试\u连接)
文件“/Library/Python/2.7/site packages/fabric/tasks.py”,第387行,在execute中
多处理
文件“/Library/Python/2.7/site packages/fabric/tasks.py”,第277行,在
返回任务。运行(*args,**kwargs)
文件“/Library/Python/2.7/site packages/fabric/tasks.py”,第174行,正在运行
返回自包装(*args,**kwargs)
文件“/test\u ssh.py”,第96行,在test\u连接中
结果+=%s:失败。异常:%e“%(环境主机,e)
UnboundLocalError:赋值前引用的局部变量“results”
我认为这是因为test\u connection
运行它自己的上下文,所以它无法访问结果
还有其他方法可以收集我的结果吗?诀窍是,您可以实际返回并行执行的结果:
@parallel
def test_connection():
try:
run('ls')
return True
except Exception:
return False
现在,当您调用任务时,您将获得:
result = execute(test_connection)
results = [ ('HOST %s succeeded' % key) if value else ('HOST %s failed' % key) for key, value in result.items() ]
您可能希望将
附加到结果
,而不是+=
<代码>结果+='test'结果为['t','e','s','t']
。也许你应该在没有并行代码的情况下尝试一下