Fabric: рдлреИрдмреНрд░рд┐рдХ 2 рдЕрд▓реНрдлрд╛/рдмреАрдЯрд╛ рдлреАрдбрдмреИрдХ рдореЗрдЯрд╛-рдЯрд┐рдХрдЯ!

рдХреЛ рдирд┐рд░реНрдорд┐рдд 21 рдЕрдкреНрд░реИрд▓ 2017  ┬╖  28рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: fabric/fabric

рдХреГрдкрдпрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдпрд╣ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рд▓рд┐рдВрдХ рдкрд╣рд▓реЗ рдкрдврд╝ рд▓рд┐рдП рд╣реИрдВ !: http://bitprophet.org/blog/2017/04/17/fabric-2-alpha-beta


рдпрд╣ рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рдЯрд┐рдХрдЯ рдХреЗ рддрд╣рдд рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдореБрджреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рдлреАрдбрдмреИрдХ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рд╕реНрдерд╛рди рд╣реИ; рдХреГрдкрдпрд╛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рдЦреЛрдЬреЗрдВ !!

  • SSH рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдлреИрдмреНрд░рд┐рдХ рдХреЗ рдЕрдкрдиреЗ рдореБрджреНрджреЗ: https://github.com/fabric/fabric/issues
  • рдХрд╛рд░реНрдпреЛрдВ, рдЙрдкрдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ, рд╕реАрдПрд▓рдЖрдИ рдкрд╛рд░реНрд╕рд┐рдВрдЧ, рдЖрджрд┐ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдореБрджреНрджреЛрдВ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░реЗрдВ: https://github.com/pyinvoke/invoke/issues
  • рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреА SSH рдЪреАрдЬреЗрдВ рдЗрд╕рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ: https://github.com/paramiko/paramiko/issues

