使用 Ansible 自动部署 ClipBucket
概述
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 时,用户仍然需要手动浏览 Web UI,并输入有关安装的信息。

对于新用户来说,Web UI 可能很友好,但每次部署新服务器时,你大概不会想一遍又一遍地重复这个过程。
自动化安装
ClipBucket 的主要依赖项包括 Linux、Apache、MySQL 和 PHP(“LAMP 栈”)。幸运的是,Ansible 有一个称为 roles(角色) 的概念,允许用户为某个组件打包自动化逻辑,也允许其他人复用这些逻辑,甚至可以将多个 role 组合起来创建新的 role。
借助 Ansible Galaxy,我们可以避免重复劳动。它允许我们搜索所需软件的现有 role。快速搜索 Ansible Galaxy 后,我找到了以下 role:
- Apache - geerlingguy.apache
- MySQL - pcextreme.mariadb(实际上安装的是 MariaDB——由社区维护、可直接替代 MySQL 的版本)
- PHP - geerlingguy.php
ClipBucket 还有一些较小的依赖项,例如 ImageMagick 和 FFMpeg。在我们的 Ansible playbook 中,用一两条命令就可以轻松安装它们(所有安装步骤请参见这里)。
自动化安装后的步骤
如前所述,ClipBucket 要求用户浏览 Web UI 来完成安装。我们希望消除这一手动步骤,但这颇具挑战性。Ansible 的设计目标是自动化命令行任务,并不适合自动化 Web UI 中的用户操作。
我在 ClipBucket 论坛中询问是否有 Web UI 安装之外的替代方案。ClipBucket 开发者之一 Saqib Razzaq(萨奇布·拉扎克)非常热心地向我指出了 ClipBucket 源代码中的一些 PHP 和 SQL 脚本,利用它们可以编写安装后步骤的脚本。
其中许多 SQL 脚本(奇怪的是)本身就有问题,而 ClipBucket 的 PHP 代码似乎会静默忽略这些错误。我不希望静默忽略 SQL 错误,因此编写了一个比较粗糙的 Ansible playbook,用于修复或删除 ClipBucket SQL 脚本中的错误行。
完成这些工作后,我就可以运行 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
自动化测试 Playbook
创建出可正常工作的 playbook 后,我仍然需要重构 Ansible role,让逻辑更清晰、更易复用。我很快意识到,这样做很容易意外破坏 role(例如误删某条必要命令)。我通过反复在一台全新的虚拟机上运行 role,然后测试安装是否成功来进行验证,但这很快变成了一个非常手动且枯燥的过程。既然整个工作的目标就是自动化,我便开始寻找一种自动验证 Ansible role 是否仍能创建可正常工作的 ClipBucket 服务器的方法。
《Ansible for DevOps》的作者 Jeff Geerling(杰夫·吉尔林)有一篇非常有帮助的博文,介绍了如何自动测试 Ansible playbook。参考 Geerling 的示例,我创建了一个构建脚本,它会执行以下操作:
- 创建一个全新的 Ubuntu 14.04 Docker 容器
- 将 ClipBucket role 复制到 Docker 容器中,并使用 role 名称
role_under_test(这样命名是为了便于在其他 role 上复用测试脚本) - 对我的 role 执行 Ansible 语法检查和 lint 检查
- 将 ClipBucket role 安装到 Docker 容器中
- 运行相同的安装脚本,以验证 role 是否具有幂等性(第二次运行相同的 role 不应改变状态)
- 验证 Docker 容器中的 Web 服务器是否正在提供 ClipBucket 应用的落地页,这表明安装成功。
我正在考虑通过编写更复杂的 Web 流程来扩展测试,例如创建新账户或上传新视频。对于这种复杂程度的测试,我们需要超越简单的 shell 命令,使用像 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: 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 中指定的密码登录。
试用一下这个 role;如果你想参与贡献,欢迎留下反馈、提交 bug 或发起 pull request。
随机一篇博客