요새 50여대의 서버에 소스를 배포하는 것이 너무 오래 걸려서 배포 방법에 대해서 알아보는 중이다.
처음 개발을 시작하면서는 이런 배포에 대해서 잘 알지 못했다. 프로그래밍만 배웠지 서버에 배포하는건 학교에서 가르쳐주지 않는다. 심지어 선배들도... (요새는 다를 수도 있겠다) 그래서 회사에 와서 접해본 것이 아는 것의 전부인데 오래된 서비스를 하다보니 배포 방법도 오래된 방법만 배웠다.
처음 본 배포스트립트는 perl로 만들어져 있었다. rsync로 파일을 복사하고 서버를 재시작했다. 그 다음은 webistrano를 사용한 것인데 webistrano는 파일을 tar로 묶어서 전달한다. rails를 이렇게 배포했었는데 이후 서비스에서는 java를 webistrano로 배포하고 있었다.
이제와서 생각하는 거지만 사실 배포라는게 결국 파일을 전달하고 서버가 전달된 파일을 사용하도록 하는거라 얼마나 편하고 빠르고 관리하기가 쉬운가로 방법을 정하면 되는 것 같다. 팀원 중 한분이 fabric를 자주 이야기해서 fabric를 조금 알아보기로 했다.
webistrano
fabric에 대해서 이야기하기 전에 webistrano를 먼저 정리하고 내가 fabric에 대해서 어떤 기대를 했는지 적어보려고 한다.
webistrano는 capistrano의 web버전이다. capistrano는 ruby로 만들어진 것답게 배포관리에 대한 모든 것을 제공하면서도 정해진 틀이 있다. 예를 들어 target path가 /var/www
라면 /var/www/releases/{timestamp}
로 파일을 복사하고 /var/www/webapps/{name}
에 복사된 path로 링크를 건다
배포 과정도 정해져 있고 그 사이사이에 필요한 레시피를 넣어서 필요한 배포방법을 만들게 된다. 레시피는 일종의 ruby 스크립트 모음이다. build 전에 A 레시피를 실행하고 복사 전에 B 레시피를 실행하고 복사는 C 레시피로 대체할 수 있다.
어쨌든 이런 식으로 과정이 정해져있고 그에 따라 사용할 수 있는 환경변수들이 정해져있어서 공부가 필요하다. fabric도 이런 건데 좀 더 세련된 방법을 사용하는 줄 알았다.
fabric
fabric도 결국 capistrano랑 비슷한 것이고 단지 공부가 필요할 거라고 한다면 그닥 사용할 이유가 없다고 생각했다. 그런데 막상 공부해보니 그게 아니었다. fabric은 단지 여러서버에 파일을 복사하고 스크립트를 실행할 수 있는 도구만 제공하고 있다. capistrano처럼 어떤 일을 할지는 아무것도 제공하지 않는다. 그건 사용하는 사람이 알아서 해야한다.
사용법을 가만히 보다보니 여러서버에 스크립트를 날리던 것이 fabric으로 만들면 딱일 것 같아서 만들어봤다.
// fabfile.py
from fabric.api import *
env.roledefs = {
'prod': ['server1', 'server2'],
'test': ['localhost']
}
@task
def cmd(command):
run(command)
이 fabric 스크립트는 아래와 같이 사용하면 된다.
$ fab --roles=prod cmd:"ps -ef | grep httpd"
이렇게 실행하면 fabric은 prod에 포함된 host에 ssh로 접근해서 cmd task를 실행해준다. roles는 지정할 role을 말하고 cmd는 실행할 task, command에는 :
뒤에 적은 것들이 들어간다.
아래는 이후에라도 내가 필요한 것을 해보기 위해서 알아야 할 중요한 것들이다. (지금은 안쓰겠지만 혹시 나중에 쓸 일이 생기면 쓰려고 정리)
- run : host에서 실행
- local : local에서 실행
- execute : 다른 task를 실행한다. 이를 사용해서 localhost에서 빌드를 한 후에 다른 task를 통해서 빌드 결과물을 복사할 수 있다.