Automatically Deploying ClipBucket with Ansible

Michael Lynch

Ansible로 ClipBucket 자동 배포하기

원문은 Michael Lynch님이 에 게재했습니다. 이 블로그 구독하기

개요

ClipBucket은 YouTube나 Vimeo와 기능이 유사한 오픈소스 비디오 호스팅 플랫폼이다. 이 가이드에서는 구성 관리 도구인 Ansible을 이용해 ClipBucket을 서버에 배포하는 방법을 단계별로 살펴본다.

요약 - ClipBucket 바로 설치하기

Ansible이니 뭐니 하는 것에는 관심 없고, ClipBucket 설치에 그걸 쓰겠다는 당신의 생각이나 감정 따위도 궁금하지 않다. 그냥 ClipBucket 설치 방법만 알려 달라!

ClipBucket을 서버에 쉽게 배포하는 방법만 찾고 있다면, 아래 명령어들을 실행하면 아무것도 설치되지 않은 Ubuntu 14.04 서버에 단 몇 개의 명령어로 ClipBucket을 설치할 수 있다:

sudo apt-get update

# Install Ansible and dependencies
sudo apt-get install -y \
  libffi-dev \
  libyaml-dev \
  libpython2.7-dev \
  libssl-dev \
  python-pip \
  python2.7-dev
sudo pip install ansible paramiko PyYAML Jinja2 httplib2 six

# Install the Ansible ClipBucket role
sudo ansible-galaxy install mtlynch.clipbucket

# Create a minimal Ansible playbook to install ClipBucket
echo "- hosts: localhost
  roles:
    - { role: mtlynch.clipbucket }" > install.yml

# Run the ClipBucket playbook locally
sudo ansible-playbook install.yml \
  --extra-vars "mysql_root_password=root" \
  --extra-vars "clipbucket_mysql_password=clipbucketpw" \
  --extra-vars "clipbucket_admin_password=admin"

위 명령어를 모두 실행하고 나면 http://localhost/에서 실행 중인 ClipBucket을 확인할 수 있다. 다음 관리자 계정으로 로그인할 수 있다:

  • 사용자 이름: admin
  • 비밀번호: admin (로그인 후 이 비밀번호를 변경하세요)

왜 ClipBucket 배포를 자동화해야 할까?

ClipBucket은 배포에 대한 문서를 많이 제공하지 않는다. 공식 문서라고 할 수 있는 것으로 찾을 수 있었던 것은 이 가이드뿐이었는데, 이 가이드조차 사용자가 이미 ClipBucket의 의존성 대부분을 설치했다고 가정한다.

매우 훌륭하고 철저한 이 가이드도 찾았지만, 여전히 매우 수동적인 과정이다. 사용자는 수많은 서로 다른 명령어를 복사해 붙여 넣어야 하고, 자신의 시스템에 맞게 커스터마이즈하기도 어렵다.

ClipBucket과 모든 의존성을 설치한 뒤에도, ClipBucket을 새로 배포할 때마다 사용자는 웹 UI에서 직접 클릭해 나가며 설치 정보를 입력해야 한다.

ClipBucket 설치 단계 전체

웹 UI는 신규 사용자에게는 편리할 수 있지만, 새 서버를 배포할 때마다 매번 반복하고 싶은 방식은 아니다.

설치 자동화

ClipBucket의 주요 의존성은 Linux, Apache, MySQL, PHP(소위 “LAMP 스택”)이다. 다행히 Ansible에는 “role”이라는 개념이 있어, 사용자가 컴포넌트별 자동화 로직을 패키징하고 다른 사람들이 그 로직을 재사용하거나 여러 role을 조합해 새로운 role을 만들 수 있다.

Ansible Galaxy를 이용하면 원하는 소프트웨어에 대한 기존 role을 검색할 수 있어 중복 작업을 피할 수 있다. Ansible Galaxy에서 간단히 검색한 결과 다음과 같은 role을 찾을 수 있었다:

ClipBucket에는 ImageMagick이나 FFMpeg 같은 더 작은 의존성도 있는데, Ansible playbook 내에서 명령어 한두 개로 간단히 설치할 수 있다(전체 설치 단계는 여기에서 확인할 수 있다).

설치 후 단계 자동화

앞서 언급했듯이 ClipBucket은 설치를 완료하기 위해 사용자가 웹 UI를 단계별로 진행해야 한다고 가정한다. 이 수동 단계를 없애고 싶지만, 이는 쉽지 않은 도전이다. Ansible은 커맨드라인 작업을 자동화하도록 설계되었지만 웹 UI에서의 사용자 동작을 자동화하는 데는 적합하지 않다.

ClipBucket 포럼에 웹 UI 설치를 대체할 방법이 있는지 물었더니, ClipBucket 개발자 중 한 명인 Saqib Razzaq이 친절하게 ClipBucket 소스에 있는 PHP 및 SQL 스크립트를 알려줘 설치 후 단계를 스크립트로 처리할 수 있게 해 주었다.

