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 服务器上完成安装:

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 仍需要用户在网页界面中手动一步步点击,并填写安装相关信息。

ClipBucket 完整安装步骤

对于新用户来说,网页向导或许很友好,但每部署一台新服务器都要重复走一遍,就没人愿意了。

自动化安装

ClipBucket 的主要依赖是 Linux、Apache、MySQL 和 PHP(即“LAMP 技术栈”)。好在 Ansible 有“角色(roles)”这一概念,可以把某个组件的自动化逻辑打包,供他人复用,甚至能将多个角色组合起来创建新的角色。

借助 Ansible Galaxy,我们可以避免重复造轮子,在上面搜索所需软件的现成角色。简单搜索后,找到了以下几个角色:

ClipBucket 还有一些较小的依赖,比如 ImageMagick 和 FFMpeg,在 Ansible playbook 中用一两条命令就能装好(所有安装步骤见此处)。

自动化安装后的配置步骤

如前所述,ClipBucket 需要用户通过网页界面来完成安装。我们想省掉这一步手工操作,但这并不容易。Ansible 擅长自动化命令行任务,却不太适合自动化网页界面中的用户操作。

我在ClipBucket 论坛上询问是否有网页安装之外的替代方案,ClipBucket 的开发者之一 Saqib Razzaq 热心地为我指出了源码中的一些 PHP 和 SQL 脚本,利用它们就可以把安装后的步骤脚本化。

许多 SQL 脚本(奇怪的是)本身就有错误,而 ClipBucket 的 PHP 代码似乎会静默忽略这些错误。我不想就这么忽略这些错误,于是写了一个有点取巧的 Ansible playbook 来修复或删除 ClipBucket SQL 脚本中的错误行。

完成这些之后,我就可以运行 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 角色,让逻辑更清晰、更易复用。很快我就发现,这样很容易不小心把角色改坏(比如误删了一条关键命令)。我当时的测试方法是反复在一台干净的虚拟机上运行角色,再检查安装是否成功,但这个过程非常手工、繁琐。既然整个目标就是自动化,我自然想找到一种自动化验证方式,来确保我的 Ansible 角色依然能创建出可用的 ClipBucket 服务器。

《Ansible for DevOps》一书的作者 Jeff Geerling 写过一篇很有帮助的博文,介绍了如何自动测试 Ansible playbook。参考他的示例,我创建了一个构建脚本,会执行以下步骤:

  1. 创建一个干净的 Ubuntu 14.04 Docker 容器
  2. 将 ClipBucket 角色以 role_under_test 的名称复制到容器中(这样命名是为了便于在其他角色上复用测试脚本)
  3. 对角色进行 Ansible 语法和 lint 检查
  4. 在 Docker 容器中安装 ClipBucket 角色
  5. 再次运行相同的安装脚本,验证角色的幂等性(第二次运行不应改变状态)
  6. 验证容器内的 Web 服务器是否正常提供 ClipBucket 应用的首页,以此确认安装成功。

我正考虑通过编写更复杂的 Web 流程来扩展测试,比如创建新账号或上传视频。对于这类复杂场景,仅靠简单的 shell 命令就不够了,需要使用像 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 服务器,并使用用户名 admin 和你在 clipbucket_admin_password 中设置的密码登录。

欢迎试用该角色,如有反馈、发现问题或想贡献代码,请提交 issue 或 pull request。

本文章由 muse-spark-1.2-contributor 进行翻译

评论