рдХреБрдЫ рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ? рдиреАрдЪреЗ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝ рджреЛ! рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реВрдВ _рд╕рдорд╛рди рд▓реЗрдХрд┐рди рд╕реАрдорд┐рдд рдирд╣реАрдВ_:

  • "рдЬрдм рддрдХ рдЖрдк рдЬрд╛рджреВ, рд╡реИрд╢реНрд╡рд┐рдХ, рдЧреИрд░ рд╡рд╕реНрддреБ рдЙрдиреНрдореБрдЦ рдореЛрдб рдореЗрдВ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддреЗ, рддрдм рддрдХ рдореИрдВ 2.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реВрдВ!" (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рд╕рд┐рд░реНрдл pyinvoke/invoke#186 рд╕реЗ рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ рддрд░реНрдХ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реВрдВрдЧрд╛;))
  • "рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣ рдкрд╕рдВрдж рд╣реИ рдЬреЛ рдЖрдкрдиреЗ $feature рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ $sub-feature рдЧрд╛рдпрдм рд╣реИ, рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ! рдХреНрдпрд╛ рдпрд╣ рдпреЛрдЬрдирд╛рдмрджреНрдз рд╣реИ?" (рдореИрдВ рдпрд╛ рддреЛ 'рд╣рд╛рдВ', 'рдирд╣реАрдВ' рдпрд╛ 'рдирд╣реАрдВ' рдХрд╣реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдЗрд╕реЗ рдореВрд▓ рдореЗрдВ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ!')
  • "рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣ рдкрд╕рдВрдж рд╣реИ рдЬреЛ рдЖрдкрдиреЗ $feature рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЗрд╕реЗ рдЕрднреА рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, $sub-use-case рдХрд░рдирд╛ рдХрдард┐рди/рдЕрд╕рдВрднрд╡ рд╣реИ!" (рдореИрдВ рд╢рд╛рдпрдж рдЖрдкрд╕реЗ рдмреНрдпреЛрд░рд╛ рдорд╛рдВрдЧреВрдВрдЧрд╛ рдФрд░ рд╕рдВрднрд╡рдд: рдЙрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреАрдЖрд░ рдорд╛рдВрдЧреВрдВрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдк рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред)

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

@haydenflinner рдпрд╣ рдЕрдЧрд▓реЗ рдПрдХ рдпрд╛ рджреЛ рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ !! (рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рдкрд╛рдЗрдХреЙрди рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡рд┐рдорд╛рди рдкрд░ рдЪрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд░рд┐рд▓реАрдЬ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдХрд┐ 10 рдордИ рд╣реИред)

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдЕрдкрдЧреНрд░реЗрдб рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВ рдЬрд┐рди рдкрд░ рдореИрдВ рдЕрднреА рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛: http://docs.fabfile.org/en/v2/upgrading.html

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдЕрдм рдЗрд╕ рдЯрд┐рдХрдЯ рдХреЛ рдмрдВрдж рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ 2.0.0 рдФрд░ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯрд┐рдХрдЯ рдЬрд▓реНрдж рд╣реА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛

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

рдпреВрдЖрд░рдПрд▓ рдореЗрдВ рдЫреЛрдЯреА рд╕реА рдЧрд▓рддреА, рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП http://bitprophet.org/blog/2017/04/17/fabric-2-alpha-beta/

рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЕрдкрдиреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд┐рддрдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рдпрд╛рдж рд╣реИ, рдПрд╣? рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВрдиреЗ рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдкрд░ рдПрдХ рд▓рд┐рдВрдХ рдЪреЗрдХрд░ рднреА рдЪрд▓рд╛рдпрд╛, рд▓реЗрдХрд┐рди ... рдЗрд╕ рдЯрд┐рдХрдЯ рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд╣реАрдВ;)

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдХрдкрдбрд╝реЗ 1 рдХреЗ рд░реЛрд▓рдбреЗрдл рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдХрдкрдбрд╝реЗ 2 рдХреЗ рджрд░реНрд╢рди рдХреЗ рдЕрдиреБрд░реВрдк рдорд╛рдирддрд╛ рд╣реВрдВред рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ Collection рдореЗрдВ рд╕рдорд╛рди рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ @group рд╕рдЬрд╛рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдмрд╛рджреА рд╡рд╛рд▓реЗ Group рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╡рд┐рд░реБрджреНрдз рдХрд╛рд░реНрдп рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдиреЗрдорд╕реНрдкреЗрд╕ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ fabfile.py рдореЗрдВ Collection рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ deploy $ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ @group s рдЬрд┐рд╕реЗ web рдФрд░ db рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ , web рд╕рдореВрд╣ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╣реЛрд╕реНрдЯ рдкрд░ mytask рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ deploy.web.execute(mytask) рдпрд╛ fab -G deploy.web mytask рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрди рд╕рдЬрд╛рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд▓рд╕реА рдФрд░ рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрджрд┐ рд╣реЛрд╕реНрдЯ рд╕реВрдЪреА рд▓реБрдХрдЕрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рд╕рдВрдЪрд╛рд▓рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдпрд╣ рдлреИрдмреНрд░рд┐рдХ 2 рдХреЗ рдбрд┐рдЬрд╛рдЗрди рджрд░реНрд╢рди рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдПрдХ рд╕реНрд╡рд┐рдВрдЧ рд▓реЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, @RedKrieg! рдореИрдВ рд╕рдореВрд╣ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда" рдФрд░/рдпрд╛ рд╕реАрдПрд▓рдЖрдИ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдСрдлрд╣реИрдВрдб рдЬреЛ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдХреЗ рд▓рд┐рдП рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдордВрдерди рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА #1594 рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢рдмреНрдж рдирд┐рдХрд╛рд▓реЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ (+ рдПрдХ рд▓рд┐рдВрдХ) рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рд╣реИрдВред рдЖрдЗрдП рд╡рд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ, рд▓реЗрдХрд┐рди рд╣рд╛рдВ, рдореБрдЭреЗ рдкреАрдУрд╕реА рдкреАрдЖрд░ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

-H рддрд░реНрдХ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдореИрдВ рд╕реНрдерд╛рдиреАрдп рдмрд┐рд▓реНрдб рдФрд░ rsync рдХреЛ рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯ рдореЗрдВ рдПрдХ рд╣реА рдХрд╛рд░реНрдп рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ?

@ рдореИрдХреНрд╕-рдЕрд░реНрдиреЛрд▓реНрдб рдХрдиреЗрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ .local рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░ .run рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреА рд╣реИ: http://docs.fabfile.org/en/v2/api/connection.html#fabric .рдХрдиреЗрдХреНрд╢рдиредрдХрдиреЗрдХреНрд╢рдиредрд╕реНрдерд╛рдиреАрдп

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╢рдмреНрджреЛрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ:

<strong i="6">@task</strong>
def build(ctx):
    # should always run locally
    ctx.local('uname -a')


<strong i="7">@task</strong>
def deploy(ctx):
    build(ctx)
    # this one should run on remote host
    ctx.run('uname -a')

рд╕рдВрдпреБрдХреНрдд рдХрд╛рд░реНрдп рдареАрдХ рдЪрд▓рддрд╛ рд╣реИ:

fab -H host deploy

рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ: 'рд╕реНрдерд╛рдиреАрдп' рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреБрдВрдЬреА рдирд╣реАрдВ рдорд┐рд▓реА:

fab build

рдЕрд╕рд▓ рдореЗрдВ рдореИрдВ рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХреБрдЫ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ( -H рдХреЗ рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛)ред

рджреВрд╕рд░реА рдУрд░ рд╕реЗ, рдХреБрдЫ рдЖрджреЗрд╢ рдХреЗрд╡рд▓ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рд╣реЛрд╕реНрдЯ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ ctx.run рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

| рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдп рдЪрд▓рд╛рддрд╛ рд╣реИ | рдХрдорд╛рдВрдб/рдХрд╛рд░реНрдп рд▓реЗрдЦрдХ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдП | рдЗрд╕реЗ рдХреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? |
|---------------------|------------------------------------- ---|----------------|
| рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ | рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ | рд░рди () рд╡реНрдпрд╡рд╣рд╛рд░ рдареАрдХ рд╣реИ (рд▓реЗрдХрд┐рди рджреВрд░ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдкрд░ рд▓реЗрдЦрдХ рдХреЗ рдЗрд░рд╛рджреЗ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрдЧрд╛) |
| рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ | рджреВрд░ рд╕реЗ | рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛ рдкреБрд░рд╛рдиреЗ рдХрдкрдбрд╝реЗ рдХреА рддрд░рд╣ рдореЗрдЬрдмрд╛рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреВрдЫреЗрдВ) |
|рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ | рд╕реНрдерд╛рдиреАрдп рдпрд╛ рджреВрд░ рд╕реЗ | рд░рди () рд╡реНрдпрд╡рд╣рд╛рд░ рдареАрдХ рд╣реИ |
| рджреВрд░ рд╕реЗ | рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ | рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Context рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕реНрдерд╛рдиреАрдп () рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ |
| рджреВрд░ рд╕реЗ | рджреВрд░ рд╕реЗ | рд░рди () рд╡реНрдпрд╡рд╣рд╛рд░ рдареАрдХ рд╣реИ (рд▓реЗрдХрд┐рди рд╕реНрдерд╛рдиреАрдп рдЖрд╣реНрд╡рд╛рди рдХреЗ рджреМрд░рд╛рди рд╕рдорд╕реНрдпрд╛рдПрдБ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВ) |
| рджреВрд░ рд╕реЗ | рд╕реНрдерд╛рдиреАрдп рдпрд╛ рджреВрд░ рд╕реЗ | рд░рди () рд╡реНрдпрд╡рд╣рд╛рд░ рдареАрдХ рд╣реИ |

@ рдореИрдХреНрд╕-рдЕрд░реНрдиреЛрд▓реНрдб рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ #98 рд╣реИ! рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдХреБрдЫ рдЖрдзреБрдирд┐рдХ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╣рд╛рдБ рд░рдЦрдирд╛...рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рд╡рд╛рд▓рд╛

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд╕реБрдбреЛ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрддрддрд╛ рдХреНрдпрд╛ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред

рдЬрд╣рд╛рдВ connection рдПрдХ рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рд╣реИ, рдЬреЛ рд░реВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдорд╛рдгрд┐рдд рд╣реИред

