如何快速的佈署開發環境 — Vagrant + Puppet/Chef
這篇文章主要說明雲端開發環境佈署所面臨的問題與挑戰,
針對這些問題與挑戰,說明幾個業界比較普遍使用的工具
虛擬環境佈署與設定Vagrant,
環境設定的 configuration Management (Puppet or Chef)
問題與挑戰
想想下列幾個情境,想想目前是如何處理?
“回報的問題在我的機器並沒有發生”
“新人報到,新機器需要許多開發環境設定與工具”
最簡單的方法,我們可能會用 Virtual Machine
直接將整個 Virtual Machine Image 拷貝就解決! 沒錯,這是一個方式。
問題是如果開發過程中有許多設定值的修改,或是額外的套件安裝,
那麼是不是就要定期的拷貝並且分享這個 Virtual Machine Image ,
通常來說這樣的VM Image 檔案動輒好幾 G,
而且,每次的 Image 變動,除非有另外的文件說明,
不然很難知道這些 Image 設定的差異到底是什麼.
所以, vagrant , puppet, chef 的誕生就是希望解決這些問題
Vagrant
首先先介紹 Vagrant。這是什麼呢?
簡單來說可以把這個工具想成是 VirtualBox 的 command line 模式。
例如,當我們需要一個虛擬機器的時候,比較 VirtualBox 與使用 Vagrant 的做法差異
VirtualBox | Vagrant | |
OS Image | 使用瀏覽器至特定網站,或是自行下載相關的 OS Image | 執行 Vagrant 給予 OS Image BOX 網址參數,自動下載 |
匯入VirtualBox | 接著用 VirtualBox 匯入該 OS Image (ova or .ios )等方式。 | 無須其他動作
上述步驟執行完之後,vagrant 自動會將該 OS image 匯入 VirtualBox 中。 |
開機 | 使用 VirtualBox的管理介面啟動 | 下指令完成開機
vagrant up |
開機完成後操作 | 直接在 VirtualBox 視窗 | 透過 SSH |
開機後需要執行的 script | 另外,自行設定撰寫 | 可利用 puppet or chef 在vagrant up開機時指定。 |
開機後..
當然,除了Vagrant 把 VirtualBox 的操作 command line 化之外,
也可以讓虛擬機器在啟動的時候,寫入需要的設定檔與安裝動作。
Puppet 與 Chef 就好比是Windows中的 Autoexec.bat。
可以在利用 vagrant 開機虛擬機器的時候設定與安裝許多所需要的環境。例如:
- 新增使用者
- 設定 ip address
- 安裝 MySQL
- 設定 mySQL.ini
- 安裝 apache 並且設定 Apache configuration
開機後要完成的這些動作,專有名詞就稱為 “Provision”
目前提供這樣 provision 的工具比較普遍的就是 puppet 或是 chef
而透過 puppet 完成的 scripts 又稱為 “manifests”
如此一來,利用 Vagrant + puppet/Chef 之後,
未來要佈署環境,就可以自動的透過一些簡單的指令完成。
FAQ
Shell Script 差異處?
那使用 puppet or Chef 與 Linux Shell Script 有什麼不同? Shell script 一樣可以在開機後完成一些設定與應用程式的安裝。
- puppet or chef 跨平台。CentOS 與 Ubuntu 都可以處理。舉個簡單例子,要啟動 apache service時,會因為 Linux 版本有所差異。”httpd” or “apache”。使用 puppet or chef 就無需理會這樣的差異。讓 puppet or chef 的 scripts 更容易被使用。
- puppet 為更高階描述性的語言。僅描述所需要的環境與設定。例如: “確認 apache 已安裝”。相反的,Linux shell script 是程式語言,維護工作也會比較大。
如果我不需要佈署300台機器,使用 puppet 好處在哪?
如果我只有 3 台伺服器的設定,那麼使用 puppet 有什麼好處嗎?
因為 puppet script 就是系統修改的文件記錄。文件就是 puppet script。
因此,最大的好處是可以針對系統的Change list做版本控管,舉幾個情境說明。
現有方式
不使用 puppet |
使用puppet | |
修改系統設定 | 每個動作必須確實透過文件記錄
須避免人為疏失 |
puppet script (manifest)就是文件
文件就是 puppet script |
Change History
rollback |
參考文件 | puppet script |
系統需要重建 | 參考之前的 SOP 一步一步重建 | 重新執行 puppet script 即可 |
工作模式 | 使用者 A改 IP=>更新文件。
使用者 B安裝 mySQL=>更新文件 文件很重要! |
使用者A改IP =>透過 puppet 執行
使用者 B安裝 mySQL=>透過 puppet 執行 puppet script 就是系統修改文件記錄 |
Puppet 可以用在 Windows嗎?
可以的! puppet script 可以針對 windows檔案、服務等進行一些基本的操作。
但是,對於應用程式安裝的部分,筆者認為還是會取決於該應用程式是否有提供指令模式 slient installation。
Puppet 與 Chef 的差異?
這兩者都是提供同樣的功能。只是語法上有些不同。Puppet 與 Chef 都是提供 VM “provision”的功能。
“provision”就是告訴系統,開機完之後需要執行哪些動作。例如,新增使用者、增加工作排程、安裝Apache、安裝新的套件等。
有Puppet 與沒有 Puppet的差異 – 新增使用者為例
如果我們想要新增使用者 ‘Tony’ 在五台 Linux 機器上,要怎麼處理呢?
傳統需要利用CentOS “useradd”這個指令,Ubuntu 則是 “adduser”。並且登入五台。
透過 puppet 的script 只需要撰寫,下列的描述即可。
puppet 自然會去驗證該作業系統為何, Tony這個帳號是否存在,不存在的話新增。
如果是用 shell script 寫,就必須額外做這些判斷,程式相對比較複雜。
puppet script 就十分簡潔。只要描述需要什麼即可。
User { ‘Tony’ :
ensure => present, } |
小結
這篇文章主要介紹環境佈署的時候會遭遇的困難。並且介紹幾個工具。
由於雲端環境與虛擬化伺服器使用的普遍,這樣的工具也被業界廣泛的使用。
Vagrant 主要提供 VirtualBox 一個 command line 的指令。
但是,最主要的功能還是在於 Vagrant 在啟動虛擬機器之後,可以直接執行 puppet or chef.
執行 puppet or chef 所要完成的動作不外乎是系統設定與環境安裝,讓該虛擬環境可以在很短的時間內就安裝設定完成。