SQL 스크립트 중 상당수는 (이상하게도) 그냥 깨져 있었고 ClipBucket의 PHP 코드는 오류를 조용히 무시하는 듯했다. 나는 SQL 오류를 조용히 무시하고 싶지 않아, ClipBucket SQL 스크립트에서 잘못된 라인을 수정하거나 삭제하는 다소 임시방편의 Ansible playbook을 작성했다.

이 작업이 끝나자 ClipBucket role을 실행해 설치 과정 전체를 완전히 자동화할 수 있었다. 단일 명령어 하나만 실행하고 Ansible이 설치 과정을 진행할 때까지 기다리면, 완료 시점에 완전히 구동되는 ClipBucket 서버를 얻을 수 있었다.

$ ansible-playbook install.yml

PLAY [clipbucket] *************************************************************

TASK [setup] *******************************************************************
ok: [clipbucket]

...many commands elided...

PLAY RECAP *********************************************************************
clipbucket                : ok=77   changed=48   unreachable=0    failed=0
ClipBucket 설치 완료

Playbook 테스트 자동화

동작하는 playbook을 만든 뒤에도, 로직을 더 깔끔하고 재사용 가능하게 만들기 위해 Ansible role을 리팩터링해야 할 작업이 남아 있었다. 그렇게 하다 보면 실수로 role을 망가뜨리기 쉽다는 것을 금방 깨달았다(예컨대 필요한 명령어를 실수로 삭제하는 식으로). 이를 테스트하기 위해 빈 VM에 내 role을 반복적으로 실행한 뒤 설치가 성공했는지 확인했지만, 이는 매우 수동적이고 지루한 과정이 되었다. 이 작업 전체의 목표 자체가 자동화인 만큼, 내 Ansible role이 여전히 정상 동작하는 ClipBucket 서버를 생성하는지 검증하는 과정을 자동화할 방법을 찾게 되었다.

Ansible for DevOps의 저자인 Jeff Geerling이 Ansible playbook을 자동으로 테스트하는 방법을 설명하는 매우 유용한 블로그 글을 작성해 두었다. Geerling의 예제를 활용해 다음과 같은 작업을 수행하는 빌드 스크립트를 만들었다:

  1. 빈 Ubuntu 14.04 Docker 컨테이너를 생성한다
  2. ClipBucket role을 role_under_test라는 role 이름으로 Docker 컨테이너에 복사한다(다른 role에서도 테스트 스크립트를 재사용하기 쉽도록 하기 위한 네이밍이다)
  3. 내 role에 대해 Ansible 문법 및 lint 검사를 수행한다
  4. ClipBucket role을 Docker 컨테이너에 설치한다
  5. 동일한 설치 스크립트를 다시 실행해 role이 멱등성을 가지는지 검증한다(동일한 role을 두 번째로 실행해도 상태가 변경되지 않아야 한다)
  6. Docker 컨테이너 안의 웹 서버가 ClipBucket 애플리케이션의 랜딩 페이지를 정상적으로 서빙하고 있는지 검증하여 설치가 성공했음을 확인한다.

새 계정을 만들거나 새 동영상을 업로드하는 등 더 정교한 웹 플로우를 작성해 테스트를 확장하는 것도 고려 중이다. 그 정도 복잡도라면 단순한 셸 명령어를 넘어 Selenium 같은 브라우저 자동화 도구를 사용해야 할 것이다. 어쩌면 이는 다음 블로그 글의 주제가 될지도 모른다.

업데이트 (2016-09-25): Selenium 통합에 대한 새 글은 여기에 올라와 있다.

최종 결과물

내 ClipBucket Ansible Role은 다음에서 이용할 수 있다:

ClipBucket Ansible Role 사용하기

참고: Ansible에 익숙하지 않고 배울 생각도 없다면, 이 글 맨 위에 있는 “ClipBucket 바로 설치하기” 섹션을 참고하세요.

ClipBucket Ansible role을 사용하는 것은 쉽다. 시작하려면 먼저 Ansible을 설치해야 한다. 그런 다음 다음 파일들을 생성한다:

install.yml

---
- hosts: clipbucket
  become_user: root
  become_method: sudo
  become: True
  vars_files:
    - secrets.yml
  roles:
    - { role: mtlynch.clipbucket }

secrets.yml

---
# Change these passwords to secure, strong passphrases of your choosing.
mysql_root_password: rootpw321
clipbucket_mysql_password: dbpw123
clipbucket_admin_password: password123

hosts

clipbucket     ansible_host=1.2.3.4 # change to your server's IP or hostname

그런 다음 다음 명령어를 실행한다:

ansible-galaxy install mtlynch.clipbucket
ansible-playbook install.yml

ansible-playbook 명령어가 완료되면 ClipBucket 서버로 이동해 사용자 이름 adminclipbucket_admin_password에 지정한 비밀번호로 로그인할 수 있다.

이 role을 직접 사용해 보고, 피드백을 남기거나 버그를 제보하거나 기여하고 싶다면 풀 리퀘스트를 보내 달라.

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.

댓글