### Chef 專用術語
### 由名字談開去
Chef的開發團隊將其命名為Chef(大廚),是有其意義的。
大廚,給我們的第一印象,就是專業。
專業的大廚,擁有各種菜的菜譜(Cookbooks)及其制作方法(Recipes),可以把每道菜都做的很美味可口,而且,不管做多少遍,每道菜的口味都不會變味。
如果把配置服務器這個過程,類比做菜,那么Chef,就是一個專業的大廚,你只要把指定的菜譜(Cookbook)告訴Chef就可以了,它會幫你自動完成。
而每個node,好比是你要招待的每個客人,你可以告訴Chef,給他們上同樣的菜,也可以為每個客人指定專門的菜。Chef都會出色的完成工作。
### 抽象的力量
我們可以看得出來,Chef,把整個服務器的配置管理工作做了抽象,把每個服務器變成了一個個可編程的單元,這樣就能方便的去做自動化了。
#### 我們來看看Chef是怎么抽象的:
- 在Workstation上定義各個Client(Chef Node)應該如何配置自己,然后將這些信息上傳到中心服務器(Chef Server)
- 每個Client連到中心服務器(Chef Server)查看如何配置自己,然后進行自我配置
先來理解下這句話: **「定義每個Client該如何配置自己」**
這句話有兩層意思:
- 每個Client都是可以定義如何配置的
- 每個Client的配置都有可能和別的Client不同
而一個Client配置的定義,是由Cookbook來完成的。
#### 一個Cookbook的構成
比如,你要往某個Client上安裝apache2,那么,執行下面命令:
~~~
$ knife cookbook create apache-tutorial-1
~~~
注意: 要進到你的chef-repo目錄下去執行上面的命令。 因為你的.chef目錄中knife.rb定義的Cookbook目錄決定這個命令會把apache-tutorial-1這個Cookbook創建在哪里。
可以參考我的目錄結構(編輯器為Atom):

*chef repo*
如圖,可以看到,一個Cookbook的結構。
-
attributes
屬性(Attributes)就是節點(Node)的信息,如IP地址,主機名,加載的內核模塊,系統中可用的編程語言的版本以及更多.新的屬性可以用多種方式加到節點上.
-
definitions
你可以在這里定義一段通用代碼,可以在多個recipes中使用,你可以把它理解為「宏定義」。實際就是Ruby中動態定義的方法,后續有更詳細的例子。
-
files
文件,是一種資源(resources),這里定義的是文件該如何分發到各個服務器,包括節點、平臺和版本信息。
-
libraries
這里允許定義任意的Ruby代碼,用于擴展你的Cookbook。
-
providers
Provider負責把抽象的Resource對應到實際的命令(比如一個例子, 安裝vim的動作,對應到Centos系統命令是:yum -y install vim, 而Ubuntu下命令是:apt-get install vim -y)。
-
recipes
定義了多個resources,通俗的說,就是定義了這個Cookbook該如何進行配置。
-
resources
Resource是Chef提供給你的,用來描述系統的某一部分希望怎么配置的具體的東西。稍后看例子。
-
templates
這里定義了模板文件,用于從服務端復制配置文件到客戶端,復制的過程中還可以進行變量替換。這樣,不同的服務器上就可以有不同的配置。
-
metadata.rb
這個文件記錄了一個Cookbook本身的元信息。
介紹完了Cookbook的結構,讓我們來動手吧。
- 序
- Chapter 1: 初識Chef
- 一些背景
- Chef vs Puppet
- Chapter 2: Chef應用
- Chef架構
- Chef能做什么
- Chef組件
- Chef環境安裝
- chef-server
- opscode-chef
- chef-solo
- Chef實戰
- 實戰前的必修理論
- 使用Chef
- Chapter 3: Ruby基礎
- 對象與方法
- 標識符
- 類與模塊
- 數據類型
- 真與假
- 控制語句
- 代碼塊
- Chapter 4: Chef源碼架構
- Rubygems與gem
- bundler
- Chef源碼組織
- Chapter 5: Rails基礎
- Rails是什么
- MVC架構
- Restful
- Rails組成與項目結構
- Chapter 6: Chef Server WebUI
- Chef Server Webui組織結構
- Chef Rest API
- 參考