Automatically Deploying ClipBucket with Ansible

Michael Lynch

AnsibleでClipBucketを自動デプロイする

原文は Michael Lynch により に公開されました。 このブログを購読する

概要

ClipBucketは、YouTubeやVimeoと同様の機能を持つオープンソースの動画ホスティングプラットフォームです。このガイドでは、構成管理ツールのAnsibleを使ってClipBucketをサーバーにデプロイする方法を解説します。

tl;dr - とにかく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をデプロイする際には、ユーザーが手動でWeb UIをクリックして進めながら、インストールに関する情報を入力する必要があります。

ClipBucketのインストール手順

Web UIは初心者にとっては便利かもしれませんが、新しいサーバーをデプロイするたびに何度も繰り返したいようなものではありません。

インストールの自動化

ClipBucketの主要な依存関係はLinux、Apache、MySQL、PHP(いわゆる「LAMPスタック」)です。幸い、Ansibleには「ロール」という概念があり、コンポーネントごとの自動化ロジックをパッケージ化して他者が再利用したり、複数のロールを組み合わせて新しいロールを作成したりできます。

Ansible Galaxyを使えば、使いたいソフトウェアの既存ロールを検索でき、作業の重複を避けることができます。Ansible Galaxyで簡単に検索したところ、次のようなロールが見つかりました:

ClipBucketにはImageMagickやFFMpegといった小さな依存関係もありますが、これらはAnsible Playbook内で1、2回コマンドを実行するだけで簡単にインストールできます(すべてのインストール手順はこちらをご覧ください)。

インストール後の手順の自動化

前述のとおり、ClipBucketではインストールを完了するためにユーザーがWeb UIを順に操作することを想定しています。この手動ステップをなくしたいところですが、これは一筋縄ではいきません。Ansibleはコマンドラインタスクの自動化を目的として設計されており、Web UIでのユーザー操作の自動化にはあまり適していないからです。

ClipBucketフォーラムでWeb UIによるインストールの代替手段はないか尋ねたところ、ClipBucketの開発者の一人であるSaqib Razzaq氏が親切にも、インストール後の手順をスクリプト化できるClipBucketソース内のPHPおよびSQLスクリプトを教えてくれました。

多くのSQLスクリプトが(奇妙なことに)壊れており、ClipBucketのPHPコードはエラーを黙って無視するようです。私はSQLエラーを黙って見過ごしたくなかったので、ClipBucketのSQLスクリプト内の誤った行を修正または削除するための間に合わせのAnsible Playbookを書きました。

これが完了すれば、ClipBucketロールを実行してインストールプロセス全体を完全に自動化できるようになりました。単一のコマンドを実行し、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ロールをリファクタリングする作業が残っていました。すぐに気づいたのですが、この過程でうっかりロールを壊してしまうことは簡単に起こります(例えば、必要なコマンドを誤って削除してしまうなど)。私はベアなVMに対してロールを繰り返し実行し、インストールが成功したかをテストすることで確認していましたが、これは非常に手作業で面倒なプロセスでした。この取り組み全体の目的が自動化であることを考えれば、Ansibleロールが依然として正常に動作するClipBucketサーバーを作成できているかを検証するプロセス自体を自動化する方法を探すべきでした。

Ansible for DevOpsの著者であるJeff Geerling氏は、Ansible Playbookを自動的にテストする方法を解説した非常に役立つブログ記事を公開しています。Geerling氏の例を参考に、私は以下のことを行うビルドスクリプトを作成しました:

  1. まっさらなUbuntu 14.04のDockerコンテナを作成する
  2. ClipBucketロールをrole_under_testというロール名でDockerコンテナにコピーする(この命名は他のロールでテストスクリプトを再利用しやすくするためです)
  3. 自分のロールに対してAnsibleの構文チェックとlintチェックを実行する
  4. Dockerコンテナ内にClipBucketロールをインストールする
  5. 同じインストールスクリプトを再実行して、ロールが冪等であることを検証する(同じロールを2回実行しても状態が変わらないこと)
  6. Dockerコンテナ内のWebサーバーがClipBucketアプリケーションのランディングページを配信していることを検証し、インストールが成功したことを確認する

新しいアカウントの作成や動画のアップロードといった、より高度なWebフローを記述してテストを拡充することも検討しています。そのくらい複雑なことを行うには、単純なシェルコマンドを超えて、Seleniumのようなブラウザ自動化ツールを使う必要があります。このテーマについては、また別のブログ記事で取り上げるかもしれません。

追記(2016-09-25): Selenium連携に関する新しい記事をこちらに公開しました。

最終成果物

私のClipBucket用Ansibleロールは以下で公開しています:

ClipBucket Ansibleロールの使い方

注:Ansibleに馴染みがなく、学ぶつもりもない方は、本記事の冒頭にある「とにかくClipBucketをインストールしたい方へ」セクションをご覧ください。

ClipBucket Ansibleロールの使い方は簡単です。まず、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で指定したパスワードでログインできます。

ぜひロールを試してみて、フィードバックやバグ報告、コントリビュートしたい場合のプルリクエストをお寄せください。

この記事は「muse-spark-1.2-contributor」を使用して翻訳されました。

コメント