рдореИрдВ рдлреИрдмреНрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ 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 рд╕рд╣реА рд╕реНрдерд╛рди рд╣реИ?
'рд╕рдВрд╕реНрдХрд░рдг' рдХреНрдпрд╛ рд╣реИ рдкрддрд╛ рдирд╣реАрдВ рдХреНрдпрд╛ рд╣реИ! рдпрд╣ рдХреНрдпреЛрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ?
рдпрд╣ рдПрдХ рдлреИрдмрдлрд╛рдЗрд▓ рдореЗрдВ "рд╕рдВрд╕реНрдХрд░рдг" рдирд╛рдордХ рдПрдХ рдХрд╛рд░реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИ рдФрд░ рдПрдХ рдирд╣реАрдВ рдвреВрдВрдв рд░рд╣рд╛ рд╣реИред 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 рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ) рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдкреНрд░рддрд┐ рд╕рдЪреЗрдд рд╣реЛрдиреЗ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рд╛рдВред
рд╕рд╛рде рд╣реА, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдкреГрд╖реНрда рд╣реИ:
рдпрджрд┐ рдЖрдк рдбреЛрдореЗрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЙрди рдЗрдВрдбреЗрдВрдЯ рд▓рд┐рдВрдХ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрди рдкрд░ "рдмрд╣рд┐рд╖реНрдХреГрдд" рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ 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
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@ajmcateer , рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдереАред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдирдИ рдлреИрдмреНрд░рд┐рдХ рдЯрд╛рд╕реНрдХ рд╡рд┐рдзрд┐ (рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ - http://docs.fabfile.org/en/1.14/usage/tasks.html) @task рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд╕рдордХрдХреНрд╖ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб' рдЙрджрд╛рд╣рд░рдг рд╣реИ:
'рдлреИрдм рд╣реИрд▓реЛ' рдЪрд▓рд╛рдиреЗ рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИред