Automatically Deploying ClipBucket with Ansible

Michael Lynch

使用 Ansible 自動部署 ClipBucket

概述

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"

執行完上述指令後,你會發現 ClipBucket 已經在你的伺服器上運行,網址為 http://localhost/。你可以使用以下管理員帳號密碼登入:

  • 使用者名稱admin
  • 密碼admin登入後請變更此密碼

為何要自動化 ClipBucket 的部署?

ClipBucket 並未提供太多關於部署的說明文件。就官方文件而言,我能找到的只有這份指南,但它假設使用者已經安裝好了 ClipBucket 的許多相依套件。

我找到了這份非常出色且詳盡的指南,但它仍然是一個非常手動的流程。使用者必須複製、貼上許多不同的指令,而且很難針對自己的系統進行客製化。

即使安裝好了 ClipBucket 及其所有相依套件,全新的 ClipBucket 部署仍需要使用者手動透過網頁介面點擊並輸入安裝相關資訊。

完整的 ClipBucket 安裝步驟

網頁介面對新使用者來說或許很方便,但如果你每次部署新伺服器都得重複操作一次,就不是理想的做法了。

自動化安裝

ClipBucket 的主要相依套件是 Linux、Apache、MySQL 和 PHP(即所謂的「LAMP stack」)。幸好,Ansible 有一個稱為「roles」的概念,讓使用者可以將某個元件的自動化邏輯打包,並讓其他人重複使用,甚至可以將多個角色組合在一起,建立新的角色。

我們可以透過 Ansible Galaxy 來避免重複造輪子,它讓我們可以搜尋所需軟體的現有角色。快速搜尋 Ansible Galaxy 後,找到了以下角色:

ClipBucket 還有一些較小的相依套件,例如 ImageMagick 和 FFMpeg,這些都可以透過 Ansible playbook 中的一、兩個指令輕鬆安裝(所有安裝步驟請參閱此處)。

自動化安裝後步驟

如前所述,ClipBucket 會要求使用者透過網頁介面逐步完成安裝。我們希望省去這個手動步驟,但這是一項挑戰。Ansible 的設計目的是自動化命令列任務,並不適合用來自動化網頁介面中的使用者操作。

我曾在ClipBucket 論壇上詢問是否有網頁介面安裝以外的替代方案,而 ClipBucket 的開發者之一 Saqib Razzaq(薩齊布·拉札克)熱心地指引我找到了 ClipBucket 原始碼中的一些 PHP 和 SQL 腳本,讓我得以將安裝後步驟寫成腳本自動執行。

許多 SQL 腳本(奇怪的是)根本就是壞的,而 ClipBucket 的 PHP 程式碼似乎會默默忽略這些錯誤。我不想默默忽略這些 SQL 錯誤,因此撰寫了一個拼湊性質的 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(《Ansible 開發維運》)一書的作者 Jeff Geerling(傑夫·吉爾林)有一篇非常有用的部落格文章,介紹了如何自動測試 Ansible playbook。參考吉爾林的範例,我建立了一個建置腳本,其流程如下:

  1. 建立一個全新的 Ubuntu 14.04 Docker 容器
  2. 將 ClipBucket 角色複製到 Docker 容器中,並命名為 role_under_test(此命名是為了方便在其他角色上重複使用測試腳本)
  3. 對我的角色執行 Ansible 語法與 lint 檢查
  4. 將 ClipBucket 角色安裝到 Docker 容器中
  5. 再次執行相同的安裝指令碼,以驗證角色的冪等性(重複執行同一個角色不應改變狀態)
  6. 驗證 Docker 容器內的網頁伺服器是否正在提供 ClipBucket 應用程式的首頁,藉此判斷安裝是否成功。

我正在考慮透過撰寫更複雜的網頁流程來擴充測試,例如建立新帳號或上傳新影片。對於這類較複雜的情境,我們會需要超越單純的 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 中指定的密碼登入。

試試這個角色,若有任何回饋、想回報錯誤或提交 pull request 想要貢獻,都歡迎提出。

原文由 Michael Lynch 發布

本文章由 muse-spark-1.2-contributor 進行翻譯