рдЯрд┐рд▓реНрдб рдХреЛ рд░реВрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ:

c.sudo("echo bar > ~/foo", user="builder")

рдпрд╣ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп /home/builder/foo, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп /root/foo.

рджреВрд╕рд░реА рдУрд░, рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл ls рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ:

c.sudo("ls", user="builder")

рдореБрдЭреЗ Permission denied рдорд┐рд▓рддрд╛ рд╣реИред

рдХреБрдЫ рд╣рдЯрдХрд░ рд▓рдЧрддрд╛ рд╣реИред

рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдЬрдм рдбрд╕реНрдЯрд┐рди рдиреЗ рдЙрдкрд░реЛрдХреНрдд рдЖрдЙрдЯ-рдСрдл-рдмреИрдВрдб рдХреА рд╕реВрдЪрдирд╛ рджреА, рддреЛ рдпрд╣ рдерд╛ рдХрд┐ рдпрд╣ рдПрдХ sudo (рдХрдорд╛рдВрдб, рд╡рд┐рдзрд┐ рдирд╣реАрдВ) рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢рд┐рдХрди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╣рдо -H рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдпрд╣ 100% рд╡реИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рдЬреИрд╕рд╛ рд╣рдо рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╣рд╛рдп рдЬреЗрдл,
рдЪреВрдВрдХрд┐ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЬрдЧрд░ 3 рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЕрднреА рдореИрдВ fabric3 (рдХрдкрдбрд╝реЗ рдХреА рдкреЛрд░реНрдЯрд┐рдВрдЧ 1.x) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдореИрдВ рдлреИрдмреНрд░рд┐рдХ 2 рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд▓рдЪрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рддреБрд░рдВрдд рдПрдХ рд╢реЛ рд╕реНрдЯреЙрдкрд░ рдорд╛рд░рд╛ред рдореИрдВ fabric.contrib рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдорд╛рдЗрдЧреНрд░реЗрд╢рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореИрдВ рдХреЛрдб рдХреЛ рдЙрдирдХреЗ рд╢реЗрд▓ рд╕рдордХрдХреНрд╖ рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛, рдФрд░ рдЪреВрдВрдХрд┐, contrib.* рдХрдкрдбрд╝реЗ 1.x рдкрд░ рдореБрджреНрджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХрдореА рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдкреНрд░рд╡рд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрдВрднреАрд░ рдмрд╛рдзрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдореБрдЭреЗ рдкреИрдЪрд╡рд░реНрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдорд┐рд▓рд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ fabric.contrib рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХреЛрдб рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ fabric.contrib рдХреЛ рдлреИрдмреНрд░рд┐рдХ 2 рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

рдзрдиреНрдпрд╡рд╛рдж,
рдЧреИрдмреНрд░рд┐рдПрд▓

@ garu57 рд╣рд╛рдВ, рдЕрднреА рдпреЛрдЬрдирд╛ patchwork рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ "2.0 рдХреЗ рдпреЛрдЧрджрд╛рди" рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓ рдпрд╣ рдлреИрдмреНрд░рд┐рдХ 1 рдЖрдзрд╛рд░рд┐рдд рд╣реИ рд▓реЗрдХрд┐рди рдлреИрдмреНрд░рд┐рдХ 2.0.0 рдХреЗ рдмрд╛рд╣рд░ рдЖрдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдВрдЯреНрд░реАрдм рдмрд┐рдЯреНрд╕ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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

рдХрднреА-рдХрднреА рдореЗрд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд░рд┐рдореЛрдЯ рдХрдорд╛рдВрдб рдЪрд▓рд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ

source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./00-update-kernel.sh'

рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рддрд░рд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ:

