AnsibleでClipBucketを自動デプロイする
概要
ClipBucketは、YouTubeやVimeoと同様の機能を持つオープンソースの動画ホスティングプラットフォームです。このガイドでは、構成管理ツールのAnsibleを使って、サーバーにClipBucketをデプロイする方法を説明します。
tl; dr - とにかくClipBucketをインストールする
Ansibleのことも、ClipBucketのインストールにAnsibleを使うことについての意見や感想もどうでもいい。とにかく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"上記のコマンドが完了すると、サーバー上でClipBucketがhttp://localhost/で起動しています。以下の管理者アカウントでログインできます。
- ユーザー名:
admin - パスワード:
admin(ログイン後にこのパスワードを変更してください)
ClipBucketのデプロイを自動化する理由
ClipBucketには、デプロイに関するドキュメントがあまりありません。公式ドキュメントとして見つけられたのはこのガイドだけでしたが、そこではClipBucketの依存関係の多くがすでにインストールされていることを前提にしています。
こちらの優れた、とても詳しいガイドも見つけました。しかし、それでも作業の大部分は手動です。ユーザーはさまざまなコマンドを何度もコピー&ペーストしなければならず、個々のシステムに合わせてカスタマイズするのも困難です。
ClipBucketとその依存関係をすべてインストールした後でも、新しいClipBucketのデプロイでは、Web UIを手動で操作し、インストールに関する情報を入力する必要があります。

Web UIは初めて使うユーザーにとっては便利でしょう。しかし、新しいサーバーをデプロイするたびに、何度も同じ操作を繰り返したいとは思わないはずです。
インストールの自動化
ClipBucketの主な依存関係は、Linux、Apache、MySQL、PHPです(いわゆる「LAMPスタック」)。幸い、Ansibleには「ロール」という仕組みがあります。これを使うと、あるコンポーネントの自動化ロジックをパッケージ化して、他のユーザーが再利用できるようにできます。複数のロールを組み合わせて、新しいロールを作ることも可能です。
Ansible Galaxyを使えば、作業の重複を避けられます。必要なソフトウェア用に既存のロールを検索できるためです。Ansible Galaxyを簡単に検索したところ、次のロールが見つかりました。
- Apache - geerlingguy.apache
- MySQL - pcextreme.mariadb(実際には、MySQLのドロップイン置換としてコミュニティーによって保守されているMariaDBをインストールします)
- PHP - geerlingguy.php
ClipBucketには、ImageMagickやFFMpegなどの小規模な依存関係もあります。これらは、Ansibleのプレイブック内で1つか2つのコマンドを実行するだけで簡単にインストールできます(インストール手順の全体はこちらを参照してください)。
インストール後の手順を自動化する
先ほど説明したように、ClipBucketではインストールを完了するために、ユーザーがWeb UIを順番に操作する必要があります。この手動作業をなくしたいところですが、これは簡単ではありません。Ansibleはコマンドラインのタスクを自動化するために設計されており、Web UI上でのユーザー操作の自動化にはあまり向いていないからです。
ClipBucketのフォーラムで、Web UIを使わずにインストールする方法がないか質問したところ、ClipBucketの開発者の一人であるSaqib Razzaqが、インストール後の手順をスクリプト化できるPHPおよびSQLスクリプトがClipBucketのソースに含まれていると親切に教えてくれました。
SQLスクリプトの多くは(奇妙なことに)単に壊れており、ClipBucketのPHPコードはそのエラーを黙って無視しているようでした。SQLのエラーを黙って無視したくはなかったので、ClipBucketのSQLスクリプト内にある誤った行を修正または削除するその場しのぎのAnsibleプレイブックを書きました。
これが完了すると、ClipBucketのロールを実行して、インストールプロセスを完全に自動化できました。1つのコマンドを実行し、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
プレイブックのテストを自動化する
動作するプレイブックを作成した後も、ロジックをより整理し、再利用しやすくするために、Ansibleロールをリファクタリングする作業が残っていました。しかし、そうやってロールを変更すると、必要なコマンドをうっかり削除するなどして、簡単に壊してしまうことにすぐ気付きました。そこで、まっさらなVMにロールを繰り返し適用し、インストールが成功することを確認していましたが、これは非常に手作業が多く、退屈なプロセスでした。この取り組み全体の目的は自動化です。そこで、Ansibleロールによって動作するClipBucketサーバーが引き続き作成されることを検証するプロセス自体も、自動化する方法を探すことにしました。
Ansible for DevOpsの著者であるJeff Geerlingは、Ansibleのプレイブックを自動的にテストする方法を説明した、とても役に立つブログ記事を書いています。Geerlingの例を参考に、次の処理を行うビルドスクリプトを作成しました。
- まっさらなUbuntu 14.04のDockerコンテナを作成する
- ClipBucketロールを、
role_under_testというロール名でDockerコンテナ内にコピーする(この命名は、他のロールでもテストスクリプトを再利用しやすくするためのものです) - ロールに対してAnsibleの構文チェックとlintチェックを実行する
- ClipBucketロールをDockerコンテナにインストールする
- 同じインストールスクリプトを実行して、ロールが冪等であることを確認する(同じロールを2回目に実行しても、状態が変わらないはずです)
- 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: password123hosts
clipbucket ansible_host=1.2.3.4 # change to your server's IP or hostname続いて、次のコマンドを実行します。
ansible-galaxy install mtlynch.clipbucket
ansible-playbook install.ymlansible-playbookコマンドが完了したら、ClipBucketサーバーにアクセスし、ユーザー名adminと、clipbucket_admin_passwordに指定したパスワードでログインできます。
このロールを試して、フィードバックをお寄せください。貢献したい場合は、バグを報告したり、プルリクエストを送ったりしてください。
記事をランダムに読む