使用 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 的主要依赖是 Linux、Apache、MySQL 和 PHP(即“LAMP 技术栈”)。好在 Ansible 有“角色(roles)”这一概念,可以把某个组件的自动化逻辑打包,供他人复用,甚至能将多个角色组合起来创建新的角色。
借助 Ansible Galaxy,我们可以避免重复造轮子,在上面搜索所需软件的现成角色。简单搜索后,找到了以下几个角色:
- Apache - geerlingguy.apache
- MySQL - pcextreme.mariadb(实际安装的是 MariaDB,一个由社区维护、可直接替代 MySQL 的分支)
- PHP - geerlingguy.php
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
自动化测试 Playbook
做出可用的 playbook 后,我还需要重构 Ansible 角色,让逻辑更清晰、更易复用。很快我就发现,这样很容易不小心把角色改坏(比如误删了一条关键命令)。我当时的测试方法是反复在一台干净的虚拟机上运行角色,再检查安装是否成功,但这个过程非常手工、繁琐。既然整个目标就是自动化,我自然想找到一种自动化验证方式,来确保我的 Ansible 角色依然能创建出可用的 ClipBucket 服务器。
《Ansible for DevOps》一书的作者 Jeff Geerling 写过一篇很有帮助的博文,介绍了如何自动测试 Ansible playbook。参考他的示例,我创建了一个构建脚本,会执行以下步骤:
- 创建一个干净的 Ubuntu 14.04 Docker 容器
- 将 ClipBucket 角色以
role_under_test的名称复制到容器中(这样命名是为了便于在其他角色上复用测试脚本) - 对角色进行 Ansible 语法和 lint 检查
- 在 Docker 容器中安装 ClipBucket 角色
- 再次运行相同的安装脚本,验证角色的幂等性(第二次运行不应改变状态)
- 验证容器内的 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: password123hosts
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。
随机一篇博客
评论
登录后参与讨论