λλ μ§λ¬Όμ μ΅μνμ§ μκ³ κ·Έκ²μ μλμν€λ λ° λ¬Έμ κ° μμ΅λλ€. λλ κ·Έκ²μ μ€ννλ €κ³ ν λ 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κ° μ¬λ°λ₯Έ μμΉμ
λκΉ?
'λ²μ 'μ΄ λ¬΄μμΈμ§ λͺ¨λ¦
λλ€!'λ 무μμ
λκΉ? μ λνλ©λκΉ?
fabfileμμ "version"μ΄λΌλ μμ
κΈ°λ₯μ μ°Ύκ³ μμ§λ§ μ°Ύμ§λ μμ΅λλ€. fab --version
λ κ±°κΈ°μμ μνλ κ²μ μνν©λλ€.
$HOME/.local/bin/
λ pip install --user ...
λ pipκ° μ€ν κ°λ₯ν "μ§μ
μ "μ μ€μΉνλ κ³³μ
λλ€ - PATH
μ $HOME/.local/bin
λ₯Ό μΆκ°ν μ μμ΅λλ€(μ: ~/.bash_profile
λλ ~/.bashrc
). sudo pip install Fabric
( --user
μμ΄ )λ₯Ό μννλ€λ©΄ μ€ν κ°λ₯ν μ§μ
μ μ /usr/local/bin/
μ λ£μ κ²μ
λλ€. μ΄λ μλ§λ PATH
μ μ΄λ―Έ μμ κ²μ
λλ€. λλ python -m fabric <fab args>
λμ μ¬μ©ν μ μμ΅λλ€.
μλ νμΈμ ν¨λΈλ¦ κ°μ¬ν©λλ€ --versionμ΄ μ μλνμ΅λλ€
μ€ν¬λ¦½νΈλ₯Ό λ€μκ³Ό κ°μ΄ λ³κ²½νμ΅λλ€.
def hello():
print("Hello world!")
μ¬μ ν ''μλ νμΈμ'κ° λ¬΄μμΈμ§ λͺ¨λ¦ λλ€!'λΌλ λ©μμ§κ° λνλ©λλ€.
Fabric 2μ λν νν 리μΌμ΄ μμ΅λκΉ? λλ κ·Έκ²μ λν΄ λ¬΄μμ΄λ μ»λ λ° μ§μ₯ κ°μ μκ°μ 보λ΄κ³ μμ΅λλ€. Fabric 1.14μ λν μμ΅μλ₯Ό μ°Ύμμ§λ§ κ°μ Έμ€κΈ°κ° μλνμ§ μκΈ° λλ¬Έμ νμ¬λ‘μλ λ³λ‘ λμμ΄ λμ§ μμ΅λλ€. ν¨λΈλ¦ 2κ° λ€λ₯΄κ² μ²λ¦¬νλ€κ³ κ°μ ν©λλ€.
fab λλ fab2λ‘ μ€ννλ©΄ λμΌν μ€λ₯κ° λ°μν©λλ€.
/home/me/fabricμ ν¨λΈλ¦μ΄ μμ΅λλ€.
@ajmcateer , λλμ΄ λ¬Έμ κ°μμμ΅λλ€. λ¬Έμ λ μλ‘μ΄ ν¨λΈλ¦ μμ λ°©λ²(μ¬κΈ°μμ λ Όμλ¨ - http://docs.fabfile.org/en/1.14/usage/tasks.html)μ΄ @task λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νλ κ²μ λλ€. μ΄μ μμνλ "Hello World" μλ λ€μκ³Ό κ°μ΅λλ€.
from fabric import task
<strong i="8">@task</strong>
def hello(ctx):
print("Hello World")
'fab hello'λ₯Ό μ€ννλ©΄ μμλλ μΆλ ₯μ΄ μμ±λ©λλ€.
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μ μμ
μ΄ μμ§λ§(μ΄κ²μ΄ νκ²½μ λ¬Έμ λΌκ³ μκ°ν¨) λ€μ μ€μ μ¬μ©νμ¬ νΈμΆν©λλ€.
$νΉ λΉλ
μ΄κ²μ λΉμ μ νκ²½μ λ¬Έμ κ° μλ€κ³ μκ°ν©λλ€.
μ΄λ»κ² λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λκΉ? μ΄λ€ μΆκ° λ°μ΄ν°λ₯Ό μνμλκΉ?
μ΄ μμΉμ μ΄λ€ νμΌμ΄ μμ΅λκΉ? build()κ° fabfile.pyμ μμ΄μΌ νλ€κ³ μκ°ν©λλ€. μλ κ²½μ° fabμμ μλͺ»λ νμΌμ μ νν μ μμ΅λλ€...
fab build -f tasks.py
λͺ
λ Ήμ @mandarvaze μλ μ¬λ¬ κ°μ§ νΌλμ΄ μμ΅λλ€.
fab -f tasks.py build
μ κ°μ΄ 첫 λ²μ§Έ μμ
μ΄λ¦ μμ μμΌ ν©λλ€.-f
νλκ·Έλ μμ
컬λ μ
μ΄ μλ κ΅¬μ± νμΌμ©μ
λλ€. fab -c tasks build
-c
νλκ·Έμ
λλ€(".py" νμ₯μ μμ!)inv
(νΈμΆ)μ κ²½μ° μμ
μ΄ μλ νμΌμ΄ νμ¬ λλ ν°λ¦¬μ tasks.pyμ΄λ©΄ μ§μ ν νμκ° μμ΅λλ€. fab
(ν¨λΈλ¦)μ κ²½μ° μμ
μ΄ μλ νμΌμ΄ νμ¬ λλ ν°λ¦¬μ fabfile.pyμ΄λ©΄ μ§μ ν νμκ° μμ΅λλ€.@ploxiln fab -c tasks build
μλν©λλ€. π
κ°μ¬ ν΄μ.
@ajmcateer , λλμ΄ λ¬Έμ κ°μμμ΅λλ€. λ¬Έμ λ μλ‘μ΄ ν¨λΈλ¦ μμ λ°©λ²(μ¬κΈ°μμ λ Όμλ¨ - http://docs.fabfile.org/en/1.14/usage/tasks.html)μ΄ @task λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νλ κ²μ λλ€. μ΄μ μμνλ "Hello World" μλ λ€μκ³Ό κ°μ΅λλ€.
from fabric import task <strong i="9">@task</strong> def hello(ctx): print("Hello World")
'fab hello'λ₯Ό μ€ννλ©΄ μμλλ μΆλ ₯μ΄ μμ±λ©λλ€.
μ΄λ¦¬μμ μ§λ¬Έμ μ£μ‘νμ§λ§ 'ctx'μΈμκ° νμν μ΄μ λ 무μμ λκΉ? λμΌ?
ν¨λΈλ¦ 2μμ μ¬λ°λ₯Έ μμ€ν
μμ μ€μ λ‘ λͺ
λ Ήμ μ€ννλ €λ©΄ ctx
κ° νμν©λλ€(μ: ctx.run("hostname")
).
λ¬Έμ κ° μμ μΈμμ λν΄ μ΄ μ€λ₯λ₯Ό λ°λ κ²μ΄λΌλ©΄ μΈμλ₯Ό μ¬λ°λ₯Έ νμμΌλ‘ μ λ¬νμ§ μκ³ μμ μ΄λ¦μ μ§μ ν λ°©μμΌλ‘ μ λ¬νκΈ° λλ¬ΈμΌ μ μμ΅λλ€.
fab mytask --task-name value
~ μλλ€
fab mytask --task_name value
λλ μ΄κ²μ΄ λ¬Έμ μ μλ¦¬κ° μλλΌλ κ²μ μκ³ μμ§λ§ μ¬κΈ°μμ λλ¬μΌλ―λ‘ λμ κ°μ λ¬Έμ κ° μλ λ€λ₯Έ μ¬λμ μν΄ μ΄κ²μ λ¨κΈΈ κ²μ λλ€.
ν¨λΈλ¦ 2μμ μ¬λ°λ₯Έ μμ€ν μμ μ€μ λ‘ λͺ λ Ήμ μ€ννλ €λ©΄
ctx
κ° νμν©λλ€(μ:ctx.run("hostname")
).
μ°μ μ 보 κ°μ¬ν©λλ€!!
λΆννλ Fabric 2λ μμ ν λνλ€κ³ λ§ν΄μΌν©λλ€. 2.xμ λ Όλ¦¬λ λ§€μ° μ§κ΄μ μ΄μ§ μμΌλ©° μ¬μ© λ°©λ²μ λν μ’μ κΈ°λ³Έ μμ΅μκ° λ§μ§ μμ κ² κ°μ΅λλ€. μλ₯Ό λ€μ΄, μ΄μ©λ©΄ λ΄κ° λκ°λ₯Ό λμΉκ³ μμ§λ§ 1.xμ λ Όλ¦¬μ μ΄ 1.x μμ΅μμ νμ§μ μ΄ν΄λ³΄μμμ€. https://docs.fabfile.org/en/1.14/tutorial.html. κ·Έλ° λ€μ 2.xμ λν λλ±ν μμ΅μλ₯Ό μ°Ύμ보μμμ€ ....
1.xμ λΉκ³΅μ ν¬νΈκ° μλ€λ κ²μ λλΌμ΄ μΌμ΄ μλλλ€. κ·Έλ¦¬κ³ κ·Έλ€μ κ·Έκ²μ 3.xλΌκ³ λΆλ₯΄κ³ μμ΅λλ€.
@task
λ°μ½λ μ΄ν°κ° νμνκ³ μ»¨ν
μ€νΈ κ°μ²΄λ₯Ό μ λ¬ν΄μΌ νλ λ±μ μΈλΆ μ 보λ Fabricμ λν κ³΅κ° λ¬Έμμ "κ°μ λ° μμ΅μ" μΉμ
μ μλ€λ μΌλ°μ μΈ μ°Έκ³ μ¬ν: https://docs .fabfile.org/en/1.8/tutorial.html
μ λ Fabric 1μ λ§μ΄ μ¬μ©νλ μ¬μ©μμμΌλ©° μ΄ λ¬Έμ ν°μΌμ μ°ΎκΈ° μ μ μ΄ μ°μ΅μ΄ Fabric 2μ λν μλ‘μ΄ μλ―Έλ₯Ό κ°λ₯΄μ³μ€λ€κ³ μμ§νκ² μκ°νμ΅λλ€. λ¬Έμκ° λ³Έμ§μ μΌλ‘ μ¨λ³΄λ©νλ μ¬λλ€μ μ€λνκΈ° λλ¬Έμ μ±νμ μ λ§λ‘ λ°©ν΄ν μ μμ΅λλ€.
λλ λΉμ μ΄ κ·Έ νμ΄μ§μμ μ΄λ»κ² λλ¬λμ§ νμ€νμ§ μμ΅λλ€. https://docs.fabfile.org/en/2.5/getting-started.html μ λ³΄κ³ μμ΄μΌ ν©λλ€.
κ°μ¬ν©λλ€! μλ§λ λ―Έλμ μ¬νμκ° 1 μλ¦¬μ¦ λ¬Έμμ λ±λ±ν "DEPRECATED" ν€λλ₯Ό λμ§λ λ° λμμ΄ λ κ²μ λλ€. λλ μ΅κ³ μ Google κ²°κ³Ό λλ 곡μ ν¨λΈλ¦ μΉ μ¬μ΄νΈ λ¬Έμμμ μ΄ νμ΄μ§λ‘ μ΄λνλ€κ³ νμ ν©λλ€. λ κ²½μ° λͺ¨λ μ μλ Fabric νμμ μ μ΄ν μ μλ κ²μ΄ μλμ§λ§ λ§μ μ μ¬μ μΈ μ±νμκ° λ°μνκ³ μλ€κ³ μκ°ν©λλ€. μ΄ μ’μ κ°κ³Ό μ΅μ λ¬Έμλ₯Ό μ°ΎμμΌ ν νμμ±μ λν κ²½κ³ λ₯Ό λ°λ κ²μ΄ λμμ΄ λ μ μμ΅λλ€(곡μ Python νΈμ€ν λ¬Έμλ μ μ¬ν ν¨ν΄ iircλ₯Ό λ°λ¦ λλ€).
λ¬Έμκ° λ³Έμ§μ μΌλ‘ μ¨λ³΄λ©νλ μ¬λλ€μ μ€λνκΈ° λλ¬Έμ μ±νμ μ λ§λ‘ λ°©ν΄ν μ μμ΅λλ€.
Fabricμ μλ‘μ΄ μ¬μ©μμ λλ€. "Fabric Python"μ κ²μνκ³ "κ°μ λ° μμ΅μ"λΌλ λ§ν¬λ₯Ό ν΄λ¦νμ΅λλ€. μ, μ λ μ΄κ²μ΄ μ λ§ νΌλμ€λ½κ³ νλ‘μΈμ€ μ΄κΈ°μ μλͺ»λ λ°©ν₯μΌλ‘ κ° μ μλ€λ κ²μ λ§€μ° λλμ΅λλ€.
λ§μ μ μ¬μ μΈ μ±νμκ° μ΄λ¬ν μ’μ μ κ²ͺκ³ μμΌλ©° μ΅μ λ¬Έμλ₯Ό μ°Ύμ νμκ° μλ€λ κ²½κ³ λ₯Ό λ°λ κ²μ΄ λμμ΄ λ κ²μ΄λΌκ³ μκ°ν©λλ€(곡μ Python νΈμ€ν λ¬Έμλ μ μ¬ν ν¨ν΄ iircλ₯Ό λ°λ¦ λλ€).
μ.
λν λ€μμ κ²°κ³Ό νμ΄μ§μ λλ€.
λλ©μΈμ μ μ΄νλ ββκ²½μ° λ€μ¬μ°κΈ°λ λ§ν¬λ₯Ό ꡬμ±ν μ μμ΅λλ€. "DEPRECATED" ν€λλ₯Ό μΆκ°νλ κ² μΈμλ κ²μ κ²°κ³Όμμ 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 λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νλ κ²μ λλ€. μ΄μ μμνλ "Hello World" μλ λ€μκ³Ό κ°μ΅λλ€.
'fab hello'λ₯Ό μ€ννλ©΄ μμλλ μΆλ ₯μ΄ μμ±λ©λλ€.