Fabric: "рдкрддрд╛ рдирд╣реАрдВ *рдХреБрдЫ* рдХреНрдпрд╛ рд╣реИ!" рдХрдкрдбрд╝реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж2

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рдЕрдЧре░ 2018  ┬╖  18рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: fabric/fabric

рдореИрдВ рдлреИрдмреНрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ pip3 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдерд╛ рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рддреЛ рдореБрдЭреЗ рдХрдорд╛рдВрдб 'fab' рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рдерд╛, рдореИрдВрдиреЗ рдЕрдВрддрддрдГ рдЗрд╕реЗ /home/me/.local/bin/fab2 рдореЗрдВ рдкрд╛рдпрд╛ред

рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рдЬрдЧрд╣ рд╣реИ?

рджреВрд╕рд░рд╛ рдЬрдм рднреА рдореИрдВ рдЗрд╕реЗ рдРрд╕реЗ рд╣реА рдЪрд▓рд╛рддрд╛ рд╣реВрдВ

/home/me/.local/bin/fab2 version

рдореБрдЭреЗ рд╕рдордЭ рдЖ рдЧрдпрд╛

(2, 3, 1)
2.3.1
No idea what 'version' is!
import fabric
if hasattr(fabric, '__version__'):
    # For fabric2
    print(fabric.__version_info__)
    print(fabric.__version__)   # for a version tuple
else:
    # for fabric1
    from fabric.api import *
    print(env.version)

рдХреНрдпрд╛ /home/me/.local/bin/fab2 рд╕рд╣реА рд╕реНрдерд╛рди рд╣реИ?
'рд╕рдВрд╕реНрдХрд░рдг' рдХреНрдпрд╛ рд╣реИ рдкрддрд╛ рдирд╣реАрдВ рдХреНрдпрд╛ рд╣реИ! рдпрд╣ рдХреНрдпреЛрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ?

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

@ajmcateer , рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдереАред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдирдИ рдлреИрдмреНрд░рд┐рдХ рдЯрд╛рд╕реНрдХ рд╡рд┐рдзрд┐ (рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ - http://docs.fabfile.org/en/1.14/usage/tasks.html) @task рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд╕рдордХрдХреНрд╖ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб' рдЙрджрд╛рд╣рд░рдг рд╣реИ:

from fabric import task

<strong i="8">@task</strong>
def hello(ctx):
  print("Hello World")

'рдлреИрдм рд╣реИрд▓реЛ' рдЪрд▓рд╛рдиреЗ рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИред

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

рдпрд╣ рдПрдХ рдлреИрдмрдлрд╛рдЗрд▓ рдореЗрдВ "рд╕рдВрд╕реНрдХрд░рдг" рдирд╛рдордХ рдПрдХ рдХрд╛рд░реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИ рдФрд░ рдПрдХ рдирд╣реАрдВ рдвреВрдВрдв рд░рд╣рд╛ рд╣реИред fab --version рд╡рд╣реА рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдк рд╡рд╣рд╛рдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

$HOME/.local/bin/ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдкрд╛рдЗрдк рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп "рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ" рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЖрдк pip install --user ... - рдЖрдк рдЕрдкрдиреЗ PATH рдореЗрдВ $HOME/.local/bin рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ ~/.bash_profile рдореЗрдВ рдпрд╛ ~/.bashrc )ред рдпрджрд┐ рдЖрдкрдиреЗ sudo pip install Fabric (рдмрд┐рдирд╛ --user ) рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ /usr/local/bin/ рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧрд╛ рдЬреЛ рд╢рд╛рдпрдж рдЖрдкрдХреЗ PATH рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИред рдпрд╛ рдЖрдк рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рдмрдЬрд╛рдп python -m fabric <fab args> рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рдп рдзрдиреНрдпрд╡рд╛рдж рдХрдкрдбрд╝реЗ -- рд╕рдВрд╕реНрдХрд░рдг рдиреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛

рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрджрд▓ рджреА

def hello():
    print("Hello world!")

рдореБрдЭреЗ рдЕрднреА рднреА рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдХрд┐ 'рд╣реИрд▓реЛ' рдХреНрдпрд╛ рд╣реИ!

рдХреНрдпрд╛ рдХрдкрдбрд╝реЗ 2 рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИ, рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рд╕рдордп рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдлреИрдмреНрд░рд┐рдХ 1.14 рдХреЗ рд▓рд┐рдП рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рд╕рдордп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрджрдЧрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рдЖрдпрд╛рдд рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдорд╛рди рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдлреИрдмреНрд░рд┐рдХ 2 рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред

рдЕрдЧрд░ рдореИрдВ рдлреИрдм рдпрд╛ рдлреИрдм 2 рдХреЗ рд╕рд╛рде рджреМрдбрд╝рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ

рдореЗрд░реЗ рдкрд╛рд╕ /home/me/fabric . рдореЗрдВ рдХрдкрдбрд╝рд╛ рд╣реИ

@ajmcateer , рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдереАред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдирдИ рдлреИрдмреНрд░рд┐рдХ рдЯрд╛рд╕реНрдХ рд╡рд┐рдзрд┐ (рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ - http://docs.fabfile.org/en/1.14/usage/tasks.html) @task рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд╕рдордХрдХреНрд╖ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб' рдЙрджрд╛рд╣рд░рдг рд╣реИ:

from fabric import task

<strong i="8">@task</strong>
def hello(ctx):
  print("Hello World")

'рдлреИрдм рд╣реИрд▓реЛ' рдЪрд▓рд╛рдиреЗ рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ from fabric import task рдФрд░ рд╕рд╛рде рд╣реА @task рдбреЗрдХреЛрд░реЗрдЯрд░ рджреЛрдиреЛрдВ рд╣реИрдВред
рдлрд┐рд░ рднреА рдореБрдЭреЗ 'рдиреЛ рдЖрдЗрдбрд┐рдпрд╛ ..' рдПрд░рд░ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред

рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░рд┐рдпрд╛ :

$ fab --version 
Fabric 2.3.1
Paramiko 2.4.1
Invoke 1.1.1

$ python --version
Python 3.6.2

$ more tasks.py
#!/usr/bin/env python

from fabric import task

<strong i="10">@task</strong>
def build(c):
    import pdb; pdb.set_trace()
    print("Building!")

$ fab build -f tasks.py
No idea what 'build' is!

@mandravaze , рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ fabfile.py рдореЗрдВ рдХрд╛рд░реНрдп рд╣реИ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ env рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИ) рдФрд░ рдореИрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ
$рдлреИрдм рдмрд┐рд▓реНрдб

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ env . рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИ

рдореИрдВ рдХреИрд╕реЗ рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ? рдЖрдк рдХреНрдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?

рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреМрди рд╕реА рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд┐рд▓реНрдб() fabfile.py рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рдпрд╣ рд╡рд╣рд╛рдВ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдЖрдкрдХрд╛ рдлреИрдм рдЧрд▓рдд рдлрд╛рдЗрд▓ рдЙрдард╛рддрд╛ рд╣реИ ...

@mandarvaze рдЖрдкрдХреЗ рдЖрджреЗрд╢ рдореЗрдВ fab build -f tasks.py рдХрдИ рднреНрд░рдо рд╣реИрдВред

  • рдлреИрдм рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдкрд╣рд▓реЗ рдЯрд╛рд╕реНрдХрдирд╛рдо рд╕реЗ рдкрд╣рд▓реЗ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ fab -f tasks.py build
  • -f рдзреНрд╡рдЬ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╣реИ, рдХрд╛рд░реНрдп рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд╡рд╣ -c рдзреНрд╡рдЬ рд╣реИ, рдЬреИрд╕реЗ fab -c tasks build (рдирд╣реАрдВ ".py" рдПрдХреНрд╕рдЯреЗрдВрд╢рди!)
  • inv (рдЖрд╣реНрд╡рд╛рди) рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрд╛рд░реНрдпреЛрдВ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХрд╛рд░реНрдп.py рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред fab (рдлреИрдмреНрд░рд┐рдХ) рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрд╛рд░реНрдпреЛрдВ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ fabfile.py рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@ploxiln fab -c tasks build рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ
рдзрдиреНрдпрд╡рд╛рджред