033[0;32m[DONE]\033[0m'
+ return 0
+ alt_test_done_msg 'Prepare evironment'
+ echo -e '* Prepare evironment    \033[0;32m[DONE]\033[0m'
+ exit 0

рдФрд░ рдореБрдЭреЗ рдЕрдкрдирд╛ рдбрд┐рдмрдЧ рдЖрдЙрдЯрдкреБрдЯ рднреА рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП "?" рдореЗрд░реЗ рдХреЛрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░:

class GenericFabric(object):
    def __init__(self, host, user, key_filename=None, port=22):
        connection_string = "{u}@{h}:{p}".format(u=user, h=host, p=port)
        self.connection = Connection(connection_string)
        self.key_filename = key_filename

    #<strong i="13">@with_settings</strong>
    def generic_cmd(self, command_str, timeout, fabric_timeout, **kwargs):
        """
        Creating remote container from template

        <strong i="14">@type</strong> command_str:     str
        <strong i="15">@param</strong> command_str:    command for execute with VM
        <strong i="16">@type</strong> timeout          int or float
        <strong i="17">@param</strong> timeout         number of seconds for pause
        <strong i="18">@type</strong> fabric_timeout   int or float
        <strong i="19">@param</strong> fabric_timeout  number of seconds for timeout fabric run

        <strong i="20">@rtype</strong>:                FabricResponse
        <strong i="21">@return</strong>:               Return remote status of operation VM
        """
        if fabric_timeout > 0:
            command = self.connection.run(command_str.format(**kwargs),
                                          timeout=fabric_timeout,
                                          warn=True, echo=True)
        else:
            command = self.connection.run(command_str.format(**kwargs),
                                          warn=True, echo=True)
        print("?")
        if timeout > 0:
            sleep(timeout)
        return FabricResponse(command)

    def simple_generic_cmd(self, command_str, **kwargs):
        """
        <strong i="22">@type</strong> command_str:     str
        <strong i="23">@param</strong> command_str:    command for execute with VM

        <strong i="24">@rtype</strong>:                FabricResponse
        <strong i="25">@return</strong>:               Return remote status of operation VM
        """
        return self.generic_cmd(command_str, 0.1, 0, **kwargs)

рд▓реЗрдХрд┐рди рдХреЛрдИ "?" рдирд╣реАрдВ рд╣реИрдВред рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд░рди () рдореЗрдВ рд▓рдЯрдХ рд░рд╣реЗ рдереЗред

рджрд░рдЕрд╕рд▓, рдореЗрд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдорд▓реНрдЯреА-рдкреНрд░реЛрд╕реЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╣реИред рдлрд╛рдВрд╕реА рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рд░рд┐рдореЛрдЯ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

class TestingSystemVM(GenericFabric):
#######
    <strong i="7">@signal_alarm_down</strong>
    def run_rpm_test(self, command_test, package, type_of_test="base"):
        """

        """
        signal.signal(signal.SIGALRM, alarm_handler)
        signal.alarm(self.__timeout)
        returned_value = Queue()
        start_time = datetime.utcnow()
        directory, command_test = os.path.split(command_test)
        try:
            if command_test.endswith(".yml"):
                directory = directory.replace("/opt/QA", self.ansible.git_qa_repo)
                output = self.ansible.play_ansible(command_test,
                                                   package,
                                                   directory)
            else:
                vm_instance = (self.host,
                               self.user,
                               self.key_filename,
                               self.os_name,
                               self.platform,
                               self.arch)
                running_test = Process(target=separate_process_running_test,
                                       args=(vm_instance,
                                             returned_value,
                                             directory,
                                             command_test,
                                             package,
                                             type_of_test))
                running_test.start()
                running_test.join(self.__timeout)
                if running_test.is_alive():
                    running_test.terminate()
                    command_test_res = "FAIL: Timeout\n"
                    return command_test_res, work_time(start_time), 1
                elif returned_value.empty():
                    command_test_res = "FAIL: Problem while getting result\n"
                    return command_test_res, work_time(start_time), 1
                else:
                    output = returned_value.get()
        except TimeOut:
            command_test_res = "FAIL: Timeout\n"
            return command_test_res, work_time(start_time), 1
        if output.failed or (package.name in ("lve-utils", "lve-stats") and
                                     "FAIL" in output.stdout):
            res_output = "FAIL: " + output.stdout
        else:
            res_output = output.stdout
        return res_output, work_time(start_time), 0 if output.succeeded else 1

def separate_process_running_test(vm_instance, return_value_queue,
                                  directory, command_test, package,
                                  type_of_test="base"):
    """

    """
    sleep(0.5)

    signal.signal(signal.SIGTERM, kill_fabric_runner)
    signal.signal(signal.SIGINT, kill_fabric_runner)
    (host,
     user,
     key_filename,
     os_name,
     platform,
     arch) = vm_instance
    child_vm_instance = TestingSystemVM(host,
                                        user,
                                        key_filename,
                                        os_name,
                                        platform,
                                        arch,
                                        FakeAnsible())
    if command_test.endswith(".bats"):
        command_test = "/usr/bin/bats --tap " + command_test
    else:
        command_test = os.path.join("./", command_test)

    output = child_vm_instance.simple_generic_cmd(child_vm_instance._c_run_test,
                                                  envvars=child_vm_instance.env_vars,
                                                  exec_test=command_test,
                                                  dir=directory,
                                                  package=package.name,
                                                  pver=package.version,
                                                  prel=package.release,
                                                  type_test=type_of_test)
    print("!")
    return_value_queue.put(output)

рдЬрдм рдореИрдВ рдлрд╝реИрдмреНрд░рд┐рдХ 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рд╕рдордп-рд╕рдордп рдкрд░ рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдХреБрдЫ рдЖрджреЗрд╢ рд▓рдЯрдХ рд░рд╣реЗ рд╣реИрдВред
рдЕрджреНрдпрддрди рджрд░рдЕрд╕рд▓, рдХреЛрдб рдореЗрдВ рдпрд╣ рдореЗрд░реА рдЧрд▓рддреА рдереАред рдЗрд╕рд▓рд┐рдП, рдлрд╝реИрдмреНрд░рд┐рдХ2 рдореЗрдВ рд╣реИрдВрдЧрд┐рдВрдЧ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░,
рдореИрдВрдиреЗ рдХреБрдЫ рд▓реЙрдиреНрдЪ рдкреНрд░рдпреЛрдЧ рдХрд┐рдП рдФрд░ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХрдВрд╕реЛрд▓ рд╕реЗ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдпрд╛

ssh [email protected] -t "source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'"

рдФрд░ рд╡рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдФрд░ рддреЗрдЬреА рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдЖ = 0:

###
+ echo -e '* Prepare evironment    \033[0;32m[DONE]\033[0m'
* Prepare evironment    [DONE]
+ exit 0
Connection to 192.168.0.34 closed.

рдЕрдЪреНрдЫрд╛ред
рддрдм рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдЖрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛:

ssh [email protected] "source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'"

рд╡рд╣ рдЗрддрдиреА рддреЗрдЬреА рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ = 0 рдХреЗ рд╕рд╛рде рднреА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рдерд╛:

###
+ echo -e '* Prepare evironment    \033[0;32m[DONE]\033[0m'
+ exit 0

рд▓реЗрдХрд┐рди "192.168.0.36 рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж" рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЙрд╕рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ VMs рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдФрд░ рдлреИрдмреНрд░рд┐рдХ 2 (IPython рд╕реЗ) рджреНрд╡рд╛рд░рд╛ рдХрдорд╛рдВрдб рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛:

In [1]: from fabric import Connection
In [2]: Connection('[email protected]').run("source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'", pty=True)
....
+ echo -e '* Prepare evironment    \033[0;32m[DONE]\033[0m'
* Prepare evironment    [DONE]
+ exit 0
Out[2]: <Result cmd="source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'" exited=0>

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдкреАрдЯреА = рдЧрд▓рдд рдХреЗ рд╕рд╛рде рднрд╛рдЧрд╛:

In [1]: from fabric import Connection

In [2]: Connection('[email protected]').run("source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'", pty=False)
+ echo -e '* Prepare evironment    \033[0;32m[DONE]\033[0m'
+ exit 0
Out[2]: <Result cmd="source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'" exited=0>

"рд╕реЗ рдХрдиреЗрдХреНрд╢рди" рдирд╣реАрдВ рдерд╛рдмрдВрджред" рджреЛрдиреЛрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ред рдлрд┐рд░ рд╕реЗ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдпрд╛ рдирд╣реАрдВред

рджреВрд╕рд░реЗ, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд╕реНрдЯреИрдВрдб рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдорд╛рд╣реМрд▓ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЪрд╛рдЗрд▓реНрдб рдкреНрд░реЛрд╕реЗрд╕ рд╕реЗ рд▓реЙрдиреНрдЪ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ VMs рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрдЧрд▓реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдпрд╛:

In [1]: import subprocess

In [2]: t = subprocess.Popen(""" ssh [email protected] -t "source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'" """, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True); r = t.communicate()

рдЗрд╕ рд░рдирд┐рдВрдЧ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ "рдХрдиреЗрдХреНрд╢рди рдЯреВ 192.168.0.34 рдХреНрд▓реЛрдЬреНрдб" рдерд╛ред

рджреВрд╕рд░реА рдУрд░

In [1]: import subprocess

In [2]: t = subprocess.Popen(""" ssh [email protected] "source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'" """, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True); r = t.communicate()

рджреЛрдиреЛрдВ рдХреЛ рдлрд╛рдВрд╕реА рдирд╣реАрдВ рд╣реБрдИ рд╣реИред

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

use_sudo рдХреЗ рд▓рд┐рдП Transfer.put рдХрд╛ рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рд╕рд┐рд░реНрдл put рдХрд░рдирд╛ рд╣реИ рдХрд╣реАрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдиреБрдорддрд┐рдпрд╛рдВ рд╣реИрдВ рддреЛ sudo mv ?

@ ned2 рд╡реИрд╕реЗ рднреА use_sudo рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ get / put рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреИрд╕реЗ v1 рдХрд░рддрд╛ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, "рд╕реБрдбреЛ рдХреЗ рд╕рд╛рде" рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ! (рд░реВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдирд╣реАрдВ, рдЬреЛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдФрд░ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рднреА рдирд╣реАрдВ рд╣реИред)

v2 рдореЗрдВ рдХреБрдЫ рд╣рдж рддрдХ рдХреНрд▓реАрдирд░ рдПрдкреАрдЖрдИ рд░рдЦрдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ get / put рдХреЗ рдЕрдВрджрд░ рдмрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд░реИрдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд▓рдЧрднрдЧ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рд╢рд╛рдпрдж рдХреБрдЫ рдРрд╕рд╛ рд╣реА Transfer.sudo_put (рдЬрд┐рд╕реЗ self.put рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛)ред рдЗрд╕ рддрд░рд╣ "рд╢реБрджреНрдз" put рдХреЛ рдиреНрдпреВрдирддрдо рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

@bitprophet рдореИрдВ рдЖрдкрдХреЛ рдХреБрдЫ рд╕реБрдВрджрд░ рд╕реНрдерд┐рд░ рдФрд░ рдЙрдкрдпреЛрдЧреА рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдлрд╝реИрдмреНрд░рд┐рдХ1 рдФрд░ рдлрд╝реИрдмреНрд░рд┐рдХ 2 рд░рд┐рд▓реАрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рджреЗрдХрд░ рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред

рдореИрдВрдиреЗ v2 рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдлреИрдмреНрд░рд┐рдХ 1 рд╕реЗ рдЕрдкрдиреЗ рдПрд╕рдПрд╕рдПрдЪ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдлреИрдмреНрд░рд┐рдХ 1 рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ред рдлреИрдмреНрд░рд┐рдХ 2 рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдореИрдВ v2 рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдЬреЛ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдгреАрдХрд░рдг рддрдВрддреНрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реИред рд╕реБрдбреЛ рдХреЗ рд╕рд╛рде рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ рд▓реЗрдХрд┐рди рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рднреА рдореИрдВ рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ ..

рдореЗрд░рд╛ рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореИрдВрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдХреБрдЫ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИ рдпрд╛ рдпрд╣ рдПрдХ рдЕрдиреБрдкрд▓рдмреНрдз рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдпрд╛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдХреЛрдб:

<strong i="10">@task</strong>
def testing(c):
    with Connection('MyHostname') as cxn:
        print("Connected")

        cxn.run('ls -l')

рддреНрд░реБрдЯрд┐:

  File /lib/python3.4/site-packages/paramiko/auth_handler.py", line 223, in wait_for_response
    raise e 
paramiko.ssh_exception.AuthenticationException: Authentication failed.

рдореЗрд░рд╛ SSH рдХреЙрдиреНрдлрд┐рдЧ (рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓реЗ рдЧрдП рдорд╛рди):

Host MyHostname
  HostName replacedhostname.co.uk
  Port 22
  IdentityFile ~/.ssh/id_rsa
  User replaceduser

рдореИрдВ рдирд╡реАрдирддрдо v2 рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╣реВрдБ: https://github.com/fabric/fabric/commit/fec3a22ee89900500ae731913fd33f9b56e89f46

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рд╕реЗ рдХрд┐рд╕реА рдФрд░ рдХреЛ рднреА рдЗрд╕реА рдореБрджреНрджреЗ рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреАред

рдЖрдкрдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╢реБрдХреНрд░рд┐рдпрд╛ред

@ Aiky30 рдпрд╣ рд╢рд╛рдпрдж рдЖрдк рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдЦ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ (рдмрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдХреБрдЫ рдкреНрд░рдЧрддрд┐ рдкреИрд░рд╛рдореАрдХреЛ рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг, рдЗрд╕рд▓рд┐рдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реИред) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдмрд╕ рдлреИрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ 2 IdentityFile рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ - рд╣рдо рд╣реЛрд╕реНрдЯ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдкреЛрд░реНрдЯ рдФрд░ рдЕрдиреНрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣рдбрд╝рдк рд▓реЗрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди IdentityFile рдЕрднреА рднреА рдПрдХ TODO рд╣реИред

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

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдореЗрд░реЗ рд▓рд┐рдП IdentityFile рдФрд░ рд╕реНрдкрд╖реНрдЯ рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдорд░реНрдерди рджреЛрдиреЛрдВ рдореЗрдВ рд╣реИрдХрд┐рдВрдЧ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧреИрд░-рдПрдЬреЗрдВрдЯ рдХреБрдВрдЬрд┐рдпрд╛рдБ рд╕рдВрднрд╡рддрдГ рдирдВрдмрд░ 1 рд╕рдмрд╕реЗ рдЖрдо рдСрде рд╕реЗрдЯрдЕрдк рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА рдХрдореА рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрд▓реНрдлрд╛/рдмреАрдЯрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓рд░реНрдЪ рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдП рдЧрдП рд╣реИрдВ . рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдЖрдЬ рдЗрд╕реЗ рдзрдорд╛рдХрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдПрдХ рд╕реНрдкрд┐рди рдХреЗ рд▓рд┐рдП 2.0a рд▓рд┐рдпрд╛ред

1) рдореИрдВ рдореЗрдЬрдмрд╛рдиреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рднреА рдереЛрдбрд╝рд╛ рд╕рд╛ рдЦреЛ рдЧрдпрд╛ рд╣реВрдВред рдореИрдВ рдЪрд▓ рд╕рдХрддрд╛ рд╣реБрдБ:

   fab -H user<strong i="7">@host</strong>:22 some-task

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рд╣рд░ рдмрд╛рд░ рд╣реЛрд╕реНрдЯ рд╡рд┐рд╡рд░рдг (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рд╣реЛрд╕реНрдЯ, рдкреЛрд░реНрдЯ) рдореЗрдВ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рддреЛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣реЛрд╕реНрдЯ рдХреЛ fabfile.py ( Connection s рдпрд╛ Group рдореЗрдВ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП) https://github.com/fabric/fabric/issues/1591#issuecomment -296343613 рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭ рдЧрдпрд╛, рддреЛ рдпрд╣ рдЕрднреА рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ (рдФрд░ https://github.com/fabric/fabric/issues/1594 рдореЗрдВ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) )?

2) рд╕рд╛рде рд╣реА, рдореИрдВрдиреЗ рдЙрд╕ рдореБрджреНрджреЗ рдХреЛ рдорд╛рд░рд╛ рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдПрд╕рдПрд╕рдПрдЪ рдХреБрдВрдЬреА рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╣реИ ( ~/.ssh/id_rsa рдкрд░) рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ ssh-add 'd рд╡рд╣ ssh-agent рд╣реИред рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ ssh-add -l рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реВрдВред рдЬрдм рдореИрдВ рдХреБрдЫ рдХрд╛рд░реНрдп рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рдЙрдЪрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рджреЗрддрд╛ рд╣реВрдВ:

   fab -H musttu<strong i="20">@host</strong> sometask

