runïŒïŒ/ sudoïŒïŒã¯ãããŒã«ã«ãã¹ãã«ç§»åããããšãã€ã³ããªãžã§ã³ãã«èªèãã代ããã«localïŒïŒãå®è¡ããŸãã ããã¯ãããããªãã·ã§ã³ã§ãã
IRCã«é¢ããJeffããã®ã³ã¡ã³ãïŒ
ãããŠããããç§ã¯ãsshãšã¹ãã¬ãŒããã€ãããªããã³ãã§åžžã«ãªãŒããŒãããã«ãªãããšãæå³ããŸããrun/ sudoïŒç¹ã«ãªãã¡ã¯ã¿ãªã³ã°ããããã¹ã¿ãŒïŒãããŒã«ã«ïŒ ïŒã€ã³ããªãžã§ã³ãã«ç§ã¯ã³ã¢ã§ãã®åéæ³ã®æ¯ãèããæãã§ãããšã¯ç¢ºä¿¡ããŠããŸããïŒãããæå¹ã«ããããã®ãªããã³ã§ããã©ã«ãã§ãªãã«ãªã£ãŠããå Žåã§ããããã¯å©ãã«ãªããŸãïŒããããã§ããããã¯èå³æ·±ãå®éšã«ãªãã§ãããã ãããŠããããç§ãæã£ãŠããã»ã©åçŽã§ãããªãã°ãç§ã¯æ£çŽã«ããããªãæ£åœãªçç±ãæãä»ãããšãã§ããŸããïŒãããããã©ã«ãã®åäœã§ã¯ãªããšããæ¡ä»¶ã§ïŒ
ããšããšããã¯ã»ãŠã§ã«ãïŒããæåºãmackstann 1æ39åPM ESTã§2009幎11æ11æ¥ã«ïŒ
James Pearson ïŒxiong.chiamiovïŒã®æçš¿ïŒ
ircã§ãè¿°ã¹ãããã«ãç§ã¯éåžžãã¹ã¯ããããã·ã³ã§sshãµãŒããŒãå®è¡ããªãã®ã§ãå®éã«localhostã«sshããããšã¯ã§ããŸããã
2009幎11æ11æ¥ã®åå3æ13åååŸESTã«
Travis Swicegood ïŒ tswicegood ïŒã®æçš¿ïŒ
ä»æ©ã do
ãšããæ°ããfabric.operationsé¢æ°ã®åœ¢ã§åæ§ã®äœããå®è£
ããŸããã env.run_as
ã調ã¹ãŠãããããããŒã«ã«ãã«çãããã©ããã確èªããŸããããããããšã§ã run
ïŒãŸãã¯sudo
ã§ã¯ãªãlocal
ã¡ãœããã«åãæ¿ãããŸãã sudo=True
ãkwargãšããŠæž¡ãããå ŽåïŒã ãŸããããŒã«ã«ã§å®è¡ããŠããå Žåã«åããŠãããŒã«ã«ã³ãã³ãã®ãã¬ãã£ãã¯ã¹ãšããŠsudo
ããŸãã
ããã¯ã run
ãŸãã¯sudo
ã®åäœãå€æŽããã«æ©èœããããã®åé¡ãåé¿ããå¥ã®æ¹æ³ã§ãã ãããã®å€æŽã¯ç§ã®ãªããžããªã§å©çšã§ã
2010幎1åå12æ22åEST
Morgan Goose ïŒ goosemo ïŒã®æçš¿ïŒ
ç§ã¯ããããã£ãšãããããšã¯æ¬åœã«æããŸããã ããŒã«ã«ãšããŠå®è¡ããããšã®ãã€ã³ãã¯äœã§ããã Fabricã®èŠä»¶ã®1ã€ã¯ããã·ã³ããªã¢ãŒãããŸãã¯ã«ãŒãããã¯ã§å®è¡ãããsshdã§ãã ãã1ã€ã®åé¡ã¯ãããŒã«ã«ãå€æŽããã ãã§ã¯ãputãgetãrsync_projectãªã©ããã¹ãŠsshãå¿ èŠãªãã®ãèæ ®ãããªãããšã§ãã ããããå®è£ ããããšãããšãfabfileãbashã«å€æããé åã«ãããããå®éã«ã¯ããã«å€ãã®åé¡ãçºçããŸãã
2011幎ååŸ11æ14åEDT
Jeff Forcier ïŒ bitprophet ïŒãæçš¿ããŸããïŒ
ãããçŽ æŽãããã¢ã€ãã¢ã ãš100ïŒ ç¢ºä¿¡ããŠããããã§ã¯ãããŸããããæããã«å€ãã®ãŠãŒã¶ãŒãå¿ èŠã ãšæããŠãããã®ã§ããå¥ã®ãªã¯ãšã¹ããïŒ364ãšããŠæåºããããŠãŒã¹ã±ãŒã¹ã®å¥ã®èª¬æããããŸãã
ãŸããããã«é¢é£ããŠãã©ã€ã©ã³ãã±ãããè¿œå ããŸãããããã¯ããã®æ©èœã®äž»ãªäœ¿çšäŸããã¹ã/ãã©ã€ã©ã³ã§ããããã§ããã©ã³ãã³ã°ã
2011幎åå11æ26åEDT
ïŒ538ã§è¿°ã¹ãããã«ã3ã€ã®ã©ã³ããŒãå®å
šã«æ£èŠåããŠäº€æå¯èœã«äœ¿çšã§ããå Žåã¯ãã·ã§ã«ãšã¹ã±ãŒãããããã®éã§äžè²«ããŠæ©èœããããšã確èªããå¿
èŠããããŸãã çŸåšã local
ã·ã§ã«ãšã¹ã±ãŒãããŠããŸããããå°ãªããšãéšåçã«ã¯ã·ã§ã«ã©ãããŒã䜿çšããŠããªãããã§ãã
誰ããããªã誰ãããããè¡ãã®ãããšçåã«æã£ãŠããå Žåãçãã¯ããããã€ã¡ã³ããã€ãã©ã€ã³ãããå ŽåãããŒã«ã«ãã¹ãçšã®ç¹å¥ãªã»ããã¢ããã¹ã¯ãªãããçšæããããããã©ã®ç°å¢ã«é¢ä¿ãªãããŸã£ããåããããã€ã¡ã³ãã¹ã¯ãªãããå®è¡ãããšåœ¹ç«ã€å Žåããããšããããšã§ãã察ä»ã®ãã¹ãŠã
æ©èœã®+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
ããã¯æ¬åœã«äŸ¿å©ã§ãã ç§ãæã£ãŠãã1ã€ã®ãŠãŒã¹ã±ãŒã¹ã¯ãvagrantã·ã§ã«ããããžã§ããŒã䜿çšããŠããã¡ããªãã¯ã䜿çšããããŒã«ã«ãã¹ããsshããå¿ èŠãªãã«ç¹å®ã®VMãæ§æããããšã§ãã
+1
ãããFabricã§ãŸã 衚瀺ãããŠããªãããšã«é©ããŸããã
åèïŒ reboot()
ãããªãã¡ããªãã¯é¢æ°ã«ã€ããŠèãããšããã®æ©èœã®å®è£
ã¯ããè€éã«ãªããŸãã
+1
ãã§ã«ã³ã¢ã®äžéšã«ãªã£ãŠããã¯ãã§ãïŒ
+1
ããã¯å®å
šã«çã«ããªã£ãŠããŸããæœè±¡çãªèŠ³ç¹ããã¯ã local
ã¯run
ç¹æ®ãªã±ãŒã¹ã§ãããSSHæ©æ§ã¯é¢äžããŠããŸããã
ãã1ã€ææããŠããããããšããããŸãïŒããããæããã§ãïŒïŒãã¡ããªãã¯ã¯ã/ etc / hostsãèªã¿åã£ãåŸã«run
ãlocal
å€æãããã©ããã決å®ããã®ã«ååã¹ããŒãã§ããå¿
èŠããããŸãã
ã€ãŸãïŒããç§ãã¡ãæã£ãŠãããªã
env.host = [ 'mywebserver' ]
/ etc / hostsã«ã¯æ¬¡ã®ãã®ããããŸãã
127.0.0.1 mywebserver
ãã®å Žåã run
åŒã³åºãã¯ãå®éã«ã¯local
åŒã³åºãã§ããå¿
èŠããããŸãã
ãã®æŠå¿µãããã«äžæ©é²ããŠããªã¢ãŒããã¹ããããŒã«ã«ãã·ã³ã®ãããã¯ãŒã¯ã€ã³ã¿ãŒãã§ã€ã¹ã«å²ãåœãŠãããIPã«è§£æ±ºããããšãã«ã run
ãããŒã«ã«ã³ãŒã«ãšããŠæ±ãå¿
èŠããããŸãã
äŸãã°ïŒ
fabfileïŒ
env.host = [ 'mywebserver' ]
/ etc / hostsïŒ
192.168.1.1 mywebserver
ip addr
ïŒ
[...]
eth0:
inet 192.168.1.1
[...]
+1
+1ïŒ+1ïŒ
ïŒ+1ïŒ
+1
+1
ãã¡ããªãã¯2ã¯pyinvoke / invokeã䜿çšãããããããã¯éåžžã«ç°¡åã«å®è¡ã§ããã¯ãã§ãã ç§ã¯ãããè¡ãããã®ããããŒã§ãªãæ¹æ³ã®ããã«Fabric2ãåŸ ã¡ãŸãã
ïŒ+1ïŒ
+1
ïŒ+1ïŒ
ïŒ+1ïŒãããå®è£ ããŠãã ãããç¹ã«Macã³ã³ãã¥ãŒã¿ãŒã¯ããŒã«ã«ãã¹ããµãŒããŒãžã®ãªã¢ãŒãã¢ã¯ã»ã¹çšã«SSHãã³ãã«ãæ§æããããã«èªåçã«èšå®ãããŠããªãããã§ãã
+1
+1 :)
+1ããŠãã ãã
ïŒ+1ïŒ
ïŒ+1ïŒ
ïŒ+1ïŒ
ç§ãã¡ã¯Fabã䜿çšããŠDebianããã±ãŒãžãæ§ç¯ããŠãããããã«ããè€éããå¢ããŸã
ã¿ããªãããã«ã¡ã¯ã¿ããª
ç§ã¯éãã®ãããã¡ããªãã¯ã®ã¯ããŒã³ãäœæããããšããŠããŸãïŒ
ãã®æ©èœãå¿
èŠãªå Žåã¯ã芧ãã ãã
https://github.com/Friz-zy/factory
ãã®è°è«ã§äœããæ¬ ããŠãããããããŸããããããŒã«ã«ãã¹ããšãªã¢ãŒããã·ã³ã®äž¡æ¹ã§fab run
ã³ãã³ãã§åãã³ãŒãã䜿çšããããã«ç§ãããããšã¯æ¬¡ã®ãšããã§ãã
env.use_ssh_config = True
ãèšå®ããŸããããŒã«ã«ãã·ã³ã§sshãµãŒããŒãå®è¡ããŠããªãå Žåãããã§ã¯åé¡ã¯è§£æ±ºããŸããã
ïŒ+1ïŒ
+1
+1ãã®æ©èœãå®è£ ããŠãã ãã:)
+1
æ¢åã®Fabricã¹ã¯ãªããã䜿çšããŠDockerã€ã¡ãŒãžãããŒãã¹ãã©ããããã®ã«éåžžã«åœ¹ç«ã€å¯èœæ§ããããŸãã ãã®æ©èœã«ãããã³ã³ãããŒã«SSHãµãŒããŒãã€ã³ã¹ããŒã«ããå¿ èŠããªããªããŸããããã¯Dockerã®ãã¹ããã©ã¯ãã£ã¹ã«åã
+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ïŒæè¡çã«ã¯ããŒã«ã«ãã¹ãïŒã§åçããŒã転éãšãã€ã³ãã£ã³ã°ãå®è¡ããsshæ¥ç¶ãããå Žåã¯ã©ããªããŸããïŒãããåé¡ãåŒãèµ·ããå¯èœæ§ãããããšãããããŸãããã®ãããããŒã«ã«ãã¹ãã§ç §åãã127.0.0.1ã§ã¯ãªã解決ããŸãã 127.0.0.0/8ã¯ã©ã¹å šäœããµããŒãããããšã¯ãåŠçããã®ã«è¯ãèããããããŸããã
@ blade2005ã¯ãã127 ._._ã*ã®ç¯å²å
šäœãããŒã«ã«ãã¹ããæããŠããŸãïŒ127.0.0.0ãš127.255.255.255ãé€ãïŒããå®éã«ããŒã«ã«ãã¹ããæããŠãããšãã¯ãããŒããæ£ãã䜿çšããŸãããïŒ
ãããã£ãŠã 127.*.*.* == localhost
ãšsshã¯åé¿ã§ãããšå®å
šã«æ³å®ã§ããŸããã 127.*.*.*:*
ã¯è»¢éãããããŒããæããsshãå¿
èŠã§ãã
æ£çŽãªãšããããã®æ©èœã¯ãæçã©ã€ãã©ãªãšåæ§ã«ããã¡ããªãã¯äžã«æ§ç¯ããããµãŒãããŒãã£ã®ãã©ã°ã€ã³ãšããŠããããããçã«ããªã£ãŠããŸãã 次ã«ãrun / get / put / etcã®ã©ãããããé¢æ°ãã€ã³ããŒãããŸããããã«ãããenvå€æ°ã«åºã¥ããŠããŒã«ã«ã§å®è¡ããããªã¢ãŒãã§å®è¡ããããããããŸãã å°ãªããšããã®æ¹æ³ã§ã誰ãã誰ãã䜿çšã§ããããã«ãããéå§ããããšãã§ããŸãã
ç§ã¯ããŒã«ã«ã§äœããå®è£ ããŸããããããŠããã¯åã«ããŒã«ã«/å®è¡ãåãæ¿ãããããã¯ããã«å€ãã®ä»äºãããŸããã ãã¬ãã£ãã¯ã¹ãå€æŽããããã£ã¬ã¯ããªãsudoãŠãŒã¶ãŒãªã©ãèæ ®ããå¿ èŠããããŸãã
å¥ã®2.0é¢é£ã®ãã±ããã®ã³ã³ããã¹ãã§ããã«ã€ããŠç°¡åã«èããŠãããšãããã run
ãlocal
åãã€ã³ãã«ãªããã ãã§ãªããããã«å€ãã®ããšãçºçããããšã«æ°ä»ããŸããã
local
ãšrun
äž¡æ¹ããŸãã¯put
/ get
ããããã䜿çšãããããããçš®é¡ã®çã«æ··åã¢ãŒãã®ã¿ã¹ã¯run
ãŸãã¯sudo
ãDoesntMakeAnySenseError
äžãã以å€ã®æäœãåŒã³åºãå Žåã§ãããããç解ããå¿
èŠããããŸãã put
/ get
ã¯ããããshutil.copy
ãŸãã¯åæ§ã®ãã®ã«å€ããå¯èœæ§ããããŸãlocal
ã¯ããããå€æŽãããªãã§ãããïŒãã ããäœãèµ·ãã£ãŠããããå°å·ãããšãã¯ã run-except-locally
åã«ä»ããããŠãããã®ãšåºå¥ãããã§ããã...ïŒïŒprefix
ã cd
ãªã©ã®ããŸããŸãªã³ã³ããã¹ãæäœã¡ãœãã/ã³ã³ããã¹ããããŒãžã£ãŒã¯ãã¹ãŠãåæ§ã®è³ªåã«çããå¿
èŠããããŸããsudo
ã³ãã³ããå®è¡ããããšã¯ãæœåšçã«å·šå€§ãªãããã¬ã³ã§ãããããããè¿œå ã®å®å
šãã§ãã¯ãå¿
èŠã§ããlocal
ãžã®åãªãå¥ã®ãã€ã³ãã£ã³ã°ã«ãªããªãéããããã¯å¥ã®å¯èœæ§ã§ãã 倧ããªãã®ã§ã¯ãããŸããããããŒã«ã«ã§ããæ©èœããïŒã€ãŸããLinuxã«ãããã€ãããããããããã€ããŠããïŒ sudo
ã³ãã³ãã¯ãããããããŒã«ã«ã§ç¹æš©ãç¶æããå¿
èŠããããŸãïŒäŸïŒ apt
/ yum
ãšãã®ä»²éããã¡ã€ã¢ãŠã©ãŒã«ã®ããããåããªã©ïŒãsudo
ãïŒJonãåè¿°ããããã«ïŒãsudoãŠãŒã¶ãŒããã¹ã¯ãŒããªã©ãäž¡è
ã§ç°ãªãå¯èœæ§ããããããåå¥ã®local-vs-remoteæ§æãã¯ãã«ãæ§æããå¯èœæ§ãé«ããå¿
èŠããããŸããlocalhost
ã³ã³ããã¹ãã¯åã«é©åãªå€ãæž¡ãããŸãã ïŒããã«ãããªã¢ãŒãã®ãã®ãããŒã«ã«ã§å®è¡ããããã®ãå°çšã®Context
ãµãã¯ã©ã¹ãšããŠãå¿
èŠã«å¿ããŠä»ã®ããšãå®è¡ã§ããŸãïŒã@ max-arnoldã¯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
ïŒInvokeã®ããŒãžã§ã³ïŒãæå¹ã«å®è£
ããå¿
èŠããããŸãã NSã ãããã®çš®é¡ã®ã³ãŒãããŒã¹ã®å€ãã®ã¿ã¹ã¯ããµãã«ãŒãã³ã¯ãããŒã«ã«ãŸãã¯ãªã¢ãŒãã§å®è¡ãããå ŽåããããŸãã@task
ãkwargsãåãã«ãããããŠãŒã¶ãŒãæåŸ
ã宣èšã§ãããã©ããã«äŸåããå¯èœæ§ããããŸãïŒã€ãŸããããªã¢ãŒã察å¿ã®ã³ã³ããã¹ããæ¬åœã«äžããããã ããªã¢ãŒã察å¿ã®ã³ã³ããã¹ããæããŠã¯ãããŸããããªã©ïŒ@task
/ Task
åšãã«ç¬èªã®è»œéã©ãããŒãæé·ããããããšã¯æããã§ãã pure-Invokeã³ãŒãããŒã¹ã¯@task
ã䜿çšããã ãã§ãåžžã«ããã©Context
ãããªã¬ãŒãããŸãããFabricã®ããŒãžã§ã³ãä»ããŠäœæãããã¿ã¹ã¯ã«ã¯ãå°ãªããšãConnection
ãäžãããããªãã·ã§ã³ããããŸãã ctx.run()
ååšããéã_ãã³ã³ããã¹ããµãã¯ã©ã¹ã_æ°ã«ããŸãã_ã@task
ãããŒã¹ã®ããã©ã³ã³ããã¹ãã®ã¿ãå¿
èŠãããŒãžã§ã³ã§è£
食ããããšæãã§ãããã Context
代ããã«Connection
ã¿ã¹ã¯ããŸããlocal
æåŸ
ããŸãïŒãã¡ããªãã¯/æ¥ç¶-Invokeãä»ããŠå®è¡ãããã³ãŒããæåŸ
ããŸãïŒrun
ã³ã³ããã¹ããäžãããããšãã«ã run
ãããŒã«ã«ã§å®è¡ãããããšãæåŸ
ããŸãïŒãã¡ããªãã¯ãä»ããŠå®è¡ãããã³ãŒãã®åŒã³åºã/ã³ã³ããã¹ããæåŸ
ããŸãïŒConnection('localhost').run('foo')
ã_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
ãšããååã§ãPythonã³ãŒãã®ã¿ãå«ãŸããjinjaã¯å«ãŸããŠããªããšããŸãã
ããã§ããŒã«ã«ã§ãã¹ããããã®ã§ããã settings.py.j2
ããã¬ã³ããªã³ã°ããå¿
èŠããããããããŒã«ã«ã«ã¯ãŸã settings.py
ãããŸããã
ãã®ãããã¢ããªãèµ·åã§ãããããŒã«ã«ãã¹ãçšã«åå¥ã®settings.py
æåã§äœæããå¿
èŠããããŸãã
ããã¯éåžžã«ç²ããŸãããããŠããã¯ãã£ãšç°¡åãªã¯ãã§ãã
ããšãã°ãAnsibleã§ã¯ããããŒã«ã«æ¥ç¶ãã䜿çšããããšãã¿ã¹ã¯ã«æ瀺ããã ãã§ãSSHã§æ¥ç¶ããããšããã«ããŒã«ã«ãã¹ãã§ã¬ã³ããªã³ã°ãããŸãã
ãã®æ©èœãFabricã§å©çšå¯èœã«ãªããŸã§ã¯ããã¡ãããæ°è¡ã®ã³ãŒãã§ãããããäžèšã§è²Œãä»ãããœãªã¥ãŒã·ã§ã³ã䜿çšããŸãã ç§èŠã§ãããã£ãšç°¡åãªã¯ãã§ãã ããã¯æ¬åœã«çå°ãç§ã«ãšã£ãŠç°¡åã«ããã¹ããã®ã®ãããªãã®ã ãšæããŸãã
@fninja upload_template
èªäœã¯ãŸã 移æ€ããŠããŸãããããã®åé¡é åã«è©²åœããããšã«ã¯ééããªãåæããŸãã ãããããJinja-wrappingã¬ã³ããªã³ã°ã¹ããããšupload-some-stringã¢ããããŒãã¹ããããåå²ããã ãã§ãããåŠçã§ããŸããåŸè
ã¯ãã§ã«ã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
åŒæ°ãåããµãã«ãŒãã³ã®ããããã§ããã Connection
upload_template
ããã«çã1ã¹ãããã¢ããã°ã®äœå°ã¯ãããããŸã ãããŸãã
ãããã«ãããããã¯ããã«å€ãã®è³ªåãæèµ·ããŸãïŒæ£ç¢ºã«ãã®çš®ã®ãã®ãã©ã®ããã«æ±ãã-ããšãã°ãåŒã³åºãã®ã¿- Context
ãªããžã§ã¯ãã«ã¯put
/ get
ããããŸããã ããããè¿œå ãã䟡å€ã¯ãããŸããïŒ ãã®ãã±ããã®ã³ã³ããã¹ãã§ã¯ãFabricãŠãŒã¶ãŒã«ãšã£ãŠã¯ååã«çã«ããªã£ãŠããŸãïŒãã®å Žåã upload_template
ãŸãã¯w / eã¯ã©ã¡ãã®å Žåãåã«put
ãåŒã³åºãããšãã§ããŸãïŒããçŽç²ãªåŒã³åºããŠãŒã¶ãŒã«ãšã£ãŠã¯å¥åŠã§ã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
ãå±éãããªã©ãç°¡åã«å¯ŸåŠã§ããªãåé¡ããããŸãã
æãåèã«ãªãã³ã¡ã³ã
誰ããããªã誰ãããããè¡ãã®ãããšçåã«æã£ãŠããå Žåãçãã¯ããããã€ã¡ã³ããã€ãã©ã€ã³ãããå ŽåãããŒã«ã«ãã¹ãçšã®ç¹å¥ãªã»ããã¢ããã¹ã¯ãªãããçšæããããããã©ã®ç°å¢ã«é¢ä¿ãªãããŸã£ããåããããã€ã¡ã³ãã¹ã¯ãªãããå®è¡ãããšåœ¹ç«ã€å Žåããããšããããšã§ãã察ä»ã®ãã¹ãŠã