Fabric: Bagaimana cara membaca hasil di ThreadingGroup selama kegagalan sebagian?

Dibuat pada 14 Mei 2018  ·  5Komentar  ·  Sumber: fabric/fabric

Akan lebih baik untuk memasukkan contoh itu di dokumen juga. Misalkan saya memiliki kode ini.

from fabric import ThreadingGroup as Group
from fabric.exceptions import GroupException

hosts = ['web1', 'web2', 'web3']
g = Group(*hosts)

try:
    results = g.run('date', hide='both')
except GroupException as e:
    print e.args # I read from code that arguments are passed to exception but I'm unable to use that. `args` argument in my case is an empty tuple. 

Misalkan web1 dan web3 berhasil sementara web2 gagal terhubung atau perintah dikembalikan dengan kode keluar bukan nol.

  • Bagaimana cara mendapatkan detail itu setelah pengecualian dimunculkan?
  • Apakah dijamin bahwa pengecualian akan dimunculkan hanya setelah semua operasi selesai?

Bantuan apa pun dihargai.

Komentar yang paling membantu

Halo,

Selain komentar shadyabhi, berikut adalah cara yang saya gunakan untuk menangani GroupException.
Saya harap ini akan membantu !!

import logging, socket, paramiko.ssh_exception
from fabric import Connection, Config, ThreadingGroup, exceptions, runners

...

g = ThreadingGroup.from_connections(c)
try:
    result = g.run('hostname' )  # (just a basic command)
except exceptions.GroupException as e:
    i = 0
    for c, r in e.result.items():
        print("Host[{}] = [{}]".format(i,c.host) )
        if isinstance(r,runners.Result) :
            print("ok, fine")
        elif isinstance(r,socket.gaierror) :
            print("Network error")
        elif isinstance(r,paramiko.ssh_exception.AuthenticationException) :
            print("Auth failed")
        else:
            print("something else")
        i+=1



(dapatkan jika dari dukungan ActivCloud )

Semua 5 komentar

Hai @shadyabhi ,

Tidak yakin apakah Anda mencoba menangkap pengecualian tertentu atau jika Anda hanya ingin menangkap semua pengecualian yang terjadi di utas terpisah. Saya pikir objek ThreadingGroup sudah melewati objek pengecualian menggunakan antrian dan memunculkan jika ada yang ditemui selama eksekusi. Saya dapat melihat jejak tumpukan menggunakan cuplikan kode berikut:

def run_data(c):
    c.run('date', hide='both')

<strong i="8">@task</strong>
def thread_exception_example(c):
    hosts = ['localhost', 'fakehost', 'localhost']

    # python list comprehension
    {c: run_data(c) for c in Group(*hosts)}

Di baris perintah saya menjalankan: fab thread-exception-example

Hai @bossjones ,

Terima kasih telah membalas. Namun, saya tidak menggunakan perintah fab melainkan menjalankan semua ini dengan menggunakan fabric sebagai perpustakaan. Jadi, jawaban masih tertunda dan akan dihargai.

Dengan kata lain, fab menangani sendiri apa yang ingin saya tangani dalam kode saya. Ada beberapa alasan saya tidak ingin menggunakan perintah fab secara langsung karena saya ingin lebih fleksibel dalam cara menjalankan tugas.

Terima kasih

Halo semuanya,

Maaf, saya mengabaikan detailnya. Memeriksa kode kain dan mendapatkan detailnya.

Argumen dengan GroupException adalah kamus dengan kunci sebagai objek fabric.connection.Connection dan nilai sebagai objek fabric.runners.Result .

except GroupException as e:
         for c, r in e.result.items():
             print "Connection: {}, Result: {}".format(c, r)

Halo,

Selain komentar shadyabhi, berikut adalah cara yang saya gunakan untuk menangani GroupException.
Saya harap ini akan membantu !!

import logging, socket, paramiko.ssh_exception
from fabric import Connection, Config, ThreadingGroup, exceptions, runners

...

g = ThreadingGroup.from_connections(c)
try:
    result = g.run('hostname' )  # (just a basic command)
except exceptions.GroupException as e:
    i = 0
    for c, r in e.result.items():
        print("Host[{}] = [{}]".format(i,c.host) )
        if isinstance(r,runners.Result) :
            print("ok, fine")
        elif isinstance(r,socket.gaierror) :
            print("Network error")
        elif isinstance(r,paramiko.ssh_exception.AuthenticationException) :
            print("Auth failed")
        else:
            print("something else")
        i+=1



(dapatkan jika dari dukungan ActivCloud )

Terima kasih @akiuni atas contoh Anda! Saya baru mengenal Python/Fabric dan itu membantu saya memahami cara membuat permintaan menggunakan ThreadedGroup, dan mengumpulkan hasilnya ketika ada pengecualian. Inilah versi saya yang diperluas dari contoh Anda. Sangat dihargai! Untuk apa nilainya, saya memposting ini ke Stackoverflow juga.

# 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()

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

TimotheeJeannin picture TimotheeJeannin  ·  3Komentar

yuvadm picture yuvadm  ·  5Komentar

haydenflinner picture haydenflinner  ·  5Komentar

acdha picture acdha  ·  4Komentar

jamesob picture jamesob  ·  3Komentar