Fabric을 이용한 간단한 Tomcat deploy
Tomcat war deploy시, 가장 이상적인 방법은
tomcat stop > copy war > start 순서이다.
아래는 간단하게 Python 기반의 Fabric을 이용하여, EC2상에서 pem (SSH)를 이용하여, Host들에 deploy하는 과정을 정의함
#fabfile.py
from fabric.api import run,env,execute,task
from fabric.operations import local,put
def tomcat_cluster():
env.user ='root'
env.hosts=['host1.server.com','host2.server.com'] # list of server setting
env.key_filename='~/pem/pemfile.pem' # pem file
def hostname():
run('uname -a')
def start():
run('/etc/init.d/tomcat6 start') # tomcat instance stop
def stop():
run('/etc/init.d/tomcat6 stop') # tomcat instance stop
def copy():
put('./dummy.war','/root/war') # file copy
def deploy():
execute(stop)
execute(copy)
execute(start)
해당 파일을 fabfile.py에 저장후에
%fab tomcat_cluster deploy
해주면 아래와 같은 순서로 수행됨
host1.stop()
host1.copy()
host1.start()
host2.stop()
host2.copy()
host2.start()
※ 참고 : 외부에서 Host 명을 dynamic하게 받는 방법
--------------------------------
외부에서 host list 받는 방법
def deploy(lookup_param):
# This is the magic you don't get with @hosts or @roles.
# Even lazy-loading roles require you to declare available roles
# beforehand. Here, the sky is the limit.
host_list = external_datastore.query(lookup_param)
# Put this dynamically generated host list together with the work to be
# done.
execute(do_work, hosts=host_list)
실행할때는
$ fab deploy:app
------ 또는 -----------
# Marked as a publicly visible task, but otherwise unchanged: still just
# "do the work, let somebody else worry about what hosts to run on".
@task
def do_work():
run("something interesting on a host")
@task
def set_hosts(lookup_param):
# Update env.hosts instead of calling execute()
env.hosts = external_datastore.query(lookup_param)
$ fab set_hosts:app do_work
One benefit of this approach over the previous one is that you can replace do_work with any other “workhorse” task:
$ fab set_hosts:db snapshot
$ fab set_hosts:cassandra,cluster2 repair_ring
$ fab set_hosts:redis,environ=prod status