Infrastructure as Code 使用 puppet 部署開發、測試與線上環境

Infrastructure as Code 使用 puppet 部署開發、測試與線上環境

這篇文章主要說明開發測試環境所遇到的挑戰,為什麼要用 puppt,

如何運用 puppet 解決相關環境佈署的問題,

最後也用幾個實例,說明如何安裝與佈署環境設定。

DevOps 環境的挑戰

開發與測試團隊不斷的在推出新的功能與服務,

另一方面維運團隊需要控管線上所有相關的修改,

這兩者的功能性目標有些衝突。

因此,

對於研發團隊來說,如何可以更快速的佈署環境,確保測試開發環境與線上環境的一致性?

對於維運團隊來說,如何有效地做系統改變版本的控管與多台伺服器間的佈署?

這就是 DevOps的挑戰,也就是為什麼 Puppet 誕生的原因。

(Source: Vmware)

沒有 Puppet 怎麼做?

試想下列情境,如果沒有 puppet 目前有哪些做法?

  • 安裝 Apache,必且做Apache 設定檔案的修改
  • 修改系統設定檔案
  • 新增 Scheduled Tasks

做法1. For Linux, 最常見的可能利用 Shell Script

做法2. For Windows 有script,powerShell或是用 ActiveDirectory 來做環境設定與安裝。

但是使用 Active Directoy 的前提是須要有 AD Domain Server,另外必須該帳戶需登入 Domain。

做法3. 那麼使用 VM Image 呢? VM Image 的缺點是每次系統的小修改,就必須要將整個 Image 儲存並且拷貝。

這樣的 Image 通常是 2~4 G的大檔案。另外,相關的系統修改很難追蹤與文件化。

因此,puppet 的誕生就是要解決這些問題。

Puppet 到底是什麼?

puppet 可以想做專門提供系統修改與配置的 shell script。Windows or Linux 都可以使用。

那跟 Linux Bash Shell script 或是 Windows PowerShell 最大不同的地方在哪?

最大不同的地方是該語法為”描述性”語言,只需定義 What,而非需要像一般程式需要定義許多  How

舉例來說,如何在系統安裝 Apache?

Puppet 的語法僅需如此定義:

package

{

“apache2”:ensure => “installed”,

}

puppet 執行時,就會先確定該系統是否有 apache 安裝,

如果沒有就會進行下載 Apache2並且作安裝的動作。

相關名詞

另外,puppet 所完成的 script 就稱為 “manifest

透過puppet提供環境所需要的設定與修改,這個過程又稱為 “provision

Puppet 的競爭者就是 Chef,兩者要達到的目的與功能相同。只是語法有些差異。

Puppet安裝

如果要透過 puppet 來執行相關系統修改的 script ,需要安裝puppet。puppet 可以執行在 Windows 與 Linux。

puppet 的安裝可以參考 http://docs.puppetlabs.com/guides/installation.html

如果是 Ubuntu 可以直接下下列指令安裝

sudo    apt-get    install   puppet

如果是 Windows,可下載安裝包執行安裝

https://docs.puppetlabs.com/guides/install_puppet/install_windows.html#step-2-download-package

Puppet Labs’ Windows packages can be found here

Puppet 安裝完後驗證

若 puppet 安裝成功後,可以透過下列指令驗證。

 which   puppet
puppet  –version

Puppet 使用情境

情境1: 安裝軟體

透過這個例子說明如何使用 puppet 進行 vim 軟體安裝?

首先我們會編輯一個 puppet script 的檔案,副檔名通常為pp,如: Install_vim.pp

如果我們要安裝 vim,那麼該 puppet script 的內容如下:

package  {  ‘vim’:name => ‘vim’,          ensure => ‘installed’,}

接著 執行該 puppet,

sudo  puppet   apply   Install_vim.pp

因此,對於系統管理員來說就可以將系統修改透過 puppet script來執行,

針對install_vim.pp來說,也比較容易做系統修改的版本控制。

情境2:新增檔案或是檔案目錄

那麼要如何透過 puppet 來新增檔案或是檔案目錄呢?

下面這個例子,會建立 “mydir”這個目錄

# create a directoryfile { “/vagrant/mydir”:ensure => “directory”,}

下面這個例子會建立myfile.txt這個檔案。

# this example is to create a file not directoryfile { “/vagrant/myfile.txt”:ensure => “present”,

}

情境3:執行特定指令

要如何執行外部指令呢? 例如下面的例子,直接執行 ls

# exec with command as the nameexec { “/bin/ls”:}

情境4:拷貝檔案

需要做檔案的拷貝,要如何透過 puppet 執行? 如下面的例子,

file{‘/vagrant/dst.txt’:
source => ‘/vagrant/HostMachineFolder/source.txt’,
owner =>’root’,
group => ‘root’
}

FAQ

1. puppet, Chef, Ansible有什麼差異?

筆者認為目的都是相同 “Infrastructure as Code”. 只是被後驅動的技術不同

2. 免費嗎?

使用都是免費的。只有管理功能才是付費

3. Puppet 也可以執行在 Windows嗎?

可以的! 但是在安裝軟體上畢竟沒有像 Linux 那樣的充分支援。

 

puppet的使用參考

http://docs.puppetlabs.com/references/latest/type.html

http://docs.puppetlabs.com/puppet/3/reference/lang_summary.html

http://docs.puppetlabs.com/facter/latest/core_facts.html

http://forge.puppetlabs.com/

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *