Fabric: μ„ νƒμ μœΌλ‘œ localhost둜 μ΄λ™ν•˜λŠ” 경우 ssh μ‚¬μš©μ„ ν”Όν•˜μ‹­μ‹œμ˜€.

에 λ§Œλ“  2011λ…„ 08μ›” 19일  Β·  59μ½”λ©˜νŠΈ  Β·  좜처: fabric/fabric

μ„€λͺ…

run()/sudo()λŠ” localhost둜 μ΄λ™ν•˜κ³  λŒ€μ‹  local()을 μ‹€ν–‰ν•˜λŠ” 것을 지λŠ₯적으둜 λ³Ό κ²ƒμž…λ‹ˆλ‹€. 이것은 μ•„λ§ˆλ„ 선택 사항일 κ²ƒμž…λ‹ˆλ‹€.

IRC에 λŒ€ν•œ Jeff의 의견:

그리고 예, ssh λŒ€ 직선 νŒŒμ΄ν”„λ₯Ό μ‚¬μš©ν•˜λ©΄ 항상 μ˜€λ²„ ν—€λ“œκ°€ λ°œμƒν•œλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 둜컬( ) 지λŠ₯적으둜 λ‚˜λŠ” ν•΅μ‹¬μ—μ„œ 반 λ§ˆλ²•μ μΈ 행동을 원할 것이라고 ν™•μ‹ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 그리고 그것이 λ‚΄κ°€ μƒκ°ν•˜λŠ” κ²ƒμ²˜λŸΌ κ°„λ‹¨ν•˜λ‹€λ©΄ μ •μ§ν•˜μ§€ μ•Šμ„ 쒋은 이유λ₯Ό 생각해 λ‚Ό 수 μ—†μŠ΅λ‹ˆλ‹€ (λ‹€μ‹œ ν•œ 번 κΈ°λ³Έ λ™μž‘μ΄ μ•„λ‹Œ 경우)

μ›λž˜ Nick Welch ( mackstan )κ°€ 2009-11-11 에 01:39 pm EST 에 μ œμΆœν–ˆμŠ΅λ‹ˆλ‹€.

μ²˜μ§€

  • 볡제 #364: SSH 계측을 μš°νšŒν•˜λŠ” 둜컬 μž‘μ—… ν—ˆμš©
  • κ΄€λ ¨ #26: "ν…ŒμŠ€νŠΈ μ‹€ν–‰" κΈ°λŠ₯ κ΅¬ν˜„
Feature Network

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

"λˆ„κ΅°κ°€κ°€ μ™œ 이것을 ν• κΉŒ?"라고 κΆκΈˆν•΄ν•˜λŠ” μ‚¬λžŒμ΄ μžˆλ‹€λ©΄ λŒ€λ‹΅μ€ 배포 νŒŒμ΄ν”„λΌμΈμ΄ μžˆλŠ” 경우 localhost에 λŒ€ν•œ νŠΉλ³„ν•œ μ„€μ • 슀크립트λ₯Ό μ‚¬μš©ν•˜λŠ” 것보닀 μ–΄λ–€ ν™˜κ²½μ΄λ“  μ •ν™•νžˆ λ™μΌν•œ 배포 슀크립트λ₯Ό μ‹€ν–‰ν•˜λŠ” 것이 도움이 될 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λŒ€ λ‹€λ₯Έ λͺ¨λ“  것.

λͺ¨λ“  59 λŒ“κΈ€

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λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°λΉ„μ•ˆ νŒ¨ν‚€μ§€λ₯Ό λΉŒλ“œν•˜κ³  있으며 μ΄λŠ” μΆ”κ°€ λ³΅μž‘μ„±μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

