# Chef Server Rest API
Chef11 中的核心api用erlang重寫了,我們這里暫時不去深入探究erlang的代碼,但是我們應該知道,erlang是性能的保證。erlang天生就是處理高并發的高手,chef server使用erlang來開發核心Api,我們幾乎不用擔心Chef Server的性能問題了。
Chef Server還使用了Rabbitmq來提供消息隊列,來處理search服務,更是為了性能所考慮,消息隊列有諸多好處,增加請求吞吐量、保證健壯性請求不易丟失等。
我們舉個例子來說明下Chef Server Rest API:


我們可以看得出來, chef server rest api,跟我們Rails基礎中講過的restful概念,是一樣的。
### 調用 Chef 命令
為了實現上層系統調用 Chef 的完全自動化,有時候需要自動化 Chef Client 的配置。將一個非 Chef Client 的普通機器自動注冊成 Chef Client,能提高整個系統的自動化程度。Chef 的 REST API 沒有提供注冊 Chef Client 的功能,而 Chef 的 bootstrap 命令是用來完成這個工作的。所以上層系統需要使用某些機制(如使用 JSch)來在 Chef Workstation 上運行 bootstrap 命令。
通常我們用如下命令來將一個普通機器注冊成 Chef Node:
~~~
knife bootstrap client_IP -x username -P password
~~~
如果客戶端已經安裝了 chef-client軟件,此命令會直接將這個客戶端注冊成一個 Chef Node;如果客戶端沒有安裝 chef-client軟件,此命令會試圖從網絡上直接下載安裝包去安裝 chef-client 然后注冊。
對于沒有外部網絡連接的客戶端,又沒有安裝 chef-client軟件,我們可以自定義 bootstrap 所用的模板,讓其不從網絡下載chef-client,而直接從本地服務器下載 chef-client 進行安裝(前提是配置一個本地服務器如 HTTP 服務器,將 chef-client 軟件預先放到服務器上)。
如果是默認安裝,bootstrap 所用的模板位于 Workstation 的/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.10.4/lib/chef/knife/bootstrap/目錄下。我們可以在此目錄下新建一個模板,命名為 ubuntu12.04-gems-mine,在原有的 ubuntu12.04-gems 模板基礎上進行修改,如將安裝 chef-client 軟件的部分自定義:
~~~
if [ ! -f /usr/bin/chef-client ]; then
mkdir -p /tmp/chef-installer
cd /tmp/chef-installer
#Copy chef client rpm from HTTP file server
wget http://http_server_ip/chef/chef-11.12.2-1.el6.x86_64.rpm
rpm -ivh chef-*.rpm
rm -rf /tmp/chef-installer
fi
~~~
然后我們使用自定義的模板來運行 bootstrap 命令:
~~~
# knife bootstrap client_ip -x username -P password –d ubuntu12.04-gems-mine
~~~
這樣在 bootstrap 一個普通的沒有安裝 chef-client 的機器時,Chef 就會從本地的服務器上下載 chef-client 軟件(無需外部網絡連接),安裝在客戶機上,然后注冊成 Chef Node。可見,對于沒有提供 Chef REST API 的一些特殊 Chef 功能,可以通過調用 Chef 的命令行來完成。
### 結語
Chef Rest API, 和Rails的restful架構是一樣的概念,我們通過調用 Chef 的 REST API,就可以完成對 Chef 資源的管理。而對于Rest Api并沒有提供的功能,我們可以直接使用knife來調用chef命令來完成我們的工作。
- 序
- 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
- 參考