@ajmcateer , рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдереАред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдирдИ рдлреИрдмреНрд░рд┐рдХ рдЯрд╛рд╕реНрдХ рд╡рд┐рдзрд┐ (рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ - http://docs.fabfile.org/en/1.14/usage/tasks.html) @task рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд╕рдордХрдХреНрд╖ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб' рдЙрджрд╛рд╣рд░рдг рд╣реИ:

from fabric import task

<strong i="9">@task</strong>
def hello(ctx):
  print("Hello World")

'рдлреИрдм рд╣реИрд▓реЛ' рдЪрд▓рд╛рдиреЗ рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИред

рдмреЗрд╡рдХреВрдл рд╕рд╡рд╛рд▓ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ 'рд╕реАрдЯреАрдПрдХреНрд╕' рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдХреНрдпрд╛ рд╣реИ рд╡рд╣?

рдлреИрдмреНрд░рд┐рдХ 2 рдореЗрдВ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ ctx рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ ctx.run("hostname")

рдпрджрд┐ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рдХрд┐рд╕реА рдХрд╛рд░реНрдп рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рддрд░реНрдХ рдХреЛ рдЙрд╕рдХреЗ рд╕рд╣реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХрд╛ рдирд╛рдо рдХреИрд╕реЗ рд░рдЦрд╛ рд╣реИред

fab mytask --task-name value

рдирд╣реАрдВ

fab mytask --task_name value

рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рдореИрдВ рдпрд╣рд╛рдВ рд╕рдорд╛рдкреНрдд рд╣реБрдЖ рд╣реВрдВ, рдореИрдВ рдЗрд╕реЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛, рдЬрд┐рд╕рдХреА рдореЗрд░реА рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдлреИрдмреНрд░рд┐рдХ 2 рдореЗрдВ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ ctx рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ ctx.run("hostname")

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж !!

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд░рд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдлреИрдмреНрд░рд┐рдХ 2 рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред 2.x рдХрд╛ рддрд░реНрдХ рдмрд╣реБрдд рдЙрд▓реНрдЯрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдмреБрдирд┐рдпрд╛рджреА рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдирд╣реАрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди 1.x рдХреЗ рддрд░реНрдХ рдФрд░ рдЗрд╕ 1.x рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рджреЗрдЦреЗрдВ: https://docs.fabfile.org/en/1.14/tutorial.htmlред рдлрд┐рд░ 2.x ... рдХреЗ рд╕рдордХрдХреНрд╖ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реЛрдВ рдУрд░ рджреЗрдЦреЗрдВред

рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рдХрд┐ 1.x рдХрд╛ рдПрдХ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдмрдВрджрд░рдЧрд╛рд╣ рд╣реИ рдФрд░ рд╡реЗ рд╣реИрдВ - рдХрд╛рдлреА рдмреЛрд▓реНрдб - рдЗрд╕реЗ 3.x

рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдПрдлрд╡рд╛рдИрдЖрдИ рдХрд┐ @task рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЗрд╕ рд╡рд┐рд╡рд░рдг рдХреЗ _none_, рдПрдХ рд╕рдВрджрд░реНрдн рд╡рд╕реНрддреБ рдЖрджрд┐ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреИрдмреНрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ "рдЕрд╡рд▓реЛрдХрди рдФрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ: https://docs .fabfile.org/hi/1.8/tutorial.html

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

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЙрд╕ рдкреГрд╖реНрда рдкрд░ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪреЗ, рдЖрдкрдХреЛ https://docs.fabfile.org/en/2.5/getting-started.html рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП

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

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреЛрдж рд▓реЗрдиреЗ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдбреЙрдХреНрд╕ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдСрдирдмреЛрд░реНрдбрд┐рдВрдЧ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреНрд░рд╛рдордХ рд╣реИрдВред

рдлреИрдмреНрд░рд┐рдХ рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ред рдореИрдВрдиреЗ "рдлреИрдмреНрд░рд┐рдХ рдкрд╛рдпрдерди" рдХреЛ рдЧреБрдЧрд▓ рдХрд┐рдпрд╛, рдФрд░ рдЙрд╕ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ "рдЕрд╡рд▓реЛрдХрди рдФрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓"ред рд╣рд╛рдВ, рдореБрдЭреЗ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдЧрд╛ рдФрд░ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрддрдиреА рдЬрд▓реНрджреА рдЧрд▓рдд рд░рд╛рд╕реНрддреЗ рдкрд░ рдЬрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдЗрд╕ рдирд┐рд░рд╛рд╢рд╛ рдХреЛ рдЭреЗрд▓ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЕрдк-рдЯреВ-рдбреЗрдЯ рдбреЙрдХреНрд╕ (рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкрд╛рдпрдерди рд╣реЛрд╕реНрдЯреЗрдб рдбреЙрдХреНрд╕ рдПрдХ рд╕рдорд╛рди рдкреИрдЯрд░реНрди iirc рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ) рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдкреНрд░рддрд┐ рд╕рдЪреЗрдд рд╣реЛрдиреЗ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рдВред

рд╕рд╛рде рд╣реА, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдкреГрд╖реНрда рд╣реИ:

Screenshot from 2020-11-16 22-43-32

рдпрджрд┐ рдЖрдк рдбреЛрдореЗрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЙрди рдЗрдВрдбреЗрдВрдЯ рд▓рд┐рдВрдХ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрди рдкрд░ "рдмрд╣рд┐рд╖реНрдХреГрдд" рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ 1.x рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╢реБрджреНрдз рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛред

рдореИрдВ рдмрд╕ рдЗрд╕ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ рдФрд░ рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдоред рдХрдкрдбрд╝реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИред
рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ред

тХ░тФА$ fab --version
Fabric 2.5.0
Paramiko 2.7.2
Invoke 1.4.1

рдореЗрд░реЗ fabfile.py :

from fabric.tasks import task

<strong i="11">@task</strong>
def test(ctx, title):
    print("ctx:", ctx)
    print("title:", title)

рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл рдХрд╛рд░реНрдп рдЪрд▓рд╛рддрд╛ рд╣реВрдВ:

тХ░тФА$ fab test                                                                                                                                                                                                                      
'test' did not receive required positional arguments: 'title'

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ title рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред
рддреЛ, рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░реЗрдВ:

fab test title="hello world"

рдЖрдЙрдЯрдкреБрдЯ:

ctx: <your current context. Don't worry about it>
title: title=hello world

рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдкрд╛рд░рд┐рдд рддрд░реНрдХ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдЧрд╛ред = рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

<strong i="28">@task</strong>
def test(ctx, title):
    print("ctx:", ctx)
    print("title type:", type(title))
    print("title:", title)
    print("title value:", title.split("=")[1])

рджреМрдбрд╝рдирд╛:

fab test title="hello world"

рдЖрдЙрдЯрдкреБрдЯ:

ctx: ...
title type: <class 'str'>
title: title=hello world
title value: hello world

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

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

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

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

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

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

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