Fabric: рд░рдирдЯрд╛рдЗрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди

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

рдореЗрд░реЗ рдкрд╛рд╕ рдлреИрдмреНрд░рд┐рдХ 1 рдлреИрдмрд╛рдЗрд▓реНрд╕ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ env ред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрд╕ рдХреЛрдб рдХреЛ рдлреИрдмреНрд░рд┐рдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд╣реИред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕рдВрджрд░реНрдн рдЙрджрд╛ connect_kwargs рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреИрд╕реЗ рдпрд╛ рдХрд╣рд╛рдВ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИред Invoke рдбреЙрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВ рдХрд┐рд╕реА рднреА YAML / JSON рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкрд╛рд╕рд╡рд░реНрдб рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП keyring рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред

рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╕рдм fabric.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

import subprocess
import sys
from getpass import getuser
import os

domain = os.environ.get("DOMAIN", "loctest")

def get_config():
    user = getuser()

    try:
        password = subprocess.check_output(["keyring", "get", domain, user]).strip()
        print("Loaded %s password for %s from keyring" % (domain, user))
    except subprocess.CalledProcessError:
        print(
            "Unable to set password using `keyring` (is it in your PATH?) тАФ expect to be nagged",
            file=sys.stderr,
        )

    return {'user': user, 'password': password}

connect_kwargs = get_config()

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ TypeError: can't pickle module objects рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред __all__ рд╕реЗрдЯ рдХрд░рдирд╛ рдЙрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ:

def get_config():
    import subprocess
    import sys
    from getpass import getuser
    import os

    domain = os.environ.get("DOMAIN", "loctest")
    user = os.environ.get("USER", getuser())

    try:
        password = subprocess.check_output(["keyring", "get", domain, user]).strip()
        print("Loaded %s password for %s from keyring" % (domain, user))
    except subprocess.CalledProcessError:
        print(
            "Unable to set password using `keyring` (is it in your PATH?) тАФ expect to be nagged",
            file=sys.stderr,
        )

    return {"user": user, "password": password}

connect_kwargs = get_config()

рдХреНрдпрд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓реАрдирд░ рддрд░реАрдХрд╛ рд╣реЛрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ? рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдХреЛрдб рдлреИрдмреНрд░рд┐рдХ 1 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреЛ рдЙрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рдирд╣реАрдВ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╣рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП "рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛ рдЬрд╛рдУред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдПрдХ рдорд╛рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ тАЭред

Bug Feature Needs investigation

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

рдПрдХ fabfile.py рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд░рд▓ рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдЙрджрд╛рд╣рд░рдг рд╣реИ? рдореИрдВ рд╕рднреА рдбреЙрдХреНрд╕ рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЛ рдЫрд╛рди рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЕрднреА рддрдХ v2 рдкрд░ рдПрдХ рднреА рдХрдорд╛рдВрдб рдХреЛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ рдПрдХ SSHException "рдХреЛрдИ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рддрд░реАрдХреЗ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ" рдХреЗ рд╕рд╛рде рдЕрдЯрдХ рдЧрдпрд╛ рд╣реИ

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

рдореИрдВ рдЗрд░рд╛рджрд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ "рдкрд╛рдпрдерди рдлреЙрд░реНрдореЗрдЯ" рдХреЙрдиреНрдлрд┐рдЧ рдлрд╛рдЗрд▓реНрд╕ рдореЛрдЯреЗ рддреМрд░ рдкрд░ "рд░рдирдЯрд╛рдЗрдо рдХреЛрдб рдПрдХреНрдЬреАрдХреНрдпреВрд╢рди рдХреЗ рдЬрд░рд┐рдП рдХреЙрдирдлрд┐рдЧрд░реЗрд╢рди рд╡реИрд▓реНрдпреВрдЬ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░реЗрдВрдЧреА" рдХреЗ рдЫреЗрдж рдХреЛ рднрд░реЗрдВрдЧреА, рдЗрд╕рд▓рд┐рдП рдЖрдк рдпрдХреАрдирди .py рдлрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд╕рд╣реА рдЯреНрд░реИрдХ рдкрд░ рдереЗред рдЙрд╕ рдиреЗ рдХрд╣рд╛ - рдореИрдВрдиреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрд╕рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдорд╛рдлреАред (рдореИрдВ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдлрд╛рдЗрд▓ / рдлреИрдмрд╛рдЗрд▓ рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ config-esque рдбреЗрдЯрд╛ рд╕реЗ рд▓реЗрдХрд░ рд░рдирдЯрд╛рдЗрдо рдЯрд╛рд╕реНрдХ рдирд┐рдХрд╛рдпреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред)

рдЕрдкрдорд╛рдирдЬрдирдХ рдмрд╛рддреЗрдВ рдпрд╛рдж рди рд░рдЦреЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╢рд╛рдпрдж рд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдХреБрдЫ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдореБрдЭреЗ рдЕрдЪрд╛рд░ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ (рдЗрди рджрд┐рдиреЛрдВ, рдХреМрди рдХрд░рддрд╛ рд╣реИ) рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреЙрдк рдЕрдк рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдерд╛ред

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

рдкреБрди: "рдореНрдпреВрдЯ рд╕рд┐рд░реНрдл рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдорд╛рди" рдХреЗ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдкреНрд░рд╢реНрди, рдХрд┐ _ought_ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рд╣рдЬрддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рд▓рдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рдЧрд╣рд░реА рдорд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреА .py рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд░реНрдл connect_kwargs = {'user': foo', 'password': 'bar'} рдЕрдВрдд рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдХреЙрдиреНрдлрд┐рдЧ рд╕реЛрд░реНрд╕ рдХреЗ connect_kwargs рдХреЙрдиреНрдЯреЗрдВрдЯ) рдХреЗ рд╕рд╛рде рд╡рд┐рд▓рдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ connect_kwargs рдЖрд╕рдкрд╛рд╕ рдХреБрдЫ рдХреАрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП # 1762ред

рдореБрдЭреЗ рдпрд╣ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░рд╛ рд╢реБрд░реБрдЖрддреА рдлреИрдмреНрд░рд┐рдХ 2 рдЕрдкрдЧреНрд░реЗрдб рдкреНрд░рдпрд╛рд╕ рдерд╛ рдФрд░ рдореИрдВрдиреЗ рддрдм рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрдорд┐рдЯрдореЗрдВрдЯреНрд╕ рдХреЛ рджреЗрдЦрд╛ рд╣реИред

рдПрдХ fabfile.py рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд░рд▓ рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдЙрджрд╛рд╣рд░рдг рд╣реИ? рдореИрдВ рд╕рднреА рдбреЙрдХреНрд╕ рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЛ рдЫрд╛рди рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЕрднреА рддрдХ v2 рдкрд░ рдПрдХ рднреА рдХрдорд╛рдВрдб рдХреЛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ рдПрдХ SSHException "рдХреЛрдИ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рддрд░реАрдХреЗ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ" рдХреЗ рд╕рд╛рде рдЕрдЯрдХ рдЧрдпрд╛ рд╣реИ

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

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

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

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

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

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

joeydumont picture joeydumont  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