run()/sudo()λ localhostλ‘ μ΄λνκ³ λμ local()μ μ€ννλ κ²μ μ§λ₯μ μΌλ‘ λ³Ό κ²μ λλ€. μ΄κ²μ μλ§λ μ ν μ¬νμΌ κ²μ λλ€.
IRCμ λν Jeffμ μ견:
κ·Έλ¦¬κ³ μ, ssh λ μ§μ νμ΄νλ₯Ό μ¬μ©νλ©΄ νμ μ€λ² ν€λκ° λ°μνλ€λ κ²μ μλ―Έν©λλ€. λ‘컬( ) μ§λ₯μ μΌλ‘ λλ ν΅μ¬μμ λ° λ§λ²μ μΈ νλμ μν κ²μ΄λΌκ³ νμ νμ§ μμ΅λλ€. κ·Έλ¦¬κ³ κ·Έκ²μ΄ λ΄κ° μκ°νλ κ²μ²λΌ κ°λ¨νλ€λ©΄ μ μ§νμ§ μμ μ’μ μ΄μ λ₯Ό μκ°ν΄ λΌ μ μμ΅λλ€ (λ€μ ν λ² κΈ°λ³Έ λμμ΄ μλ κ²½μ°)
μλ Nick Welch ( mackstan )κ° 2009-11-11 μ 01:39 pm EST μ μ μΆνμ΅λλ€.
James Pearson (xiong.chiamiov) κ²μ:
ircμμλ μΈκΈνλ―μ΄ μ λ μΌλ°μ μΌλ‘ λ°μ€ν¬ν± μ»΄ν¨ν°μμ ssh μλ²λ₯Ό μ€ννμ§ μμΌλ―λ‘ μ€μ λ‘ localhostμ sshν μ μμ΅λλ€.
2009-11-11μ λλΆ νμ€μ μ€ν 3μ 13λΆμμ
Travis Swicegood ( tswicegood ) κ²μ:
μ€λ μ λ
μ do
λΌλ μλ‘μ΄ fabric.operations ν¨μμ ννλ‘ λΉμ·ν κ²μ ꡬννμ΅λλ€. env.run_as
λ₯Ό λ³΄κ³ "local"κ³Ό κ°μμ§ νμΈνκ³ run
(λλ sudo
λμ local
λ©μλλ‘ μ νν©λλ€. sudo=True
κ° kwargλ‘ μ λ¬λλ κ²½μ°). λν λ‘컬 λͺ
λ Ήμ΄ λ‘컬μμ μ€ν μ€μΈ κ²½μ° sudo
μ λμ¬λ‘ λ‘컬 λͺ
λ Ήμ μ²λ¦¬ν©λλ€.
μ΄κ²μ run
λλ sudo
μ λμμ λ³κ²½νμ§ μκ³ μλνλ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ μΌμ’
μ λ€λ₯Έ λ°©λ²μ
λλ€. μ΄λ¬ν λ³κ²½ μ¬νμ λ΄ μ μ₯μ μμ μ¬μ©ν μ μμ΅λλ€.
2010-01-11 12:22am λλΆ νμ€μ
λͺ¨κ±΄ κ΅¬μ€ ( goosemo ) κ²μ:
λλ μ΄κ²μ΄ κ·Έλ΄λ―νλ€κ³ λ³΄μ§ μλλ€. λ‘μ»¬λ‘ μ€ννλ κ²μ΄ μμ μ λλ€. Fabricμ μꡬ μ¬ν μ€ νλλ μμ€ν , μ격 λλ 루νλ°±μμ μ€νλλ sshdμ λλ€. λ€λ₯Έ λ¬Έμ λ λ‘컬 λ³κ²½λ§ sshκ° νμν put, get, rsync_project λ° κΈ°ν νλͺ©μ κ³ λ €νμ§ μλλ€λ κ²μ λλ€. κ·Έκ²λ€μ ꡬννλ €κ³ νλ©΄ μ§κΈμ fabfileμ bashλ‘ λ³ννλ μμμ μκΈ° λλ¬Έμ λ λ§μ λ¬Έμ λ₯Ό μΌμΌν¬ κ²μ λλ€.
2011λ 3 μ μ€ν 11μ 14λΆ(λλΆ νμ€μ)
Jeff Forcier ( bitprophet ) κ²μ:
λλ μ΄κ²μ΄ νλ₯ν μμ΄λμ΄λΌκ³ 100% νμ νμ§λ μμ§λ§ λ§μ μ¬μ©μκ° νμνλ€κ³ λλΌλ κ²μ΄ λΆλͺ ν©λλ€. μ¬μ© μ¬λ‘μ λν λ€λ₯Έ μ€λͺ κ³Ό ν¨κ» λ λ€λ₯Έ μμ²μ΄ #364λ‘ μ μΆλμμ΅λλ€.
λλ λν μ΄κ²κ³Ό κ΄λ ¨νμ¬ ν μ€νΈ μ€ν ν°μΌμ μΆκ°νμ΅λλ€. μλνλ©΄ (μμ²ν μ¬μ©μ μ€ λκ΅°κ°κ° μ΄κ²μ νμΈν μ μλ€λ©΄ νλ₯ν κ²μ΄λΌκ³ κ°μ ν©λλ€) μ΄ κΈ°λ₯μ μ£Όμ μ¬μ© μ¬λ‘λ ν μ€νΈ/λλΌμ΄-μ΄κΈ° λλ¬Έμ λλ€. λ¬λ¦¬κΈ°.
2011-06-23 11:26am EDT
#538μμ μΈκΈνλ―μ΄ μΈ κ°μ λ¬λλ₯Ό μμ ν μ κ·ννμ¬ μλ‘ λ°κΏ μ¬μ©ν μ μκ² λλ€λ©΄ μ μ΄μ€μΌμ΄νκ° μΌκ΄λκ² μλνλμ§ νμΈν΄μΌ ν©λλ€. μ§κΈ μ°λ¦¬λ μ μ΄μ€μΌμ΄ν local
νμ§ μμ΅λλ€. νμ§λ§ μ΄λ μ μ΄λ λΆλΆμ μΌλ‘λ μ λνΌλ₯Ό μ¬μ©νμ§ μκΈ° λλ¬Έμ
λλ€.
"λκ΅°κ°κ° μ μ΄κ²μ ν κΉ?"λΌκ³ κΆκΈν΄νλ μ¬λμ΄ μλ€λ©΄ λλ΅μ λ°°ν¬ νμ΄νλΌμΈμ΄ μλ κ²½μ° localhostμ λν νΉλ³ν μ€μ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ κ²λ³΄λ€ μ΄λ€ νκ²½μ΄λ μ νν λμΌν λ°°ν¬ μ€ν¬λ¦½νΈλ₯Ό μ€ννλ κ²μ΄ λμμ΄ λ μ μλ€λ κ²μ λλ€. λ λ€λ₯Έ λͺ¨λ κ².
κΈ°λ₯μ λν΄ +1
+1
+10
+1
+1
λΉμ μ λ§μΌλ €λ©΄ OpenSSH μλ²κ° μ€ν μ€μΈμ§ νμΈνλ©΄ λ©λλ€. λ¨Όμ sudo apt-get install ssh
λ₯Ό μννμ¬ μ€μΉλμλμ§ νμΈνμμμ€(κ·Έλ λ€κ³ μκ°νλλΌλ). κ·Έλ° λ€μ sudo service ssh start
| stop
| restart
νμμ λ°λΌ. μ΄ μ€λ λμμ λ°°μ μ΅λλ€ .
+1
λ΄ μ¬μ© μ¬λ‘λ κ°λ¨ν©λλ€. λμΌν django-deploy μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ CloudWatchλ₯Ό ν΅ν cloud-init (λ‘컬 λͺ
λ Ή μ€νμ κ²½μ°) λ° μΌλ° fab deploy_django -H foo@bar
μ¬μ© λͺ¨λμμ ec2 μΈμ€ν΄μ€λ₯Ό ꡬμ±νκ³ μΆμ΅λλ€.
+1
μ΄κ²μ μ λ§ μ μ©ν κ²μ λλ€. λ΄κ° κ°μ§κ³ μλ ν κ°μ§ μ¬μ© μ¬λ‘λ λ°©λμ μ νλ‘λΉμ λ λꡬλ₯Ό μ¬μ©νμ¬ localhostλ₯Ό sshν νμ μμ΄ ν¨λΈλ¦μ μ¬μ©νμ¬ νΉμ VMμ ꡬμ±νλ κ²μ λλ€.
+1
Fabricμμ μ΄λ―Έ μ΄κ²μ λ³΄μ§ λͺ»νλ€λ μ¬μ€μ λλμ΅λλ€.
μ°Έκ³ : reboot()
μ κ°μ ν¨λΈλ¦ κΈ°λ₯μ μκ°νλ©΄ μ΄ κΈ°λ₯μ ꡬνμ΄ λ 볡μ‘ν΄μ§λλ€.
+1
μ΄λ―Έ ν΅μ¬μ μΌλΆμ¬μΌ ν©λλ€!
+1
μΆμμ μΈ κ΄μ μμ λ³Ό λ local
λ SSH κΈ°κ³κ° κ΄λ ¨λμ§ μμ run
μ νΉλ³ν κ²½μ°μΌ λΏμ
λλ€.
ν κ°μ§ λ μ§μ ν΄μΌ ν μ¬ν(λͺ
λ°±ν μ μμ): Fabricμ /etc/hostsλ₯Ό μ½μ ν run
λ₯Ό local
λ‘ λ³νν΄μΌ νλμ§ μ¬λΆλ₯Ό κ²°μ ν λ§νΌ μΆ©λΆν λλν΄μΌ ν©λλ€.
λ΄ λ§μ: λ§μ½ μ°λ¦¬κ° κ°μ§κ³ μλ€λ©΄
env.host = [ 'mywebserver' ]
/etc/hostsμλ λ€μμ΄ μμ΅λλ€.
127.0.0.1 mywebserver
κ·Έλ¬λ©΄ λͺ¨λ run
νΈμΆμ μ€μ λ‘ local
νΈμΆμ΄μ΄μΌ ν©λλ€.
μ΄ κ°λ
μ ν λ¨κ³ λ λμκ° μ격 νΈμ€νΈκ° λ‘컬 λ¨Έμ μ λ€νΈμν¬ μΈν°νμ΄μ€μ ν λΉλ IPλ‘ νμΈλ λ run
λ₯Ό λ‘컬 νΈμΆλ‘ μ·¨κΈν΄μΌ ν©λλ€.
μ:
νΉ νμΌ:
env.host = [ 'mywebserver' ]
/etc/hosts:
192.168.1.1 mywebserver
ip addr
:
[...]
eth0:
inet 192.168.1.1
[...]
+1
+1:+1:
:+1:
+1
+1
Fabric 2λ pyinvoke/invokeλ₯Ό μ¬μ©νλ―λ‘ λ§€μ° μ½κ² μνν μ μμ΅λλ€. λλ μ΄κ²μ ν μ μλ λΉν΅μ¬μ μΈ λ°©λ²μ μν΄ Fabric 2λ₯Ό κΈ°λ€λ¦΄ κ²μ λλ€.
:+1:
+1
:+1:
:+1: νΉν mac μ»΄ν¨ν°κ° λ‘컬 νΈμ€νΈ μλ²μ λν μ격 μ‘μΈμ€λ₯Ό μν΄ κ΅¬μ±λ SSH ν°λμ κ°λλ‘ μλμΌλ‘ μ€μ λμ§ μμΌλ―λ‘ μ΄κ²μ ꡬννμμμ€.
+1
+1 :)
+1 λΆνλ립λλ€
:+1:
:+1:
:+1:
μ°λ¦¬λ Fabλ₯Ό μ¬μ©νμ¬ λ°λΉμ ν¨ν€μ§λ₯Ό λΉλνκ³ μμΌλ©° μ΄λ μΆκ° 볡μ‘μ±μ μΆκ°ν©λλ€.
μ¬λ¬λΆ, μλ
νμΈμ.
λλ μ°¨μ΄κ°μλ ν¨λΈλ¦ ν΄λ‘ μ λ§λ€λ €κ³ ν©λλ€.
μ΄ κΈ°λ₯μ΄ νμν κ²½μ° μ΄ν΄λ³Ό μ μμ΅λλ€.
https://github.com/Friz-zy/factory
μ΄ ν λ‘ μμ λλ½λ κ²μ΄ μμ μ μμ§λ§ λ€μμ localhost λ° μ격 μμ€ν
λͺ¨λμμ fab run
λͺ
λ Ήκ³Ό λμΌν μ½λλ₯Ό μ¬μ©νκΈ° μν΄ μνν μμ
μ
λλ€.
env.use_ssh_config = True
λ₯Ό μ€μ νμ΅λλ€.λ‘컬 μ»΄ν¨ν°μμ ssh μλ²λ₯Ό μ€ννμ§ μλ κ²½μ° λ¬Έμ κ° ν΄κ²°λμ§ μμ΅λλ€.
:+1:
+1
+1 μ΄ κΈ°λ₯μ ꡬννμΈμ :)
+1
κΈ°μ‘΄ Fabric μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ Docker μ΄λ―Έμ§λ₯Ό λΆνΈμ€νΈλ©νλ λ° λ§€μ° μ μ©ν μ μμ΅λλ€. μ΄ κΈ°λ₯μ Docker λͺ¨λ² μ¬λ‘ μ μλ°°λλ 컨ν μ΄λμ SSH μλ²λ₯Ό μ€μΉνλ κ²μ λ°©μ§ν©λλ€.
+1
+1
+1
@AntoniosHadjiκ° μ 곡ν λ΅λ³μ μΆκ°νμ¬ λ€μμ μ΄ μμ μ μννκΈ° μν μ 체 μ§μΉ¨μ λλ€.
# Generate new SSH key for local usage
ssh-keygen -f ~/.ssh/id_rsa -N ''
# Add server keys to users known hosts (eliminates 'are you sure' messages);
ssh-keyscan -H localhost > ~/.ssh/known_hosts
# Allow user to ssh to itself
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
μ€μ λ‘ μ΄κ²μ μ리λ₯Ό μ¬μ©νμ¬ μνν μ μμ΅λλ€. κ°μ Έμ€κΈ°λ‘ μ½κ² μνν μ μλ cuisine.run
ν¨μλ₯Ό μ°Έμ‘°νλλ‘ λͺ¨λ run
μ€νμ λ³κ²½νκ³ λͺ¨λλ₯Ό λ‘μ»¬λ‘ λ³κ²½ν΄μΌ ν©λλ€.
from cuisine import run, mode_local
mode_local()
print run("echo Hello")
@cgarciaarano
κ°λ¨ν μ¬μ© μ¬λ‘μ κ²½μ° λ€μκ³Ό κ°μ΄ μλν©λλ€.
from fabric.api import run, local
# ...
# in task:
if env.host is None or env.host == 'localhost':
run = local
:+1:
sshκ° μ΅μ μ΄ μλ λ fabfileμ μ격 λλ λ‘μ»¬λ‘ μ€ννκ³ μΆμ΅λλ€. μ¬κΈ°μλ get/put/exists λ±μ λν λ‘컬 λνΌκ° ν¬ν¨λ©λλ€.
:+1: λ‘컬 λ° μ격 λͺ¨λμμ μ€νλλ fabfileμ΄ μμΌλ©° μΆλ ₯ μΊ‘μ² λ° μ€λ₯ μ²λ¦¬μ κ°μ λͺ¨λ λ―Έλ¬ν μ°¨μ΄μ μ μ²λ¦¬νκΈ° μν΄ run/local/getμ λν μ체 λνΌ κΈ°λ₯μ ν΄νΉνκ² λμμ΅λλ€.
ν¬νΈ 2223μμ 127.0.0.2(μ¬μ ν κΈ°μ μ μΌλ‘λ localhost)μμ λμ ν¬νΈ μ λ¬ λ° λ°μΈλ©μ μννλ ssh μ°κ²°μ΄ μλ κ²½μ°μλ μ΄λ»κ² λ κΉμ? μ 체 127.0.0.0/8 ν΄λμ€λ₯Ό μ§μνλ κ²μ μ²λ¦¬νλ κ²μ΄ μ’μ΅λλ€.
@blade2005 μ, μ 체 127._._.* λ²μλ localhost(127.0.0.0 λ° 127.255.255.255 μ μΈ)λ₯Ό κ°λ¦¬ν€μ§λ§ μ€μ λ‘ localhostλ₯Ό κ°λ¦¬ν¬ λ ν¬νΈλ₯Ό μ¬μ©νμ§ μμ΅λκΉ?
λ°λΌμ 127.*.*.* == localhost
λ° sshλ νΌν μ μμ§λ§ 127.*.*.*:*
λ ν¬μλ©λ ν¬νΈλ₯Ό κ°λ¦¬ν€κ³ sshκ° νμνλ€κ³ μμ νκ² κ°μ ν μ μλ€κ³ λ―Ώμ΅λλ€.
μμ§ν, μ΄ κΈ°λ₯μ μ리 λΌμ΄λΈλ¬λ¦¬μ μ μ¬νκ² ν¨λΈλ¦μ κΈ°λ°μΌλ‘ ꡬμΆλ νμ¬ νλ¬κ·ΈμΈμΌλ‘ λ μ΄ν΄κ° λ κ²μ λλ€. κ·Έλ° λ€μ env λ³μλ₯Ό κΈ°λ°μΌλ‘ λ‘컬 λλ μ격 μ€ν μ¬λΆλ₯Ό μ μ μλ run/get/put/etcμ λν λνλ ν¨μλ₯Ό κ°μ Έμ€κΈ°λ§ νλ©΄ λ©λλ€. μ μ΄λ μ΄λ° μμΌλ‘ λκ΅°κ°κ° μ΄κ²μ λͺ¨λ μ¬λμ΄ μ¬μ©ν μ μλλ‘ μμν μ μμ΅λλ€.
λλ λ‘컬μμ λκ°λ₯Ό ꡬννκ³ λ‘컬/λ° κ°μ μ ννλ κ²λ³΄λ€ ν¨μ¬ λ λ§μ μμ μ μννμ΅λλ€. μ λμ¬, λ³κ²½λ λλ ν 리, sudo μ¬μ©μ λ±μ κ³ λ €ν΄μΌ ν©λλ€.
λ€λ₯Έ 2.0 κ΄λ ¨ ν°μΌμ λ§₯λ½μμ μ΄μ λν΄ κ°λ¨ν μκ°νκ³ " run
κ° local
μ 리λ°μΈλ©μ΄ λ©λλ€ " μΈμ λ λ§μ κ²μ΄ μμμ κΉ¨λ¬μμ΅λλ€.
local
λ° run
λλ put
/ get
μ€ νλλ₯Ό μ¬μ©νλ λͺ¨λ μ’
λ₯μ μ§μ ν νΌν© λͺ¨λ μμ
μ λ³Έμ§μ μΌλ‘ λ¬Έμ κ° λ©λλ€. 'local' λ° 'remote' "ends"λ μ΄μ λ λ€ λ‘컬μ κ°λ¦¬ν΅λλ€.run
λλ sudo
κ° DoesntMakeAnySenseError
λ°μμν€λ κ²½μ°μλ μ¬μ ν νμ
ν΄μΌ ν©λλ€. put
/ get
λ μλ§λ shutil.copy
λλ μ΄μ μ μ¬ν κ²μΌλ‘ λ°λ μ μμ΅λλ€.local
λ μλ§λ λ³κ²½λμ§ μμ κ²μ
λλ€(λΉλ‘ λ¬΄μ¨ μΌμ΄ μΌμ΄λκ³ μλμ§ μΈμν λ run-except-locally
μ λμ΄κ° λΆμ κ²κ³Ό ꡬλ³λκΈ°λ₯Ό μ¬μ ν μν κ²μ
λλ€...?)prefix
, cd
λ±κ³Ό κ°μ λ€μν 컨ν
μ€νΈ μ‘°μ λ°©λ²/컨ν
μ€νΈ κ΄λ¦¬μλ λͺ¨λ λΉμ·ν μ§λ¬Έμ λν λ΅λ³μ΄ νμν©λλ€.sudo
λͺ
λ Ήμ μ€ννλ κ²μ μ μ¬μ μΌλ‘ μμ²λ λ°νμ΄λ©° μλ§λ μΆκ° μμ κ²μ¬λ₯Ό μν κ²μ
λλ€.local
λ λ€λ₯Έ λ°μΈλ©μ΄ λμ§ μλ ν. ν¬μ§λ μμ§λ§ λ‘컬μμ μλνλ λͺ¨λ sudo
λͺ
λ Ή(μ: Linuxμ λ°°ν¬νκ³ Linuxμμ λ°°ν¬)μ μλ§λ λ‘컬μμ κΆνμ μ μ§ν΄μΌ ν κ²μ
λλ€(μ: apt
/ yum
λ° μΉκ΅¬, λ°©νλ²½ λμ§ λ±).sudo
λν (Jonμ΄ μμμ μΈκΈν κ²μ²λΌ) sudo μ¬μ©μ, μνΈ λ±μ΄ μμΈ‘μμ λ€λ₯Ό μ μμΌλ―λ‘ κ³ μ ν λ‘컬 λ μ격 κ΅¬μ± λ²‘ν°λ₯Ό ꡬμ±ν κ°λ₯μ±μ λμ¬μΌ ν©λλ€.localhost
컨ν
μ€νΈλ λ¨μν μ μ ν κ°μ μ λ¬λ°μ κ²μ
λλ€. (κ²λ€κ° "λ‘컬μμ μ격 μμ
μ μ€ννκΈ° μν" μ μ© Context
νμ ν΄λμ€λ‘μ νμν κ²½μ° λ€λ₯Έ μμ
λ μνν μ μμ΅λλ€.)보μ₯ μ΄μΈμ λλ μμ§μ΄ νΉμ ν°μΌμ μ¬μ© μ¬λ‘μ λͺ»νλ€ - @ μ΅λ-μλλ λλ¬Έμμ΄ μμ μμ μμ ν μμλ€ νΌλ λ¬Έμ λ‘ V2 μνμ λ¬λ Έλ€μμμ΄ λ°μΌλ‘ μλνλ€ run
λ° local
μλ κ°λ₯ν μ μ¬ν APIκ° μμ΅λλ€.
νμ¬ κ°μ₯ ν° λ¬Έμ λ μμ
컨ν
μ€νΈ( c
λλ ctx
λλ μ΄λ¦μ΄ 무μμ΄λ κ°μ) posargμ λ°μΈλ©λ κ°μ²΄μ νΉμ±κ³Ό APIμ
λλ€. νμ¬, κ·Έλ¦¬κ³ λ€μ λ§νμ§λ§, μ΄κ²μ μ΅μ’
μ μΈ κ²μ΄ μλλΌ μ§κΈκΉμ§μ κ²°κ³ΌμΌ λΏμ
λλ€.
Executor
μν΄ μ€νλκ±°λ νΈμ€νΈκ° μμ λ Fab 2μ FabExecutor
λλ©΄ invoke.Context
μ΄λ©° λ‘컬μμ μ€νλλ run
, local
.fabric.Connection
λκ³ , run
λ μ격μΌλ‘ μ€νλκ³ local
λ Invokeμ run
리λ°μΈλ©μ
λλ€ μ¬κΈ°μ μ°κ²°λ ν°μΌμμ μ¬μ© μ¬λ‘λ₯Ό μ΄ν΄λ³΄λ κ²μ ν¬ν¨νμ¬ λ³΄λ€ κ΅¬μ²΄μ μΈ μκ°μ΄ νμν©λλ€. μ§μ λΈλ μΈμ€ν λ°:
patchwork
(nΓ©e contrib
) λ°/λλ invocations
(λμΌν λ²μ )μ v2 νΈν λ²μ μ μ μ©νκ² κ΅¬ννλ λ° νμν©λλ€. νΉν μΌλ§λ λ§μ μ½λλ₯Ό 곡μ ν μ μλμ§ μλ €μ£ΌκΈ° λλ¬Έμ
λλ€. νλ€. μ΄λ¬ν μ’
λ₯μ μ½λλ² μ΄μ€μ μλ λ§μ μμ
λ°/λλ μλΈλ£¨ν΄μ λ‘컬 λλ μ격μΌλ‘ μ€νλκΈ°λ₯Ό μν μ μμ΅λλ€.@task
λ°/λλ kwargsμ λ€λ₯Έ λ²μ μ΄ λμΌν κ²μΌλ‘, μ¬μ©μκ° κΈ°λμΉλ₯Ό μ μΈν μ μμ΅λλ€(μ¦, "μ격 μ§μ 컨ν
μ€νΈκ° μ 곡λκΈ°λ₯Ό μ λ§λ‘ μν©λλ€", "μ격 μ§μ 컨ν
μ€νΈλ₯Ό μ 곡νμ§ λ§μμμ€." λ±)@task
/ Task
μ£Όμμ μ체 κ²½λ λνΌλ₯Ό μ±μ₯μν€κΈ°λ₯Ό μνλ€λ κ²μ΄ λΆλͺ
ν΄ λ³΄μ
λλ€. pure-Invoke μ½λλ² μ΄μ€λ @task
λ₯Ό μ¬μ©νμ¬ νμ κΈ°λ³Έ Context
λ₯Ό μ 곡νλ λ°λ©΄ Fabric λ²μ μ ν΅ν΄ μμ±λ μμ
μλ μ΅μν Connection
μ 곡νλ μ΅μ
μ΄ μμ΅λλ€ ctx.run()
μ‘΄μ¬νλ ν 컨ν
μ€νΈ νμ ν΄λμ€μ λν΄ _μ κ²½ μ°μ§ μμ΅λλ€_.@task
μ "κΈ°λ³Έ, κΈ°λ³Έ 컨ν
μ€νΈλ§ νμ" λ²μ μΌλ‘ μ₯μλκΈ°λ₯Ό μν κ²μ
λλ€. Fabric(λλ Fabricκ³Ό μ μ¬ν) νΈμΆ κ΄μ μ λκ΅°κ°κ° μ΄λ¬ν μ΅μ
μ μ 곡ν μ μλ€λ μ μ μ΄ν΄νκ³ μμ
Connection
λμ μ Context
.local
κ° μ‘΄μ¬νμ§ μμ λ μμ(Invokeλ₯Ό ν΅ν΄ μ€νλλ ν¨λΈλ¦/μ°κ²° μμ μ½λ)run
μ격 run
컨ν
μ€νΈκ° λμ μ 곡λ λ λ‘컬μμ μ€νλ κ²μΌλ‘ μμ(Fabricμ ν΅ν΄ μ€ν/컨ν
μ€νΈ μμ μ½λ μ€ν)Connection('localhost').run('foo')
μ ν΄λΉνλ v2κ° _SSHλ₯Ό μ¬μ©νμ§ μκ³ _ λμ Connection('localhost').local('foo')
μ λκ°μ΄ μλνκΈ°λ₯Ό κΈ°λνλ μ¬μ©μμ
λλ€.ssh.localhost_becomes_subprocess = True
λλ 무μμ΄λ κ°μ κ΅¬μ± μ΅μ
μ μ€μ νλ) λ
Όμμ μ΄λ € μμ΅λλ€.νμ¬ μ¬κΈ°μμ λμ μ μΌν μ¬μ© μ¬λ‘λ ν
νλ¦Ώμ λ‘μ»¬λ‘ λ λλ§ν μ μλ upload_template()
μ
λλ€.
λ¬Όλ‘ λ€μκ³Ό κ°μ΄ ν μ μμ΅λλ€.
#http://matthiaseisen.com/pp/patterns/p0198/
import os
import jinja2
def render(tpl_path, context):
path, filename = os.path.split(tpl_path)
return jinja2.Environment(
loader=jinja2.FileSystemLoader(path or './')
).get_template(filename).render(context)
νμ§λ§ λ‘컬μμ λ λλ§ν μ μλ μ΅μ μ΄ μλ μ΄μ λ 무μμ λκΉ?
νμμ κ²½μ° μ΄ κΈ°λ₯μ μ£Όμ μ©λλ λ‘컬 ν μ€νΈλ₯Ό μν΄ μ ν리μΌμ΄μ ꡬμ±μ λ‘컬 μμ€ν μ λ°°ν¬νλ κ²μ λλ€.
λ°°ν¬ μ λμ μλ²μ λ λλ§λλ settings.py.j2
κ° μκ³ κ±°κΈ°μ settings.py
λΌλ μ΄λ¦μ΄ μ§μ λκ³ jinjaκ° μλ python μ½λλ§ ν¬ν¨λμ΄ μλ€κ³ κ°μ ν©λλ€.
μ΄μ λ‘컬μμ ν
μ€νΈνκ³ μΆμ§λ§ settings.py.j2
μμ λ λλ§ν΄μΌ νκΈ° λλ¬Έμ μμ§ λ‘컬μλ settings.py
κ° μμ΅λλ€.
λ°λΌμ μ±μ μμν μ μμΌλ©° λ‘컬 ν
μ€νΈλ₯Ό μν΄ λ³λμ settings.py
μλμΌλ‘ λ§λ€μ΄μΌ ν©λλ€.
μ΄κ²μ λ§€μ° νΌκ³€νλ©° λ μ¬μμΌ ν©λλ€.
μλ₯Ό λ€μ΄, Ansibleμμλ λ¨μν "λ‘컬 μ°κ²°"μ μ¬μ©νκ³ sshλ₯Ό μλνμ§ μκ³ λ‘컬 νΈμ€νΈμμ λ λλ§νλ€κ³ μμ μ μ릴 κ²μ λλ€.
Fabricμμ μ΄ κΈ°λ₯μ μ¬μ©ν μ μμ λκΉμ§λ λ¬Όλ‘ λͺ μ€μ μ½λμ λΆκ³Όνλ―λ‘ μμ λΆμ¬λ£μ μ루μ μ μ¬μ©ν κ²μ λλ€. imhoλ³΄λ€ μ¬μμΌν©λλ€. ν¨λΈλ¦μ΄ μ λ₯Ό μν΄ μ½κ² λ§λ€μ΄μΌ νλ κ·Έλ° μ’ λ₯μ λ¬Όκ±΄μΈ κ² κ°μμ.
@fninja μμ§ upload_template
μ체λ₯Ό μ΄μνμ§ μμμ§λ§ μ΄ λ¬Έμ μμμ μνλ€λ λ°μλ νμ€ν λμν©λλ€. μλ§λ Jinja λν λ λλ§ λ¨κ³μ μΌλΆ λ¬Έμμ΄ μ
λ‘λ λ¨κ³λ₯Ό λΆλ¦¬νμ¬ μ΄λ₯Ό μ²λ¦¬ν μ μμ΅λλ€. νΉν νμλ "FLOλ₯Ό put
" νμμΌλ‘ μ΄λ―Έ μ‘΄μ¬νκΈ° λλ¬Έμ
λλ€. μ:
from StringIO import StringIO # too lazy to remember the newer path offhand
from somewhere.jinja_wrapper import render
from invoke import task
<strong i="9">@task</strong>
def render_settings(c):
rendered = render('settings.py.j2', {'template': 'params'})
c.put(StringIO(rendered), 'remote/path/to/settings.py')
κ·Έλ¬λ Connection
λ©μλ λλ Connection
μΈμλ₯Ό μ·¨νλ μλΈλ£¨ν΄μ΄ λ upload_template
μ λν λ 짧μ 1-μ€ν± μ μ¬μ²΄λ₯Ό μν μ¬μ§κ° μ¬μ ν μμ μ μμ΅λλ€.
μ΄λ μͺ½μ΄λ , μ νν μ΄λ° μ’
λ₯μ μΌμ μ²λ¦¬νλ λ°©λ²μ λν΄ λ λ§μ μ§λ¬Έμ μ κΈ°ν©λλ€. μλ₯Ό λ€μ΄ Invoke μ μ© Context
κ°μ²΄μλ put
/ get
. μΆκ°ν κ°μΉκ° μμ΅λκΉ? μ΄ ν°μΌμ λ§₯λ½μμ Fabric μ¬μ©μμκ²λ μΆ©λΆν μλ―Έκ° μμ΅λλ€(κ·Έλ¬λ©΄ upload_template
λλ w/eλ λ κ²½μ° λͺ¨λ λ¨μν put
λ₯Ό νΈμΆν μ μμ). κ·Έλ¬λ μμ Invoke μ¬μ©μμκ²λ κΈ°μ΄ν©λλ€. APIμ μΈλͺ¨μλ λΆλΆ.
μ΄κ²μ ν΅μ¬ κΈ°λ₯μΌλ‘ λ§λ€κΈ° μν΄ +1
#1637μ κ΅μ°¨ κΈ°λ₯. κ·Έλ₯ μμ΄λμ΄:
from fabric import task, local
<strong i="6">@task</strong>
<strong i="7">@local</strong>
def build(ctx):
with ctx.cd('/project/dir'):
ctx.run('build > artifact.zip')
<strong i="8">@task</strong>
def deploy(conn):
build(local(conn))
with conn.cd('/remote/path'), local(conn).cd('/project/dir'):
conn.put(remote_path='build.zip', local_path='artifact.zip')
κΈ°λ³Έμ μΌλ‘ local()
λ λ°μ½λ μ΄ν°/컨ν
μ€νΈ κ΄λ¦¬μ/ν¨μλ‘ μλνκ³ Connection
λ₯Ό Context
μμ΅λλ€.
μΈκΈνμ§ μμ λ λ€λ₯Έ μ¬μ© μ¬λ‘: μ¬μ¬μ© κ°λ₯ν ν¨μ λΌμ΄λΈλ¬λ¦¬ ꡬμΆ. μ κ²½μ°μλ λλΆλΆ git
λͺ
λ Ήμ
λλ€. run
μ local
ν¨μ 맀κ°λ³μ(v1μμ)μ μ°¨μ΄μ μ μ¨κΈ°λ μ§λμΉκ² λ¨μν dorun
νμ΅λλ€. μ΄λ€ ν¨μκ° μ νλμλμ§λ 맀κ°λ³μλ‘ μ λ¬λ©λλ€. μλ₯Ό λ€μ΄ git checkout
λ λ€μκ³Ό κ°μ΅λλ€.
def git_checkout(branch, remote='origin', run=run):
"""Checkout a branch if necessary."""
if branch == git_current_branch(run=run):
return
elif branch in git_local_branches(run=run):
dorun('git checkout ' + branch, run=run)
else:
dorun('git checkout -t -b {0} {1}/{0}'.format(branch, remote), run=run)
def git_current_branch(run=run):
"""Get the current branch (aka HEAD)"""
output = dorun('git name-rev --name-only HEAD', run=run)
return output.strip()
def git_local_branches(run=run):
"""Get a list of local branches; assumes in repo directory."""
output = dorun('git branch --no-color', run=run)
branches = {l.strip().split(' ')[-1]
for l in output.strip().split('\n')}
return branches
λ€μκ³Ό κ°μ΅λλ€.
from fabric.api import run as run_remote, local as run_local
def dorun(*args, **kwargs):
"""Work around the fact that "local" and "run" are very different."""
kwargs.setdefault('run', run_remote)
run = kwargs.pop('run')
if run == run_local:
kwargs.setdefault('capture', True)
elif 'capture' in kwargs:
del kwargs['capture']
return run(*args, **kwargs)
sudo
μ΄λ€ μΌμ΄ λ°μνλμ§ μ ν λͺ¨λ₯΄κ³ ~remoteuser
λ₯Ό νμ₯νμ¬ κ²½λ‘λ₯Ό μμ±νλ κ²κ³Ό κ°μ΄ μ½κ² μ²λ¦¬ν μ μλ λ¬Έμ κ° μμ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
"λκ΅°κ°κ° μ μ΄κ²μ ν κΉ?"λΌκ³ κΆκΈν΄νλ μ¬λμ΄ μλ€λ©΄ λλ΅μ λ°°ν¬ νμ΄νλΌμΈμ΄ μλ κ²½μ° localhostμ λν νΉλ³ν μ€μ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ κ²λ³΄λ€ μ΄λ€ νκ²½μ΄λ μ νν λμΌν λ°°ν¬ μ€ν¬λ¦½νΈλ₯Ό μ€ννλ κ²μ΄ λμμ΄ λ μ μλ€λ κ²μ λλ€. λ λ€λ₯Έ λͺ¨λ κ².