Fabric - ThreadingGroup 异常停止剩余的请求?
Fabric - ThreadingGroup exception stops remaining requests?
我是 Fabric 新手,想对一些远程 SSH 服务器并行执行一系列命令。
看来我应该使用 ThreadingGroup 来做这件事,我可以做到,而且似乎可行。
我唯一真正的问题是我想了解如何处理错误情况,以及如何将服务器列表作为字符串传递,这是我从文件或命令行中获取的。
我该怎么做?
我找到了 an example in a github issue,并将其扩展为适用于我的用例...希望对您有所帮助!
test.py
# requires fabric 2.x - run 'pip install fabric' to install it
import logging, socket, paramiko.ssh_exception
from fabric import Connection, Config, SerialGroup, ThreadingGroup, exceptions, runners
from fabric.exceptions import GroupException
# Note: You need to supply your own valid servers here to ssh to of course!
def main():
testHosts("All should succeed", "validServer1,validServer2,validServer3")
testHosts("Some should fail", "validServer1,validServer2,BADSERVER1,validServer3,BADSERVER2")
def testHosts(message, hostsAsString):
print("")
print(message)
# Get list of hosts from somewhere, and convert them to connections
hosts = hostsAsString.split(",")
servers = [Connection(host=host) for host in hosts]
# Create a thread group to run requests in parallel
g = ThreadingGroup.from_connections(servers)
try:
command = "df -h / | tail -n1 | awk '{print }'"
results = g.run(command, hide=True)
for r in results:
connection = results[r]
print("{}".format(r.host) )
print(" SUCCESS, " + connection.stdout.strip())
except GroupException as e:
# If an exception occurred, at least one request failed.
# Iterate through results here
for c, r in e.result.items():
print("{}".format(c.host) )
if isinstance(r,runners.Result) :
print(" SUCCESS, " + r.stdout.strip())
elif isinstance(r,socket.gaierror) :
print(" FAILED, Network error")
elif isinstance(r,paramiko.ssh_exception.AuthenticationException) :
print(" FAILED, Auth failed")
else:
print(" FAILED, Something other reason")
main()
产生以下输出
$ python test.py
All should succeed
validServer1
SUCCESS, 59%
validServer2
SUCCESS, 54%
validServer3
SUCCESS, 53%
Some should fail
validServer1
SUCCESS, 59%
validServer2
SUCCESS, 54%
validServer3
SUCCESS, 53%
BADSERVER1
FAILED, Network error
BADSERVER2
FAILED, Network error
我是 Fabric 新手,想对一些远程 SSH 服务器并行执行一系列命令。
看来我应该使用 ThreadingGroup 来做这件事,我可以做到,而且似乎可行。
我唯一真正的问题是我想了解如何处理错误情况,以及如何将服务器列表作为字符串传递,这是我从文件或命令行中获取的。
我该怎么做?
我找到了 an example in a github issue,并将其扩展为适用于我的用例...希望对您有所帮助!
test.py
# requires fabric 2.x - run 'pip install fabric' to install it
import logging, socket, paramiko.ssh_exception
from fabric import Connection, Config, SerialGroup, ThreadingGroup, exceptions, runners
from fabric.exceptions import GroupException
# Note: You need to supply your own valid servers here to ssh to of course!
def main():
testHosts("All should succeed", "validServer1,validServer2,validServer3")
testHosts("Some should fail", "validServer1,validServer2,BADSERVER1,validServer3,BADSERVER2")
def testHosts(message, hostsAsString):
print("")
print(message)
# Get list of hosts from somewhere, and convert them to connections
hosts = hostsAsString.split(",")
servers = [Connection(host=host) for host in hosts]
# Create a thread group to run requests in parallel
g = ThreadingGroup.from_connections(servers)
try:
command = "df -h / | tail -n1 | awk '{print }'"
results = g.run(command, hide=True)
for r in results:
connection = results[r]
print("{}".format(r.host) )
print(" SUCCESS, " + connection.stdout.strip())
except GroupException as e:
# If an exception occurred, at least one request failed.
# Iterate through results here
for c, r in e.result.items():
print("{}".format(c.host) )
if isinstance(r,runners.Result) :
print(" SUCCESS, " + r.stdout.strip())
elif isinstance(r,socket.gaierror) :
print(" FAILED, Network error")
elif isinstance(r,paramiko.ssh_exception.AuthenticationException) :
print(" FAILED, Auth failed")
else:
print(" FAILED, Something other reason")
main()
产生以下输出
$ python test.py
All should succeed
validServer1
SUCCESS, 59%
validServer2
SUCCESS, 54%
validServer3
SUCCESS, 53%
Some should fail
validServer1
SUCCESS, 59%
validServer2
SUCCESS, 54%
validServer3
SUCCESS, 53%
BADSERVER1
FAILED, Network error
BADSERVER2
FAILED, Network error