μ—¬λŸ¬λΆ„, μ•ˆλ…•ν•˜μ„Έμš”.
λ‚˜λŠ” μ°¨μ΄κ°€μžˆλŠ” 패브릭 클둠을 λ§Œλ“€λ €κ³ ν•©λ‹ˆλ‹€.

  • run() ν•¨μˆ˜λŠ” sshμ—μ„œ 원격 ν˜ΈμŠ€νŠΈμ— μ—°κ²°ν•˜λŠ” 것과 같이 localhostμ—μ„œ subprocess.popenκ³Ό λ™μΌν•œ λ°©μ‹μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€.
  • 곡μž₯은 openssh λ˜λŠ” λ‹€λ₯Έ ssh ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ(이λ₯Ό μœ„ν•΄ ꡬ성을 μˆ˜μ •ν•΄μ•Ό 함) ssh μ†ŒμΌ“μ˜ λͺ¨λ“  κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 곡μž₯은 비동기 싀행을 μœ„ν•΄ gevent 라이브러리λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

이 κΈ°λŠ₯이 ν•„μš”ν•œ 경우 μ‚΄νŽ΄λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
https://github.com/Friz-zy/factory

이 ν† λ‘ μ—μ„œ λˆ„λ½λœ 것이 μžˆμ„ 수 μžˆμ§€λ§Œ λ‹€μŒμ€ localhost 및 원격 μ‹œμŠ€ν…œ λͺ¨λ‘μ—μ„œ fab run λͺ…λ Ήκ³Ό λ™μΌν•œ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μˆ˜ν–‰ν•œ μž‘μ—…μž…λ‹ˆλ‹€.

  1. λ‚΄ fabfile.py에 env.use_ssh_config = True λ₯Ό μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€.
  2. ssh 볡사 ID 둜컬 호슀트

둜컬 μ»΄ν“¨ν„°μ—μ„œ 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 μ‚¬μš©μž, μ•”ν˜Έ 등이 μ–‘μΈ‘μ—μ„œ λ‹€λ₯Ό 수 μžˆμœΌλ―€λ‘œ κ³ μœ ν•œ 둜컬 λŒ€ 원격 ꡬ성 벑터λ₯Ό ꡬ성할 κ°€λŠ₯성을 λ†’μ—¬μ•Ό ν•©λ‹ˆλ‹€.

    • Fab 2의 λ§₯λ½μ—μ„œ 이 λͺ¨λ“  것을 μƒκ°ν•˜κ³  있기 λ•Œλ¬Έμ— μ˜ˆμƒλ˜λŠ” ν˜ΈμŠ€νŠΈλ³„ ꡬ성 μž¬μ •μ˜λŠ” μ΅œμ†Œν•œ κ·Έ 뢀뢄을 ν•΄κ²°ν•  κ²ƒμž…λ‹ˆλ‹€. localhost μ»¨ν…μŠ€νŠΈλŠ” λ‹¨μˆœνžˆ μ μ ˆν•œ 값을 전달받을 κ²ƒμž…λ‹ˆλ‹€. (κ²Œλ‹€κ°€ "λ‘œμ»¬μ—μ„œ 원격 μž‘μ—…μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•œ" μ „μš© Context ν•˜μœ„ ν΄λž˜μŠ€λ‘œμ„œ ν•„μš”ν•œ 경우 λ‹€λ₯Έ μž‘μ—…λ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.)

보μž₯ μ΄μ™Έμ˜ λ‚˜λŠ” 아직이 νŠΉμ • ν‹°μΌ“μ˜ μ‚¬μš© 사둀에 λͺ»ν–ˆλ‹€ - @ μ΅œλŒ€-μ•„λ†€λ“œ λ•Œλ¬Έμ—μ΄ μ‹œμ μ—μ„œ μ˜ˆμƒ ν•  μˆ˜μžˆλ‹€ ν˜Όλž€ 문제둜 V2 μ•ŒνŒŒμ™€ λ‹¬λ Έλ‹€μ—μ„œμ΄ λ°–μœΌλ‘œ μ‹œλ„ν–ˆλ‹€ run 및 local μ—λŠ” κ°€λŠ₯ν•œ μœ μ‚¬ν•œ APIκ°€ μžˆμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ κ°€μž₯ 큰 λ¬Έμ œλŠ” μž‘μ—… μ»¨ν…μŠ€νŠΈ( c λ˜λŠ” ctx λ˜λŠ” 이름이 무엇이든 간에) posarg에 λ°”μΈλ”©λœ 개체의 νŠΉμ„±κ³Ό APIμž…λ‹ˆλ‹€. ν˜„μž¬, 그리고 λ‹€μ‹œ λ§ν•˜μ§€λ§Œ, 이것은 μ΅œμ’…μ μΈ 것이 μ•„λ‹ˆλΌ μ§€κΈˆκΉŒμ§€μ˜ 결과일 λΏμž…λ‹ˆλ‹€.

  • 기본적으둜 Invoke의 Executor μ˜ν•΄ μ‹€ν–‰λ˜κ±°λ‚˜ ν˜ΈμŠ€νŠΈκ°€ 없을 λ•Œ Fab 2의 FabExecutor 되면 invoke.Context 이며 λ‘œμ»¬μ—μ„œ μ‹€ν–‰λ˜λŠ” run , local .
  • Fab 2에 μ‹€ν–‰ν•  ν˜ΈμŠ€νŠΈκ°€ 있으면 fabric.Connection 되고, run λŠ” μ›κ²©μœΌλ‘œ μ‹€ν–‰λ˜κ³  local λŠ” Invoke의 run λ¦¬λ°”μΈλ”©μž…λ‹ˆλ‹€