рдЪреАрдЬреЗрдВ рдареАрдХ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП fab -H bad_user<strong i="23">@host</strong> sometask , рддреЛ рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ:

Traceback (most recent call last): ... File "/home/maximus/.virtualenvs/testenv/lib/python3.6/site-packages/paramiko/pkey.py", line 326, in _read_private_key raise PasswordRequiredException('Private key file is encrypted') paramiko.ssh_exception.PasswordRequiredException: Private key file is encrypted

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/paramiko/paramiko/issues/387 рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдкрдбрд╝реЗ 2.0 рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рд╛рдБ, PasswordRequiredException: Private key file is encrypted рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ, рдЬрдм ssh- рдПрдЬреЗрдВрдЯ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХреА рдЧрдИ рдХреБрдВрдЬреА рд╣реЛрддреА рд╣реИред рдЕрдЧрд░ рдореИрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭ рдЧрдпрд╛, рддреЛ рдЕрдорд╛рдиреНрдп рд▓реЙрдЧрд┐рди рдХреЗ рдмрд╛рдж, paramiko рд╕реАрдзреЗ рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдмрд┐рдирд╛ рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдХреЗ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ред

3) рдЯрд╛рдЗрдк рдПрдиреЛрдЯреЗрдЯрд┐рдВрдЧ рдЯрд╛рд╕реНрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ (рдЖрдИрдбреАрдИ рдореЗрдВ рдмреЗрд╣рддрд░ рдСрдЯреЛ-рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП) рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ https://github.com/pyinvoke/invoke/pull/458 рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ?

