Fabric - исключение ThreadingGroup останавливает оставшиеся запросы? - PullRequest
0 голосов
/ 13 декабря 2018

Я новичок в Fabric и хотел бы выполнить ряд команд параллельно с некоторыми удаленными SSH-серверами.

Похоже, что для этого мне следует использовать ThreadingGroup, что я могу сделать,и, кажется, работает.

Моя единственная реальная проблема заключается в том, что я хотел бы понять, как обрабатывать случаи ошибок и как передавать список серверов в виде строки, которую я получаю из файла иликомандная строка.

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 08 августа 2019

Этот скрипт не будет работать должным образом, если неисправное устройство указано в качестве первого хоста!все еще не уверен, почему.

, поэтому, если: 1.1.1.1 вверх и 2.2.2.2 вниз

, тогда будет работать "1.1.1.1,2.2.2.2".«2.2.2.2,1.1.1.1» будет работать, но также и из-за ошибок на экране.

0 голосов
/ 13 декабря 2018

Я нашел пример в проблеме github и расширил его, чтобы он работал для моего варианта использования ... надеюсь, это поможет!

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 $5}'"
        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
...