여기와 μ—°κ²°λœ ν‹°μΌ“μ—μ„œ μ‚¬μš© 사둀λ₯Ό μ‚΄νŽ΄λ³΄λŠ” 것을 ν¬ν•¨ν•˜μ—¬ 보닀 ꡬ체적인 생각이 ν•„μš”ν•©λ‹ˆλ‹€. 직접 λΈŒλ ˆμΈμŠ€ν† λ°:

  • 이에 λŒ€ν•œ μœ μš©ν•œ μ†”λ£¨μ…˜(λ˜λŠ” _least_ μ„€λͺ…μ„œ)은 λ‹€μŒκ³Ό 같은 이유둜 코어에 거의 ν™•μ‹€νžˆ μ‘΄μž¬ν•΄μ•Ό ν•©λ‹ˆλ‹€(μ½”μ–΄ 외뢀에 μžˆλŠ” 이전 λŒ€ν™”μ— 따라).

    • μΆ©λΆ„νžˆ 일반적인 μ‚¬μš© μ‚¬λ‘€μž…λ‹ˆλ‹€

    • λ§ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€

    • patchwork (nΓ©e contrib ) 및/λ˜λŠ” invocations (λ™μΌν•œ 버전)의 v2 ν˜Έν™˜ 버전을 μœ μš©ν•˜κ²Œ κ΅¬ν˜„ν•˜λŠ” 데 ν•„μš”ν•©λ‹ˆλ‹€. 특히 μ–Όλ§ˆλ‚˜ λ§Žμ€ μ½”λ“œλ₯Ό κ³΅μœ ν•  수 μžˆλŠ”μ§€ μ•Œλ €μ£ΌκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. ν•˜λ‹€. μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ μ½”λ“œλ² μ΄μŠ€μ— μžˆλŠ” λ§Žμ€ μž‘μ—… 및/λ˜λŠ” μ„œλΈŒλ£¨ν‹΄μ€ 둜컬 λ˜λŠ” μ›κ²©μœΌλ‘œ μ‹€ν–‰λ˜κΈ°λ₯Ό 원할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 핡심은 μž‘μ—…μ΄ ν˜ΈμΆœλ˜λŠ” "방법"을 ν™•μ‹€νžˆ μ•Œμ§€ λͺ»ν•  수 μžˆλŠ” μ»¨ν…μŠ€νŠΈ κ°œμ²΄μ—μ„œ μ–΄λ–€ APIλ₯Ό κΈ°λŒ€ν•΄μ•Ό ν•˜λŠ”μ§€μ— κ΄€ν•œ κ²ƒμž…λ‹ˆλ‹€.
  • μž‘μ—…μ΄ μƒμ„±λ˜λŠ” 방식에 따라 λ‹¬λΌμ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. 즉, @task 및/λ˜λŠ” kwargs의 λ‹€λ₯Έ 버전이 λ™μΌν•œ κ²ƒμœΌλ‘œ, μ‚¬μš©μžκ°€ κΈ°λŒ€μΉ˜λ₯Ό μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€(즉, "원격 지원 μ»¨ν…μŠ€νŠΈκ°€ 제곡되기λ₯Ό μ •λ§λ‘œ μ›ν•©λ‹ˆλ‹€", "원격 지원 μ»¨ν…μŠ€νŠΈλ₯Ό μ œκ³΅ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€." λ“±)

    • λͺ¨ν˜Έμ„±μ„ ν”Όν•˜κΈ° μœ„ν•΄ 이것을 _require_ν•  수 μžˆμŠ΅λ‹ˆλ‹€( ZoP #12 )

    • λ‚΄κ°€ 그것에 λŒ€ν•΄ 더 많이 μƒκ°ν• μˆ˜λ‘ μš°λ¦¬λŠ” Fabric이 @task / Task μ£Όμœ„μ— 자체 κ²½λŸ‰ 래퍼λ₯Ό μ„±μž₯μ‹œν‚€κΈ°λ₯Ό μ›ν•œλ‹€λŠ” 것이 λΆ„λͺ…ν•΄ λ³΄μž…λ‹ˆλ‹€. pure-Invoke μ½”λ“œλ² μ΄μŠ€λŠ” @task λ₯Ό μ‚¬μš©ν•˜μ—¬ 항상 κΈ°λ³Έ Context λ₯Ό μ œκ³΅ν•˜λŠ” 반면 Fabric 버전을 톡해 μƒμ„±λœ μž‘μ—…μ—λŠ” μ΅œμ†Œν•œ Connection μ œκ³΅ν•˜λŠ” μ˜΅μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€

    • 단점은 μœ„μ—μ„œ μ–ΈκΈ‰ν•œ "λ‘œμ»¬μ—μ„œ μ›κ²©μœΌλ‘œ XORν•  수 μžˆμŠ΅λ‹ˆλ‹€" μœ ν˜•μ˜ μž‘μ—…μž…λ‹ˆλ‹€. 단일 "λͺ…령을 μ‹€ν–‰ν•˜μ‹­μ‹œμ˜€" μ˜΅μ…˜λ§Œ μ›ν•˜κ³  두 λͺ¨λ“œλ₯Ό λ™μ‹œμ— ν˜Όν•©ν•˜μ§€ μ•ŠλŠ” μž‘μ—…. 이것은 "λ°μ½”λ ˆμ΄ν„°κ°€ μ»¨ν…μŠ€νŠΈ μœ ν˜•μ„ 선언함" μ†”λ£¨μ…˜κ³Ό 잘 μž‘λ™ν•˜μ§€ _μ•ŠμŠ΅λ‹ˆλ‹€_. ν˜ΈμΆœν•˜λŠ” μ‚¬λžŒκ³Ό 방법에 따라 μ»¨ν…μŠ€νŠΈ μœ ν˜•μ„ 'μ „ν™˜'ν•΄μ•Ό _ν•„μš”_ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

    • 이것은 μ‹€μ œλ‘œ ν˜„μž¬ API의 전체 μš”μ  쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ μž‘μ—…μ€ ctx.run() μ‘΄μž¬ν•˜λŠ” ν•œ μ»¨ν…μŠ€νŠΈ ν•˜μœ„ ν΄λž˜μŠ€μ— λŒ€ν•΄ _μ‹ κ²½ 쓰지 μ•ŠμŠ΅λ‹ˆλ‹€_.

    • κ·Έλž˜μ„œ μ•„λ§ˆλ„ @task 의 "κΈ°λ³Έ, κΈ°λ³Έ μ»¨ν…μŠ€νŠΈλ§Œ ν•„μš”" λ²„μ „μœΌλ‘œ μž₯μ‹λ˜κΈ°λ₯Ό 원할 κ²ƒμž…λ‹ˆλ‹€. Fabric(λ˜λŠ” Fabricκ³Ό μœ μ‚¬ν•œ) 호좜 κ΄€μ μ˜ λˆ„κ΅°κ°€κ°€ μ΄λŸ¬ν•œ μ˜΅μ…˜μ„ μ œκ³΅ν•  수 μžˆλ‹€λŠ” 점을 μ΄ν•΄ν•˜κ³  μž‘μ—… Connection λŒ€μ‹ μ˜ Context .



      • μ΄λŠ” pyinvoke/invoke#170이라고도 ν•˜λŠ” μž‘μ—…μ„ μ‹€ν–‰ν•˜λŠ” 방법을 μ •ν™•νžˆ κΆκΈˆν•΄ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.



  • κ΅¬ν˜„μ— 관계없이 λ‹€μŒκ³Ό 같은 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” μ‚¬μš©μžμ˜ 발총 κ°€λŠ₯성을 μ΅œμ†Œν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    • local κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ μ˜ˆμƒ(Invokeλ₯Ό 톡해 μ‹€ν–‰λ˜λŠ” 패브릭/μ—°κ²° μ˜ˆμƒ μ½”λ“œ)

    • run 원격 run μ»¨ν…μŠ€νŠΈκ°€ λŒ€μ‹  제곡될 λ•Œ λ‘œμ»¬μ—μ„œ 싀행될 κ²ƒμœΌλ‘œ μ˜ˆμƒ(Fabric을 톡해 μ‹€ν–‰/μ»¨ν…μŠ€νŠΈ μ˜ˆμƒ μ½”λ“œ μ‹€ν–‰)

    • 여기에 Max의 μΆ”κ°€ μ„€λͺ…이 μžˆλŠ” λ‹€λ₯Έ ν•­λͺ©μ΄

  • 훨씬 였래된 μ˜κ²¬μ—μ„œ λ³Ό 수 μžˆλ“―μ΄ μ—¬κΈ°μ˜ ν•˜μœ„ μ‚¬μš© μ‚¬λ‘€λŠ” Connection('localhost').run('foo') 에 ν•΄λ‹Ήν•˜λŠ” v2κ°€ _SSHλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ _ λŒ€μ‹  Connection('localhost').local('foo') 와 λ˜‘κ°™μ΄ μž‘λ™ν•˜κΈ°λ₯Ό κΈ°λŒ€ν•˜λŠ” μ‚¬μš©μžμž…λ‹ˆλ‹€.

    • μ €λŠ” _μΆ”μΈ‘_ν•©λ‹ˆλ‹€. localhost μ˜¨μ „μ„± 검사λ₯Ό μ‹œλ„ν•˜λŠ” λͺ¨λ“  μ‚¬λžŒμ—κ²Œ λΆˆμΎŒν•œ 발판처럼 λŠκ»΄μ§€κΈ° λ•Œλ¬Έμ— μ‹€μ œλ‘œ 이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλƒ₯ λ‚˜μ—κ²Œ λ„ˆλ¬΄ λ§ˆλ²•μ²˜λŸΌ λŠκ»΄μ§‘λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” μ•„λ§ˆλ„ 옡트인 기반으둜(예: 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 λ₯Ό ν™•μž₯ν•˜μ—¬ 경둜λ₯Ό μƒμ„±ν•˜λŠ” 것과 같이 μ‰½κ²Œ μ²˜λ¦¬ν•  수 μ—†λŠ” λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