4) рдореБрдЭреЗ рдкреИрдЪрд╡рд░реНрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИред рдХрдкрдбрд╝реЗ 1.x рдХреЗ рд▓рд┐рдП, https://github.com/sebastien/cuisine (рдЬреЛ рдмрд╣реБрдд рдореГрдд рд▓рдЧрддрд╛ рд╣реИ) рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рд╣реИрдВ (рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ)ред рдХреНрдпрд╛ рдкреИрдЪрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╛рди рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ (рдЗрд╕рд▓рд┐рдП рд╢реЗрдл/рдЕрдиреНрд╕рд┐рдмрд▓/рд╕рд╛рд▓реНрдЯрд╕реНрдЯреИрдХ-рд╢реИрд▓реА рдШреЛрд╖рдгрд╛рддреНрдордХ рдХрд╛рд░реНрдп, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрдо рджрд╛рдпрд░реЗ рдХреЗ рд╕рд╛рде)? рдореИрдВ рд╣рдореЗрд╢рд╛ рдмрд╣реБ-рдбреАрдЖрдИрдЖрд░/рдорд▓реНрдЯреА-рдлрд╛рдЗрд▓ рд╡рд╛рдИрдПрдПрдордПрд▓/рдбреАрдПрд╕рдПрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдирдлрд░рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЕрдиреНрдп рдЯреВрд▓реНрд╕ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди, рдХрдо рд╡рд░реНрдмреЛрдЬрд╝ рд╕рд┐рдВрдЯреИрдХреНрд╕, рдЖрдИрдбреАрдИ рдСрдЯреЛ-рдкреВрд░реНрдгрддрд╛, рдЖрд╕рд╛рди рдбрд┐рдмрдЧрд┐рдВрдЧ рдЗрддреНрдпрд╛рджрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╛рдЗрдерди рдореЗрдВ рд░рд╣рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред

