Fabric: рдЖрдВрд╢рд┐рдХ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЗ рджреМрд░рд╛рди рдереНрд░реЗрдбрд┐рдВрдЧ рд╕рдореВрд╣ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреИрд╕реЗ рдкрдврд╝реЗрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рдордИ 2018  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: fabric/fabric

рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдбреЙрдХреНрд╕ рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдорд╛рди рд▓реАрдЬрд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдХреЛрдб рд╣реИред

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. 

рдорд╛рди рд▓реЗрдВ рдХрд┐ web1 рдФрд░ web3 рд╕рдлрд▓ рд╣реБрдП, рдЬрдмрдХрд┐ web2 рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рд╛ рдпрд╛ рдХрдорд╛рдВрдб рдЧреИрд░-рд╢реВрдиреНрдп рдирд┐рдХрд╛рд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ред

  • рдЕрдкрд╡рд╛рдж рдЙрдард╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдЙрди рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реВрдВ?
  • рдХреНрдпрд╛ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рд╕рднреА рдСрдкрд░реЗрд╢рди рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЕрдкрд╡рд╛рдж рдЙрдард╛рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдирдорд╕реНрддреЗ,

рд╢рджреНрдпрд╛рднрд┐ рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдБ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ GroupException рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдБред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рд╕рд╣рд╛рдпрддрд╛ рдорд┐рд▓реЗрдЧреА !!

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



(рдЕрдЧрд░ рдПрдХреНрдЯрд┐рд╡рдХреНрд▓рд╛рдЙрдб рд╕рдкреЛрд░реНрдЯ рд╕реЗ рдорд┐рд▓рд╛ рд╣реИ)

рд╕рднреА 5 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЕрд░реЗ @shadyabhi ,

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдпрджрд┐ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдзрд╛рдЧреЗ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдереНрд░реЗрдбрд┐рдВрдЧрдЧреНрд░реБрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрддрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрд╡рд╛рдж рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛:

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)}

рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдореИрдВ рднрд╛рдЧрд╛: fab thread-exception-example

рд╣рд╛рдп @рдмреЙрд╕рдЬреЛрдиреНрд╕ ,

рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдлреИрдм рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рдмрд▓реНрдХрд┐ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдХрдкрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рд╕рдм рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рддреЛ, рдПрдХ рдЙрддреНрддрд░ рдЕрднреА рднреА рд▓рдВрдмрд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, fab рд╡рд╣ рд╕рдВрднрд╛рд▓ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рд╕реНрд╡рдпрдВ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдРрд╕реЗ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВ рдЬрд┐рдирдХреА рд╡рдЬрд╣ рд╕реЗ рдореИрдВ рд╕реАрдзреЗ fab рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдзрдиреНрдпрд╡рд╛рдж

рд╣реЗрд▓реЛ рд╕рдм рд▓реЛрдЧ,

рдореБрдЭреЗ рдЦреЗрдж рд╣реИ, рдореИрдВрдиреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ред рдлреИрдмреНрд░рд┐рдХ рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХреА рдФрд░ рд╡рд┐рд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ред

GroupException рдХреЗ рд╕рд╛рде рддрд░реНрдХ fabric.connection.Connection рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдВрдЬреА рдФрд░ $#$1 fabric.runners.Result #$ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдореВрд▓реНрдп рд╡рд╛рд▓рд╛ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рд╣реИред

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

рдирдорд╕реНрддреЗ,

рд╢рджреНрдпрд╛рднрд┐ рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдБ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ GroupException рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдБред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рд╕рд╣рд╛рдпрддрд╛ рдорд┐рд▓реЗрдЧреА !!

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



(рдЕрдЧрд░ рдПрдХреНрдЯрд┐рд╡рдХреНрд▓рд╛рдЙрдб рд╕рдкреЛрд░реНрдЯ рд╕реЗ рдорд┐рд▓рд╛ рд╣реИ)

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @akiuni ! рдореИрдВ рдкрд╛рдпрдерди/рдлреИрдмреНрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реА рдХрд┐ рдереНрд░реЗрдбреЗрдб рдЧреНрд░реБрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рдХреИрд╕реЗ рдХрд░реЗрдВ, рдФрд░ рдЕрдкрд╡рд╛рдж рд╣реЛрдиреЗ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдПрдХрддреНрд░ рдХрд░реЗрдВред рдпрд╣рд╛рдБ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдореЗрд░рд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА! рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рднреА рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ ред

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

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

26huitailang picture 26huitailang  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bitprophet picture bitprophet  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

supriyopaul picture supriyopaul  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

SamuelMarks picture SamuelMarks  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

harobed picture harobed  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