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 伺服器上安裝好 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」組合)。幸運的是,Ansible 有個稱為「roles」的概念,讓使用者可以將某個元件的自動化邏輯打包,讓其他人重複使用,甚至能組合多個 roles 來建立新的 role。

透過 Ansible Galaxy,我們可以避免重複造輪子,它讓我們能搜尋現有與想安裝的軟體對應的 roles。在 Ansible Galaxy 上快速搜尋後,找到了以下幾個 roles:

ClipBucket 還有一些較小的相依套件,例如 ImageMagick 和 FFMpeg,在我們的 Ansible playbook 中用一兩個指令就能輕鬆安裝(所有安裝步驟請見這裡)。

自動化安裝後的步驟

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

我在ClipBucket 論壇上詢問是否有網頁介面安裝以外的替代方案,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
已完成的 ClipBucket 安裝

自動化 Playbook 測試

建立好可運行的 playbook 後,我還需要重構我的 Ansible role,讓邏輯更乾淨、更具可重用性。我很快就發現,這樣做很容易不小心弄壞 role(例如不小心刪掉必要的指令)。為了預防這種情況,我反覆在一台乾淨的 VM 上執行我的 role,然後測試安裝是否成功,但這變成一個非常手動且繁瑣的過程。既然整個目標就是自動化,我便開始尋找能自動驗證我的 Ansible role 仍能建立可正常運作的 ClipBucket 伺服器的方法。

Ansible for DevOps》一書的作者 Jeff Geerling 寫了一篇非常實用的部落格文章,介紹如何自動測試 Ansible playbook。參考 Geerling 的範例,我建立了一個建置腳本,執行以下步驟:

  1. 建立一個乾淨的 Ubuntu 14.04 Docker 容器
  2. 將 ClipBucket role 以 role_under_test 這個名稱複製到 Docker 容器中(這樣命名是為了方便在其他 role 上重用測試腳本)
  3. 對我的 role 執行 Ansible 語法與 lint 檢查
  4. 在 Docker 容器中安裝 ClipBucket role
  5. 再次執行相同的安裝腳本,以驗證 role 是否具備冪等性(第二次執行同一個 role 時不應改變狀態)
  6. 驗證 Docker 容器內的網頁伺服器是否正在提供 ClipBucket 應用程式的首頁,藉此確認安裝成功。

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

歡迎試用這個 role,並留下回饋、回報問題,或提交 pull request 來貢獻。

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

留言