使用 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 的主要相依套件是 Linux、Apache、MySQL 和 PHP(也就是所謂的「LAMP」組合)。幸運的是,Ansible 有個稱為「roles」的概念,讓使用者可以將某個元件的自動化邏輯打包,讓其他人重複使用,甚至能組合多個 roles 來建立新的 role。
透過 Ansible Galaxy,我們可以避免重複造輪子,它讓我們能搜尋現有與想安裝的軟體對應的 roles。在 Ansible Galaxy 上快速搜尋後,找到了以下幾個 roles:
- Apache - geerlingguy.apache
- MySQL - pcextreme.mariadb(實際上安裝的是 MariaDB,一個由社群維護、可直接取代 MySQL 的替代方案)
- PHP - geerlingguy.php
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
自動化 Playbook 測試
建立好可運行的 playbook 後,我還需要重構我的 Ansible role,讓邏輯更乾淨、更具可重用性。我很快就發現,這樣做很容易不小心弄壞 role(例如不小心刪掉必要的指令)。為了預防這種情況,我反覆在一台乾淨的 VM 上執行我的 role,然後測試安裝是否成功,但這變成一個非常手動且繁瑣的過程。既然整個目標就是自動化,我便開始尋找能自動驗證我的 Ansible role 仍能建立可正常運作的 ClipBucket 伺服器的方法。
《Ansible for DevOps》一書的作者 Jeff Geerling 寫了一篇非常實用的部落格文章,介紹如何自動測試 Ansible playbook。參考 Geerling 的範例,我建立了一個建置腳本,執行以下步驟:
- 建立一個乾淨的 Ubuntu 14.04 Docker 容器
- 將 ClipBucket role 以
role_under_test這個名稱複製到 Docker 容器中(這樣命名是為了方便在其他 role 上重用測試腳本) - 對我的 role 執行 Ansible 語法與 lint 檢查
- 在 Docker 容器中安裝 ClipBucket role
- 再次執行相同的安裝腳本,以驗證 role 是否具備冪等性(第二次執行同一個 role 時不應改變狀態)
- 驗證 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: 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 中設定的密碼登入。
歡迎試用這個 role,並留下回饋、回報問題,或提交 pull request 來貢獻。
隨機一篇部落格
留言
登入後參與討論