Automatically Deploying ClipBucket with Ansible

Michael Lynch

Ansible로 ClipBucket 자동 배포하기

개요

ClipBucket은 YouTube나 Vimeo와 비슷한 기능을 제공하는 오픈 소스 동영상 호스팅 플랫폼입니다. 이 글에서는 구성 관리 도구인 Ansible을 사용해 서버에 ClipBucket을 배포하는 방법을 살펴봅니다.

tl; dr - ClipBucket만 설치하기

Ansible이든, 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 구문 검사와 린트 검사를 수행합니다
  4. Docker 컨테이너에 ClipBucket role을 설치합니다
  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을 사용해 보고, 의견을 남기거나 버그를 제보하거나, 기여하고 싶다면 pull request를 제출해 주세요.

원문은 Michael Lynch님이 에 게재했습니다.

이 글은 gpt-5.6-luna 모델을 사용해 번역했습니다.