雲時代基礎設定自動化管理利器: Chef

黃博文發表於2013-09-16

雲時代基礎設定自動化管理利器: Chef

雲時代的到來勢不可擋。尤其作為程式設計師,我們每天或多或少的直接或間接的使用者各種雲服務。雲平臺有很多種,如雲軟體(SaaS, Software as a service)、雲平臺(PaaS, Platform as a service)、雲裝置(IaaS, Infrastructure as a service)。雲端計算由於其價格低廉、按需提高、使用方便等特點,越來越受到人們的歡迎。

Chef是什麼?

Chef的出現正是順應了雲潮流。如果你是一個公司的devops成員,每天配置伺服器上的軟體和服務,為了給伺服器新加一個節點而通宵作業,為了解決伺服器上的一個奇詭問題而想破腦袋。 這時候,你應該考慮使用Chef。

Chef is built to address the hardest infrastructure challenges on the planet. By modeling IT infrastructure and application delivery as code, Chef provides the power and flexibility to compete in the digital economy.

通過這段話,可以總結出Chef的幾個特點。

  1. Chef是為了解決基礎設施難題。

  2. Chef通過建模將基礎設施及應用程式交付抽象為程式碼。

  3. Chef具有強大的能力及靈活性.

  4. 由於配置即程式碼,基礎設施即程式碼,Chef自動具有了版本控制功能,同時新增複製伺服器也變得更容易。

Chef主要包括三大塊:Workstation、Chef Server、Chef Client。(另外還有個chef-solo,是個簡化版的Chef-Client,不在本文討論範圍。)

以下是Chef的架構圖。

雲時代基礎設定自動化管理利器: Chef

Workstation

Workstation可以簡單地認為是自己的工作電腦,在上面需要建立一個chef-repo。chef-repo管理了cookbooks、recipes、roles、environment等資料。cookbooks、recipes、roles是Chef對infrastructure做的一層抽象。可以打個這樣的比喻,cookbooks可以理解為一個菜系,recipes就是這個菜系裡面的一道道菜,比如宮保雞丁,roles則是一桌豐富的宴席,比如滿漢全席。而nodes則是一個個盛菜的桌子。我們可以來一個滿漢全席(直接給這個node設定一個role),也可以從菜系裡抽一些菜品來做一到家常小菜(給指定node設定一個run list,裡面包括指定的recipe)。recipe就是一系列的資源,比如在node上需要安裝jvm,那麼安裝jvm的包就是一個recipe。

在Workstation上主要通過knife這個命令列工具來建立和管理這些資源。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ knife help list
Available help topics are:
  bootstrap
  chef-shell
  client
  configure
  cookbook
  cookbook-site
  data-bag
  environment
  exec
  index
  knife
  node
  role
  search
  shef
  ssh
  status
  tag

knife是由ruby寫的一個gem。它的API很有表現力。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 建立一個recipe
$ knife cookbook create myRecipe
** Creating cookbook myRecipe
** Creating README for cookbook: myRecipe
** Creating CHANGELOG for cookbook: myRecipe
** Creating metadata for cookbook: myRecipe

#從cookbook server上下載recipe
$ knife cookbook site install apache2

#將本地的recipe上傳到伺服器上
$ knife cookbook upload myRecipe


#檢視服務上當前註冊的所有的node
$ knife node list
bowenhuang-starter

#檢視bowenhuang-starter node的詳細資訊
$ knife node show bowenhuang-starter
Node Name:   bowenhuang-starter
Environment: _default
FQDN:        bowenhuang-starter
IP:          10.0.2.15
Run List:    recipe[apt], recipe[apache2]
Roles:
Recipes:     apt, apache2
Platform:    ubuntu 12.04
Tags:

#將指定IP或主機名的機器註冊到伺服器上
$ knife bootstrap IP \
  --ssh-user USERNAME \
  --ssh-password PASSWORD \
  --ssh-port PORT \
  --sudo

在cehf-repo下需要建立一個隱藏的資料夾.chef,該資料夾中包含三個重要的檔案:USER.pem, ORGANIZATION-validator.pem, knife.rb。USER.pem是一個私鑰,用於workstation與chef server通訊。ORGANIZATION-validator.pem是另一個私鑰,用於bootstrap一個新node時該node第一次與伺服器通訊。knife.rb則是knife的配置的檔案,比如客戶端key檔案路徑,chef server的api地址,cookbook的路徑等。

Chef Server

Chef Server用來儲存workstaton上傳的各種資源,包括cookbooks,roles,environments,nodes等。我們可以使用公有的Server,如opscode,也可以通過開源軟體架設自己的私服。Chef server提供了一系列的api,用於與workstation和nodes傳輸資源和資料。opscode上的server需要註冊,註冊以後需要建立一個organisation, 並從server上下載生成的USER.pem私鑰和ORGANISATION-validitor.pem私鑰。Chef server也提供了一個search的API,可以通過workstation根據attributes檢索註冊在伺服器上的node。

Chef Server本來是使用ruby寫的,後來為了保持高併發和穩定性,能夠同時服務一定數量級的node,Chef Server核心採用了支援高併發的Erlang程式,而前端則仍然使用ruby on rails。

Nodes

在bootstrap一個node時候,首先需要在該node上安裝chef-client包,並將workstation上的ORGANIZATION-validator.pem檔案拷貝到node節點上,供node與chef server建立連線。chef server通過驗證後會發給node一個新的私鑰,以後node就可以通過這個新的私鑰與chef server互動。在node的etc\chef的目錄下會生成四個檔案:client.pem, client.rb, first-boot.json, validation.pem。vlidation.pem就是從workstation拷貝過來的祕鑰,client.pem則是伺服器為該node新生成的祕鑰,client.rb則定義了伺服器的API地址,祕鑰檔案路徑等資訊,first-boot.json則存放了bootstrap該node節點時的配置資訊,如run list資訊,role資訊等。

chef-client是一個可定期的後臺執行的命令列程式。chef-client會收集當前node的各種資訊,如操作資訊型號版本等,和chef server建立連線,獲取chef server上對該節點的配置資訊,並安裝指定的recipe,執行指定的服務。


通過Chef,可以一鍵更新所有的伺服器,在指定的伺服器上安裝指定的軟體。如果有新同事入職,可以很輕鬆的setup一臺開發機;如果伺服器節點需要擴充套件,也只需要幾個命令就可搞定。運籌帷幄,一切皆在掌控之中。

相關文章