ansistrano.deployããã³ansistrano.rollbackã¯ãã¹ã¯ãªããããã°ã©ãã³ã°èšèªïŒPHPãPythonãRubyãªã©ïŒã§äœæãããã¢ããªã±ãŒã·ã§ã³ã®å±éããã»ã¹ãå¶åŸ¡ããããã«èšèšãããAnsibleããŒã«ã§ãã ããã¯æ¬è³ªçã«Ansibleã®Capistranoã®å®è£
ã§ãã
Ansistranoã䜿çšãããšã次ã®å©ç¹ããããŸãã
- ç§åäœã®ããŒã«ããã¯ïŒansistrano.rollbackã®åœ¹å²ïŒ;
- éèŠãªã¹ãããã®ãåãããã³ãåŸãã€ãã³ããã³ãã©ãŒã¡ãœããã䜿çšããŠå±éæé ãèšå®ããŸãã
- éãããæ°ã®ãªãªãŒã¹ãä¿åããããšã«ããããã£ã¹ã¯äœ¿çšéãæé©åãã
- SCPãRSYNCãGITãSVNãHTTPããŠã³ããŒããŸãã¯S3 GETå±éæŠç¥ã®éžæïŒããã«ã ã¢ãŒã«ã€ãè§£é€ã䜿çšã§ããŸãïŒã
ã¢ã³ã·ã¹ãã©ãã®ç»å Ž
æåã¯ããµãŒããŒç®¡çèªååããŒã«ã§ããCapistranoããããŸããã çŸåšã®ããŒãžã§ã³ã«ã¯3ãšããçªå·ãä»ããããŠããŸããRoRã¢ããªã±ãŒã·ã§ã³ãå±éããããã«ããŒãžã§ã³2.0ãäœæãããŸããã ãã©ã°ã€ã³ã䜿çšãããšãããŸããŸãªå±éæŠç¥ããã¹ãç°å¢ãªã©ã䜿çšããŠãPHPãPythonãªã©ã§èšè¿°ãããéRailsã¢ããªã±ãŒã·ã§ã³ãæäœã§ããŸãã ãããŠããã¯è¯ãã£ãã
Capistrano 2ã¯ãåŒãç¶ãæ©èœããåªããããŒã«ã§ãã ããããéçºè
ã3çªç®ã®ããŒãžã§ã³ã«åãæ¿ããããããµããŒããããªããªããŸããã åæã«ãAnsistranoã®äœæè
ã«ãããšãCapistrano 3ã¯æè»æ§ãäœããããã»ã©åŒ·åã§ã¯ãªãã以åã®ããŒãžã§ã³ãšåãæ©èœã»ãããåããŠããŸããã ããã«ãä»ã®ã¢ããªã±ãŒã·ã§ã³å±éããŒã«ïŒAnsibleãªã©ïŒã¯ãŸã æ©èœãããåžžã«æ¹åãããŠããŸãã
Ansistranoã®éçºè
ã¯ãããŒãžã§ã³2ã®ãµããŒãã®æ¬ åŠãšv3ã®æ©èœã®æ¬ åŠãããã³å¿
èŠãªãã¹ãŠã®ã¿ã¹ã¯ãAnsibleã§å®è¡ã§ãããšããäºå®ã«ããCapistranoã®æŸæ£ã«ã€ããŠèª¬æããŠããŸãã å¥ã®æ¹æ³ã¯ãFabricãšChef Soloã調ã¹ãããšã§ãã
ã¡ãªã¿ã«ããããžã§ã¯ãã®åå-Ansistranoã¯ãAnsibleãšCapistranoãçµã¿åãããŠååŸãããŸããã
Ansistranoå¿å䜿çšçµ±èš
æè¿ã远å ã®ãªãã·ã§ã³ã®ã¹ããããAnsistranoã«è¿œå ãããŸãããããã«ãããéçºè
ã¯ãAnsistranoã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãå±éããŠãã人æ°ãç¥ãããšãã§ããŸãã Ansible Galaxyã¯ããŠã³ããŒãã䜿çšã«é¢ããçµ±èšæ
å ±ãæäŸããŠããªããããAnsistranoã®èè
ã¯ãããããããžã§ã¯ãã®ãŠãŒã¶ãŒæ°ã調ã¹ãããã®ã»ãŒå¯äžã®æ¹æ³ã§ãããšäž»åŒµããŠããŸãã
å¿åçµ±èšãåéããããã®ã³ãŒãã¯ãã¡ãã§ãã ããã ãããŒã ãã¹ãŠã®ãã¬ã€ããã¯ã§ansistrano_allow_anonymous_stats
èšå®ãfalseã«èšå®ãããšãæ©èœãç¡å¹ã«ã§ããŸãã
誰ãAnsistranoã䜿çšããŠããŸããïŒ
Ansistranoã䜿çšããæºåã¯ã§ããŠããŸããïŒ
以äžã¯ãAnsistranoãæ±ãããã€ãã®äŒæ¥ã§ãã ã€ã³ã¹ããŒã«ãšã¢ããã°ã¬ãŒã
Ansistranoã§ã¢ããªã±ãŒã·ã§ã³ããããã€ããã«ã¯ã次ã®ãã®ãå¿
èŠã§ãã
- äžå€®ã®ãã·ã³ã§å®çŸå¯èœã
- ã¿ãŒã²ãããã·ã³äžã®
rsync
ïŒãããã€ã¡ã³ãæŠç¥ãrsync
ã git
ãŸãã¯ansistrano_current_via = rsync
ïŒã
Ansistranoã¯Ansible Galaxyããå
¥æã§ããŸãã ã€ã³ã¹ããŒã«ãéå§ããã«ã¯ã次ãå®è¡ããŸãã
$ ansible-galaxy install carlosbuenosvinos.ansistrano-deploy carlosbuenosvinos.ansistrano-rollback
Ansistranoãã¢ããã°ã¬ãŒãããã«ã¯ã--force ãªãã·ã§ã³ã远å ããŸã ã
$ ansible-galaxy install --force carlosbuenosvinos.ansistrano-deploy carlosbuenosvinos.ansistrano-rollback
åºæ¬çãªä»äºã®ã¹ããŒã
Ansistranoã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®ãããã€ã¯ãCapistranoãšåããã¿ãŒã³ã«åŸããŸãã
- ã»ããã¢ããïŒãªãªãŒã¹ãä¿åããããã®ãã£ã¬ã¯ããªæ§é ãäœæããŸãã
- ã³ãŒãã®æŽæ°ïŒãªãªãŒã¹ãã¿ãŒã²ãããã·ã³ã«ããŠã³ããŒãããŸãã
- ãªã³ã¯ã®æŽæ°ïŒã·ã³ããªãã¯ãªã³ã¯ïŒïŒã¿ãŒã²ãããã·ã³ã«æ°ãããªãªãŒã¹ãå±éããåŸã
current
ãªã³ã¯ã¯æ°ãããªãªãŒã¹ã«èšå®ãããŸãã - ã¯ãªãŒã³ã¢ããïŒ
ansistrano_keep_releases
ãã©ã¡ãŒã¿ãŒãèæ
®ããŠãå€ãããŒãžã§ã³ãåé€ãããŸãïŒãããŒã«å€æ°ããåç
§ïŒã