5) рдлреИрдмреНрд░рд┐рдХ 2.0 рдХреЗ рд▓рд┐рдП рдмрд╕ py 2.6 рдФрд░ 3.2-3.3 рд╕рдкреЛрд░реНрдЯ рдбреНрд░реЙрдк рдХрд░реЗрдВред рдХреНрдпрд╛ рд▓реЛрдЧреЛрдВ рдХреЛ рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП?

@tuukkamustonen - рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ:

  1. рднреВрдорд┐рдХрд╛рдПрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ #1594 рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддреА рд╣реИрдВ - рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐-рд╣реЛрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рд╣реЛрдиреЗ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рд╡рд╣рд╛рдВ рдПрдХ рдФрд░ рдЯрд┐рдХрдЯ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ ssh_config рд╕рдорд░реНрдерди рдЕрдкрдиреЗ рд╕реНрддрд░ рдкрд░ рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИред

    рдлрд╝реИрдмреНрд░рд┐рдХ-рд╕реНрддрд░реАрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ ssh_config рдХреЗ рд╕рд╛рде рдФрд░ рдлрд┐рд░ рд╕рдореВрд╣ рдпрд╛ рд░рдирдЯрд╛рдЗрдо рдбреЗрдЯрд╛ рд╕реЗ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдореЗрд▓ рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рддрдп рдХрд░рдирд╛ рдорд╛рдореВрд▓реА рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд▓реНрдж рд╣реА рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ; рдореИрдВ рдкрд╣рд▓реЗ рдорд╕реМрджреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рд┐рд░реНрдл рдЖрдзрд╛ рд╕реЛрдЪрд╛ рд╕рдорд╛рдзрд╛рди рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

  2. рдлрд┐рд░ рд╕реЗ, рд╣рд╛рдБ, рдпрд╣ рдкреИрд░рд╛рдорд┐рдХреЛ рдЯрд┐рдХрдЯ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХрд╛ рдЕрдиреБрдорд╛рди рд╕рдЯреАрдХ рд╣реИ, рдЦрд░рд╛рдм-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреА рд╕реНрдерд┐рддрд┐ рд╣рдореЗрд╢рд╛ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреА, рдФрд░ рдЪреВрдВрдХрд┐ рдкреИрд░рд╛рдореАрдХреЛ рдХреЗрд╡рд▓ рдЙрд╕ рдЕрдВрддрд┐рдо рддреНрд░реБрдЯрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрд╕реЗ рдорд┐рд▓реА рдереА, рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬреЛ рдЙрд╕рдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рдереА рдСрди-рдбрд┐рд╕реНрдХ, рдХреБрдВрдЬреА рдХреА рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдХреЙрдкреАред (рдпрджрд┐ рдЖрдк рдЙрд╕ рдХреБрдВрдЬреА рдХреЛ рдХрд╣реАрдВ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдВрддрд┐рдо рддреНрд░реБрдЯрд┐ рдХреБрдЫ рдФрд░ рд╣реЛрдЧреАред)

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

  4. рд╣рд╛рдБ, рджреЗрдЦрд┐рдП #461 рдЬреЛ рдмрд╣реБрдд рдкреБрд░рд╛рдирд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рд╣реИред рдЗрди рджрд┐рдиреЛрдВ рдмрдбрд╝рд╛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЗрдирд╡реЛрдХ рдФрд░ рдлреИрдмреНрд░рд┐рдХ рджреЛрдиреЛрдВ рдХреЛ рдлреИрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд▓рд┐рдм рдХреЛ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛; рдХрдИ/рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреЛрдИ рднреА рд╕рд╛рдорд╛рдиреНрдп рдЗрдирд╡реЛрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рд╡рд┐рднрд╛рдЬрд┐рдд рд╕реНрдерд╛рдиреАрдп/рджреВрд░рд╕реНрде рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ "рдЬрд╛рдирддреЗ" рдирд╣реАрдВ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рд░рд┐рдореЛрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЦрд┐рд▓рд╛рдл рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлреИрдмреНрд░рд┐рдХ рдХрдиреЗрдХреНрд╢рди рд╕рдВрджрд░реНрдн рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

    рдРрд╕реЗ "рд╕рдВрджрд░реНрдн рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреА" рдХрд╛рд░реНрдп 'рдЖрдордВрддреНрд░рдг' рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рдЕрднреА рднреА рдЖрд╣реНрд╡рд╛рди-рд╡рд┐рд╢рд┐рд╖реНрдЯ lib) рдореЗрдВ рд░рд╣рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ; рд▓реЗрдХрд┐рди рдХреБрдЫ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдФрд░ рдХреЗрд╡рд▓ рд╢реЗрд▓ рдХрдорд╛рдВрдб рд╕реЗ рдЬреБрдбрд╝реА рдХреЛрдИ рднреА рдЪреАрдЬрд╝) рдХреЛ "рдлрд╝реИрдмреНрд░рд┐рдХ-рдЕрд╡реЗрдпрд░" рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд┐ рдЙрд╕ рдЕрдВрддрд░ рдХреЛ рдХреИрд╕реЗ рдкрд╛рдЯрдирд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рд╣реИред

    рдорд╛рд░реНрдЧ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ "рдХрд┐ lib рдХреЛ рдХреЗрд╡рд▓ рдЖрд╣реНрд╡рд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХрдкрдбрд╝реЗ рдХреА рдХрдареЛрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, _but_ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдЖрдк рдХрдкрдбрд╝реЗ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕рдВрджрд░реНрдн рд╕реМрдВрдкрддреЗ рд╣реИрдВред" рджреЛ libs рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдлреИрдмреНрд░рд┐рдХ-рдЙрдиреНрдореБрдЦ рдПрдХ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп Invoke рдПрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред) рдЖрджрд┐ред

  5. рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдб рдореЗрдВ рд╣реИ, paramiko/paramiko#1070 рдФрд░/рдпрд╛ pyinvoke/invoke#364 рджреЗрдЦреЗрдВред рдЗрдирд╡реЛрдХ 1.0, рдлреИрдмреНрд░рд┐рдХ 2.0 рдФрд░ рдкреИрд░рд╛рдорд┐рдХреЛ 3.0 (рдпрд╛, _maybe_, 2.4/2.5/рдЬреЛ рднреА рд╣реЛ) рд╕рднреА Python 2.7 / 3.4 рдФрд░ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдВрдЧреЗред

рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (1):

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк Ansible рдХреА рд╕реВрдЪреА рд╕реЗ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВред рдпрд╛ рд╢рд╛рдпрдж рдирд╣реАрдВ :)ред

рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (4):

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/pyinvoke/invocations рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИред рдЗрдирд╡реЛрдХреЗрд╢рди _conventions_ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреИрдЪрд╡рд░реНрдХ/рд╡реНрдпрдВрдЬрди-рд╢реИрд▓реА рдкреИрдХреЗрдЬ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ (рдлрд╝рд╛рдЗрд▓ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдпрд╛ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ) рдХреЗ рд╕рд╛рде рд╕рдореНрдореЗрд▓рдиреЛрдВ (рдХреИрд╕реЗ рдЬрд╛рд░реА рдпрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛) рдорд┐рд╢реНрд░рдг рдирд╣реАрдВ рдХрд░рддрд╛ред

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

рдпрд╣ рддрд░реНрдХ рдХреЛ 2+ рдкреИрдХреЗрдЬ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рдЕрдкрдиреЗ "рдХреЗрд╡рд▓-рдЖрдордВрддреНрд░рдг" рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рдСрдкрд░реЗрд╢рди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ "рд░рд┐рдореЛрдЯ-рдУрдирд▓реА" рдСрдкрд░реЗрд╢рди рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ), рдФрд░ рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡рд░ рдкрд░ рднреА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдк рдХреЛрдб рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд, рдХреЙрдкреА рдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ? рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЕрдзрд┐рдХ рдХрд╛рдо рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдпрд╛рдд рдЖрджрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдереЛрдбрд╝рд╛ рдмреЛрдЭрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред

PyPi рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рдкреЙрд▓рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

@haydenflinner рдпрд╣ рдЕрдЧрд▓реЗ рдПрдХ рдпрд╛ рджреЛ рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ !! (рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рдкрд╛рдЗрдХреЙрди рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡рд┐рдорд╛рди рдкрд░ рдЪрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд░рд┐рд▓реАрдЬ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдХрд┐ 10 рдордИ рд╣реИред)

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдЕрдкрдЧреНрд░реЗрдб рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВ рдЬрд┐рди рдкрд░ рдореИрдВ рдЕрднреА рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛: http://docs.fabfile.org/en/v2/upgrading.html

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдЕрдм рдЗрд╕ рдЯрд┐рдХрдЯ рдХреЛ рдмрдВрдж рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ 2.0.0 рдФрд░ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯрд┐рдХрдЯ рдЬрд▓реНрдж рд╣реА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛

рдзреНрдпрд╛рди рджреЗрдВ, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЖрдк рдЕрднреА рднреА рдпрд╣рд╛рдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд░рд┐рд▓реАрдЬ рд╕реЗ рдкрд╣рд▓реЗ рдХрдо рд╕реЗ рдХрдо рдлреАрдЪрд░ рдХрд╛рдо рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрд░рдмрдВрдзрди рддреИрдпрд╛рд░реА рдХреЗ рд╕рд╛рдеред

рдореИрдВрдиреЗ рдЖрдЬ рдлреИрдмреНрд░рд┐рдХ v2 рдХреЛ рджреЗрдЦрд╛ рдФрд░ рдореБрдЭреЗ рдЦреЗрдж рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдирд╣реАрдВ рд▓рд╛ рд╕рдХрддрд╛ред

  1. рд░реЛрд▓рдбреЗрдлреНрд╕ рдХрд╣рд╛рдВ рдЧрдП? рдореИрдВ рдЕрдм рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рднреВрдорд┐рдХрд╛ рдХрд╛ рдирд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛? рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
  2. рдореИрдВ рдЕрдм рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреНрдпреЛрдВ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛? рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рднреА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
  3. -H рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЯрд╛рд╕реНрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдкрд╣рд▓реЗ рдХреНрдпреЛрдВ рдЖрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ? рд╣реЛрдирд╛ рддреЛ рдЗрд╕рдХрд╛ рдЙрд▓рдЯрд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдмрд╣реБрдд рднрдпрд╛рдирдХ рд╣реИред

рдХрд╛рд░реНрдп рддрд░реНрдХ рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рджреЗрдЦреЗрдВ http://docs.pyinvoke.org/en/1.1/concepts/invoking-tasks.html#task -command-line-arguments

@dgarstang рдЖрдк рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рддрдЯрд╕реНрде рдпрд╛ рд╕рд╣рд╛рдиреБрднреВрддрд┐рдкреВрд░реНрдг рд╕реНрд╡рд░ рд▓реЗрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдирд┐рдГрд╢реБрд▓реНрдХ рд╢реНрд░рдо рджреЗрддреЗ рд╣реИрдВ! рдмрд╕ рдХрд╣ рд░рд╣рд╛ рд╣реВрдБ

  1. #1594 рджреЗрдЦреЗрдВ, рдЬреЛ IIRC рдЕрдкрдЧреНрд░реЗрдбрд┐рдВрдЧ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ
  2. @ploxiln рдХреЛ рдЖрдкрдХреА рдкреАрда рдпрд╣рд╛рдБ рдорд┐рд▓ рдЧрдИ
  3. (рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ) #1772 рджреЗрдЦреЗрдВ рдЬреЛ рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рд╡рд┐рд▓рдп рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЬрд▓реНрдж рд╣реА рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛; рдпрд╣ @task(hosts=xxx) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

(рдкреБрдирдГ 3: --hosts рдФрд░ рджреЛрд╕реНрддреЛрдВ рдХреЛ рджреЗрдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ рдкреНрд░рддрд┐-рдХрд╛рд░реНрдп рддрд░реНрдХ рдереЗ, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдХрднреА-рдХрднреА рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕ рдкрд░ рдлрд╛рдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдкреНрд░рддрд┐-рдХрд╛рд░реНрдп --help рдХреЗ рд╕рдорд╛рди

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

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

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

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

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

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

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