å·çæç¹ã§ã¯ãv2ãã©ã³ãã«ã¯Group
ã¯ã©ã¹ãããã以åã¯ãããŒã«ããå¥åãäœããå®è¡ããããã®ãã¹ãã®æããšããŠç¥ãããŠãããŠããããšããŠæ©èœã§ããã¯ãã§ãã
ãã ãã Group
ãªããžã§ã¯ããæŽçãŸãã¯ã©ãã«ä»ãããç¹å®ã®æ¹æ³ã¯ãŸã ãããŸããã ããã¯ãç¬èªã®äœææ¹æ³ã䜿çšãããäžçŽãŠãŒã¶ãŒã®çŽç²ãªAPIãŠãŒã¹ã±ãŒã¹ã«ã¯ååã«ãå®äºãããŠããŸããããã¬ãŒã ã¯ãŒã¯ãæ§ç¯ãããCLIæåã®ãŠãŒã¶ãŒãäžçŽè
ã«ã¯äœããããŸããã
å¥ã®èšãæ¹ãããã°ãçŽç²ã«APIã䜿çšããŠããå Žåãé€ããŠãCLIãŸãã¯ã¿ã¹ã¯åŒã³åºããããã«ããããèŠã€ããæ¹æ³ããªãå Žåãã°ã«ãŒããªããžã§ã¯ããã©ããã«çœ®ããŠãæå³ããããŸããã
v1ã§ã¯ãããŒã«ã¯äºå®äžãåçŽãªæååã©ãã«ãv2ã®ã°ã«ãŒãã«ãããã³ã°ããåäžã®ãã©ãããªåå空éã§ãããå®è¡æã«CLIã§éžæãããïŒ fab --roles=web,db
ïŒãã¿ã¹ã¯ã®ããã©ã«ãã¿ãŒã²ãããšããŠç»é²ãããã§ããŸããïŒ @task('db') \n def migrate():
ïŒããã¹ããšãã䌌ãŠããŸãã
ãŠãŒã¶ãŒã¯ããããenv.roledefs
ã§å®çŸ©ããŸãããããã¯åçŽãªå£è¿°ã§ãã äžçŽããäžçŽã®æ©èœã¯ãéåžžã¯å®è¡æïŒãã¬ã¿ã¹ã¯ãŸãã¯ãµãã«ãŒãã³ãä»ããŠïŒãå Žåã«ãã£ãŠã¯ã¢ãžã¥ãŒã«ã®ããŒãæã«å€æŽããããšãäžå¿ã«å±éãããŸããã
Group
ããã³/ãŸãã¯Connection
ã®å埩å¯èœãªãã®ãååŸããŸããLexicon
代ããã«dict
ãdb
ã web
ã lb
ãšããååã®çŽæ¥ãããã³ã°ããããŸããã2çªç®ã®å±€ã®ååã¯prod
ã¯ãåžžã«ä»ã®3ã€ã®åéåã§ãã ãããLexicon
ã«è¿œå ãããã©ããã¯ãŸã å¿ããŠããŸãã ãã§ã«ãããè¡ã£ãŠããä»ã®ããããµãã¯ã©ã¹ãããå¯èœæ§ããããŸããif cxn in group
å Žåã§ãåäœããŸãcxn
åå¥ã®ãªããžã§ã¯ãã§ãããŸãgroup
å
ã®åçã®ã¡ã³ããŒãããdb
ããŒã«ã«å¯ŸããŠå®è¡ãããŸãã@group
ã®ããã«@task
ãããã³æ©èœã¯ãäœæ¥ã®å®è¡åäœã§ã¯ãªãã代ããã«ã°ã«ãŒãããªããžã§ã¯ãããããããŸããã¡ãŒãªã³ã°ãªã¹ãããïŒ
ãããã€ãããããžã§ã¯ãã«å¿ããŠenv.roledefsã«åçã«ããŒã¿ãèšå®ããç¬èªã®å éšRESTAPIãå®è£ ãããã¹ãæååããããžã§ã¯ãã®fabfileã«åã蟌ãã ããCLIã§æå®ãããããªãããšã«å€§ããäŸåããŠããŸãã
ç§ãã¡ã®ãŠãŒã¹ã±ãŒã¹ã¯æ¬¡ã®ãšããã§ãã
EnvironmentDatabaseAPIClient(
'https://rest.api.url/schema/',
env.service_name,
).apply_env()
ãµãŒããŒç°å¢ã®æ°-è€æ°ã®ãã¹ãç°å¢ïŒäžéšã¯ãã©ã€ããŒããäžéšã¯ãããªãã¯ïŒããã³è€æ°ã®æ¬çªç°å¢ïŒç°ãªãã¯ã©ã€ã¢ã³ãçšïŒã åç°å¢ã¯1ã€ä»¥äžã®ãã¹ãã§æ§æããããã¡ããªãã¯ã®åœ¹å²ã«ããããããŸãã
åãµãŒãã¹ïŒäžèšã®äŸã§ã¯env.service_name
ïŒã«ã¯ãç°ãªãç°å¢ã®ã»ããããããŸãã
ãŸããã¡ã¿ããŒã«ïŒããŒã«ã®ã°ã«ãŒãïŒããããŸãã ãã¬ãã£ãã¯ã¹ã¯group-
ïŒ group-production
ã group-test
ã group-external
ã group-internal
ã group-all
ã§ãã ããã«ããã1ã€ãã€æå®ããã«è€æ°ã®ãµãŒããŒããŒã«ã«ãããã€ã§ããŸããããšãã°ã group-all
ã¯ãæ¬çªãšãã¹ãã®äž¡æ¹ã®ãã¹ãŠã®ããŒã«ã«ãããã€ãããŸãã
ããŒã«ã°ã«ãŒããããŒã«ãããã³ãã¹ãã«é¢ããæ å ±ãå°å·ããããã®ç¹å¥ãªãã¡ããªãã¯ã¿ã¹ã¯ããããŸãã
ãŸãããã¹ãæååãããŒã«åã«éãããã³ã°ããããšã«å€§ããäŸåããŠããŸãïŒãã¹ãæååã¯service_nameããšã«äžæã§ãïŒã ããã¯ããããã€ã¡ã³ãã®ãã®ã³ã°ãšéç¥ã«äœ¿çšãããŸãã åºæ¬çã«ããµãŒãã¹ã®ãããã€ãåãã¹ãã«èšé²ãããµãŒãã¹ãããŒã«å
ã®ãã¹ãŠã®ãã¹ãã«ãããã€ããããšãã«Slackéç¥ãéä¿¡ããŸãã EnvironmentDatabaseAPIãµãŒããŒããããæ
åœããŸãïŒãã°ãšãããã€ã¡ã³ãç¶æ
ãä¿æããŸãïŒã ããã¯ã env.host
ã env.port
ãããã³env.service_name
ïŒããã³ã³ãããæ
å ±ïŒãAPIãµãŒããŒã«éä¿¡ãããã³ã¬ãŒã¿ã§ãã¡ããªãã¯ã¿ã¹ã¯ãè£
食ããããšã«ãã£ãŠè¡ãããŸãã
å°æ¥çã«ã¯ãããã€ã¡ã³ãèªèšŒãè¿œå ããäºå®ã§ãããŸãããµãŒããŒããããã«env
å€æ°ãååŸããŠãã¿ã¹ã¯ã³ã³ããã¹ãå
ã§äœ¿çšã§ããããã«ããå¯èœæ§ãéåžžã«é«ããªããŸãã
@ max-arnoldã«æè¬ããŸãïŒ éå»ã®ç§èªèº«ã®ãŠãŒã¹ã±ãŒã¹ããããããã®å€ããèªèããŠããŸãã ç¹ã«ãªããŒã¹ãããã³ã°ãããã¯v1ã§äœåºŠãç»å ŽããããšãèŠããŠããã®ã§ããªã¹ãã«è¿œå ããŸããã
Fabric v2ã圹ç«ã€ããã«ããã«ã¯ãã¿ã¹ã¯ãå®è¡ãããã¹ãã®ã»ãããfab
ã«æ瀺ããæ¹æ³ãå¿
èŠã§ãã
以åãããŒã«ãå®çŸ©ããŠããfab -R ...
ã ïŒå®éã«ã¯ãããŒã«ã¯IPã¢ãã¬ã¹ç¯å²ã䜿çšããŠããã°ã©ã ã§å®çŸ©ãããŠããŸãããããã¯å¿
é ã§ã¯ãªããYAMLãã¡ã€ã«å
ã®éçãªã¹ãã§åé¡ãããŸãããïŒ
Fabric v2ã§åçã®ãã®ãèŠã€ããããšãã§ããã次ã䜿çšããŠãã®æ©èœããšãã¥ã¬ãŒãããããšãã§ããŸããã§ããã
fabric.yaml
æ§æãã¡ã€ã«ãå«ãactive_hostset: null
hostsets:
myhostset:
- ...
active_hostset = config["hostsets"][config["active_hostset"]]
fabfile.py
env INVOKE_ACTIVE_HOSTSET=myhostset fab ...
äºæ³ããããã¹ãã®ãªã¹ãã®ä»£ããã«ã KeyError: 'active_hostset'
ãååŸããŸãã
ãã¡ããªãã¯v1ã®åç°å¢ã®å圹å²ã«ç°ãªããã¹ãã®ã»ãããããããã role.environment:staging
ã¿ã¹ã¯ãå®è¡ããŠç°å¢ãæå®ããããšã§ç°å¢ãèšå®ããŸãã ãããã£ãŠããã®ã¿ã¹ã¯ã¯ã次ã®ã¿ã¹ã¯ã§äœ¿çšããããã¹ãã«åœ±é¿ãäžããŸãã
v2ã§ã¯ãã«ã¹ã¿ã ã¿ã¹ã¯ã䜿çšããããšããŸããããåé¡ã¯Executor.expand_calls
role.environment
ã¿ã¹ã¯ãå®è¡ãããåã«Executor.expand_calls
ãå®è¡ãããããããã¹ããªã¹ããåçã«æ§ç¯ããããã«æ¬¡ã®ã¿ã¹ã¯ã®ããããç°å¢ãèªèããŠããŸããã
Executor.expand_calls
ããžã§ãã¬ãŒã¿ãŒã«ãããšãã¿ã¹ã¯ã®å®è¡ãåŸã®ã¿ã¹ã¯ã®å®è¡ã«åœ±é¿ãäžããããšãã§ããŸãã ãããã£ãŠãäžèšã®äŸã¯æ©èœããŸããããã§ã¯ã圹å²ããã¹ãã«é©åã«æ¡åŒµããããã®ç°å¢ãç¥ãå¿
èŠãããã«ã¹ã¿ã Task
ããããŸãã äŸïŒ fab role.environment dev deploy.app
- deploy.app
ãå±éãããåã«role.environment
ã¿ã¹ã¯ãå®è¡ãããããã«ãªã£ãããã deploy.app
ã¯ç°å¢ãèªèãããã®ãã¹ããæ§æããŠãæ£ããã¿ã¹ã¯ã®ã»ããã
ç§ã¯ããããã©ãŒã¯ã§ãããã¿ã€ãåããŸããïŒ
https://github.com/pyinvoke/invoke/compare/master...rectalogicïŒexpand-generator
https://github.com/fabric/fabric/compare/master...rectalogicïŒexpand-generator
ããã«ã¡ã¯ãç§ã¯äœå¹ŽãåŸã«ãã®ãœãããŠã§ã¢ã«äœãèµ·ãã£ãã®ãããããŸããããç¹ã«$ fab -R dev
å®è¡ããŠãããšãã Fabric @ 1.xã®ãããŒã«ãã®æŠå¿µãæ¬åœã«èŠéããŸãã
ãŸããããŒã«ã䜿çšããŠãç°ãªãç°å¢éã§åãäžé£ã®æäœãè¡šããŸãã ãããããååä»ãã®åœ¹å²ãšååä»ãã®ç°å¢ã®æŠå¿µãåé¢ããããšã¯æçšã§ããããïŒ ã®ããã«ãéçºç°å¢ã§ã®WebããŒã«ã
æãåèã«ãªãã³ã¡ã³ã
ããã«ã¡ã¯ãç§ã¯äœå¹ŽãåŸã«ãã®ãœãããŠã§ã¢ã«äœãèµ·ãã£ãã®ãããããŸããããç¹ã«
$ fab -R dev
å®è¡ããŠãããšãã Fabric @ 1.xã®ãããŒã«ãã®æŠå¿µãæ¬åœã«èŠéããŸãã