ããŒã«å€æ°
以äžã¯ãåç
§çšã®Ansistrano倿°ã®ãªã¹ãã§ãã
ããŒã«å€æ°ãªã¹ã - vars: ansistrano_deploy_from: "{{ playbook_dir }}"
{{ playbook_dir }}
ã¯ãçŸåšã®ãã¬ã€ããã¯ãžã®ãã¹ãæ ŒçŽããAnsible倿°ã§ãã
å±é
Ansistranoã䜿çšããŠå±éããã«ã¯ãããã€ãã®æé ãå®è¡ããŸãã
- æ°ãã
hosts
äœæhosts
ã 質åãããå Žåã¯ã Ansible Inventoryã®ããã¥ã¡ã³ããåç
§ããŠãã ããã ãã®ãã¡ã€ã«ã«ã¯ãã¿ãŒã²ãããã·ã³ã衚瀺ãããŸãã - æ°ãããã¬ã€ããã¯ãäœæããŠãã¢ããªã±ãŒã·ã§ã³ããããã€ããŸãïŒäŸïŒ
deploy.yml
ïŒã - ããŒã«å€æ°ãæ§æããŸãã
- ã¹ã¯ãªããã«
carlosbuenosvinos.ansistrano-deploy
ããŒã«ãå«ããŸãïŒåçïŒã - ãã¬ã€ããã¯ãèµ·åããŸãã
ansible-playbook -i hosts deploy.yml
ãã¹ãŠãæ£ããæ§æãããŠããã°ããã®ã³ãã³ãã¯ãµãŒããŒäžã«ãããæ¬¡ã®ãã£ã¬ã¯ããªæ§é ãäœæããŸãã 1ã€ã2ã€ãããã³3ã€ã®å±éã®åŸã«hostsãã£ã¬ã¯ããªãã©ã®ããã«èŠãããã確èªããŸãã
-- /var/www/my-app.com |-- current -> /var/www/my-app.com/releases/20100509145325 |-- releases | |-- 20100509145325 |-- shared
-- /var/www/my-app.com |-- current -> /var/www/my-app.com/releases/20100509150741 |-- releases | |-- 20100509150741 | |-- 20100509145325 |-- shared
-- /var/www/my-app.com |-- current -> /var/www/my-app.com/releases/20100512131539 |-- releases | |-- 20100512131539 | |-- 20100509150741 | |-- 20100509145325 |-- shared
é æ¬¡å±é
serial
ãªãã·ã§ã³ã䜿çšããŠè€æ°ã®ãµãŒããŒã«å±éãããšãã«ç°ãªãã¿ã€ã ã¹ã¿ã³ããã€ã³ã¹ããŒã«ãããã®ãé²ãã«ã¯ã ansistrano_release_version
倿°ãèšå®ããŸãã
ansible-playbook -i hosts -e "ansistrano_release_version=`date -u +%Y%m%d%H%M%SZ`" deploy.yml
ããŒã«ããã¯
Ansistranoã§ããŒã«ããã¯ããã«ã¯ãå±éãæ§æããããŒã«ããã¯ãã¬ã€ããã¯ãå®äºããå¿
èŠããããŸãã
ansible-playbook -i hosts rollback.yml
ãããã€ããããªãªãŒã¹ã®æ°ã1ãŸãã¯0ã«ããŒã«ããã¯ããããšãããšããšã©ãŒãçºçããŸãã ã¢ã¯ã·ã§ã³ã¯å®è¡ãããŸããã
ããŒã«ããã¯ã·ããªãªã§ã¯ããããã€ãšæ¯èŒããŠã«ã¹ã¿ã 倿°ãã¯ããã«å°ãªããªããŸãã
- vars: ansistrano_deploy_to: "/var/www/my-app"
倿®µéç°å¢ïŒéçºãäºåçç£ãçç£ãªã©ïŒ
ããŸããŸãªç°å¢ïŒããšãã°ã devel ã preprodããã³prod ïŒã«ãããã€ããå Žåã¯ãããããã«ç°ãªããã¹ããã¡ã€ã«ãäœæããããšããå§ãããŸãã -iãªãã·ã§ã³ã䜿çšãããšãç°ãªããã¹ããã¡ã€ã«ã«å¯ŸããŠåããã¬ã€ããã¯ãå®è¡ã§ããŸãã ãããã®åãã¡ã€ã«ã§ã¯ãç°ãªãããŒã¿ïŒãŠãŒã¶ãŒåããã¹ã¯ãŒããæ¥ç¶ãã©ã¡ãŒã¿ãŒãªã©ïŒã瀺ãããšãã§ããŸãã
ansible-playbook -i hosts_devel deploy.yml ansible-playbook -i hosts_preprod deploy.yml ansible-playbook -i hosts_prod deploy.yml
ããã¯ïŒã«ã¹ã¿ã ã¿ã¹ã¯
Symlink
ã¹ãããã®åŸãéåžžã¯ãµãŒããŒãåèµ·åãããã Code update
åã«äŸåé¢ä¿ãããŠã³ããŒããããã Symlink
åã«å®çšŒåã§è¡ãå¿
èŠããããŸãã ãããã£ãŠãã«ã¹ã¿ã ã¿ã¹ã¯ãå®äºããã«ã¯ã3ã€ã®äž»èŠãªåã¹ãããã®åãŸãã¯åŸã«Ansistranoãå®äºããããã¯ãå¿
èŠã§ãã
-- /my-local-machine/my-app.com |-- hosts |-- deploy.yml |-- my-custom-tasks | |-- before-code-update.yml | |-- after-code-update.yml | |-- before-symlink.yml | |-- after-symlink.yml | |-- before-cleanup.yml | |-- after-cleanup.yml
ããšãã°ã after-symlink.yml
ã¹ãããåŸã«Apacheãåèµ·åããã«ã¯ã after-symlink.yml
次ã®è¡ã远å ããŸãã
- name: Restart Apache service: name=httpd state=reloaded
å±éãã¡ãŒã«ã§å®äºããããšãéç¥ãããããã£ãã·ã¥ãã¯ãªã¢ããã«ã¯ã©ãããã°ããã§ããïŒ ãšãŠãç°¡åã§ãïŒ ããŒã«ansistrano_before_*_tasks_file
ããã³ansistrano_after_*_tasks_file
ã®å€æ°ã䜿çšããŠãåã¹ãããã®ãåãããã³ãåŸãã®ãã€ã³ãã«ã«ã¹ã¿ã ã¿ã¹ã¯ãæã€ãã¡ã€ã«ãæå®ã§ããŸãã
ã«ã¹ã¿ã ã¿ã¹ã¯ã®å€æ°
ã«ã¹ã¿ã ã¿ã¹ã¯ãã¡ã€ã«ãäœæããå ŽåãAnsistranoã§äœ¿çšå¯èœãªå€æ°ã®ããã€ããå¿
èŠã«ãªãå ŽåããããŸãã
{{ ansistrano_release_path.stdout }}
ïŒå±éã®ããã®çŸåšã®ãªãªãŒã¹ãžã®ãã¹ïŒããã¯ããããæãå¿
èŠãªå€æ°ã§ãïŒã{{ ansistrano_releases_path.stdout }}
ïŒãªãªãŒã¹ãã£ã¬ã¯ããªãžã®ãã¹ã{{ ansistrano_shared_path.stdout }}
ïŒå
±æãã©ã«ããŒãžã®ãã¹ïŒãã¹ãŠã®ãªãªãŒã¹ã«å
±éã®ãã¡ã€ã«ãä¿åã§ããå ŽæïŒ;{{ ansistrano_release_version }}
ïŒãªãªãŒã¹ãã£ã¬ã¯ããªã®çžå¯ŸåïŒããã©ã«ãã¯UTCãŸãŒã³ã®çŸåšã®ã¿ã€ã ã¹ã¿ã³ãã«ãªããŸãïŒã
å€ããªãªãŒã¹ãåé€ãã
ç¶ç¶çããªããªãŒã䜿çšãããç°å¢ã§ã¯ãéåžžãåçšã§äœ¿çšããããã®å€ãã®ãªãªãŒã¹ããããŸãã 空ããã£ã¹ã¯é åãéå°ã«ãã幞éãªäººã¯ããããåé¡ãšã¯æããªããããããŸããããéãããæ°ã®ãªãªãŒã¹ã®ã¿ãä¿åããã®ãäžè¬çã§ãã
å±éåŸã«å€ããªãªãŒã¹ãåé€ããã«ã¯ãä¿æãããéãansistrano_keep_releases
倿°ã«æžã蟌ã¿ãŸãã
3ã€ã®ãªãªãŒã¹ãšansistrano_keep_releases: 2
ãããã€ãããšãã®Ansistranoã®åäœãèŠãŠã¿ãŸãããansistrano_keep_releases: 2
ïŒ
-- /var/www/my-app.com |-- current -> /var/www/my-app.com/releases/20100509145325 |-- releases | |-- 20100509145325 |-- shared
-- /var/www/my-app.com |-- current -> /var/www/my-app.com/releases/20100509150741 |-- releases | |-- 20100509150741 | |-- 20100509145325 |-- shared
-- /var/www/my-app.com |-- current -> /var/www/my-app.com/releases/20100512131539 |-- releases | |-- 20100512131539 | |-- 20100509150741 |-- shared
ãªãªãŒã¹20100509145325
åé€ãã20100509145325
ããããšã«æ³šæããŠãã ããã
ãã¬ã€ããã¯ã®äŸ
Ansistranoãªããžããªã®example
ãã£ã¬ã¯ããªã«ã¯ãå°ããªã¢ããªã±ãŒã·ã§ã³ããããã€ããäŸãæäŸãããã¢ãããžã§ã¯ãããããŸãã
å®è¡ããã«ã¯ãVagrantããŒã«ãšAnsistranoããŒã«ãå¿
èŠã§ãã Vagrantã®æäœã«ã€ããŠã¯ã httpsïŒ //www.vagrantup.comãåç
§ããŠãã ãã ã
$ cd example/my-playbook $ vagrant up $ ansible-playbook -i hosts deploy.yml
ãããã®ã³ãã³ããå®è¡ãããšã my-app
ãã£ã¬ã¯ããªã«ããindex.htmlãã¡ã€ã«ãVagrantã䜿çšããŠäœæãããäž¡æ¹ã®ãã·ã³ã«ãããã€ãããŸãã
ããŒã«ããã¯ããã¹ãããã«ã¯ã deploy.ymlãå°ãªããšã2åå®è¡ããå¿
èŠããããŸãïŒãã®ãããããŒã«ããã¯ãããã®ããããŸãïŒã ãã®åŸïŒ
$ ansible-playbook -i hosts rollback.yml
ãã¹ããã©ã«ããŒã«ã¯ãTravis-CIã䜿çšããããè€éãªäŸããããŸãã