Chef - 純Ruby與Chef DSL



在Chef中,如果需要建立簡單的菜譜,可以使用Chef中提供的資源,例如模板、remote_file和服務。但是,隨著菜譜變得越來越複雜,需要用到更高階的技術,例如條件語句來根據條件執行菜譜的部分內容。這就是將純Ruby與Chef領域特定語言(DSL)混合使用的強大之處。

如何使用?

在客戶端模式下啟動任何節點上的Chef Shell,即可訪問Chef伺服器。

user@server:~$ sudo chef-shell --client 
loading configuration: /etc/chef/client.rb 
Session type: client 
...TRUNCATED OUTPUT... 
run `help' for help, `exit' or ^D to quit. 
Ohai2u user@server! 
Chef> 

Chef DSL的基本條件

使用純Ruby按名稱對節點進行排序。

chef > nodes.sort! {|a,b| a.name <=> b.name } 
=> [node[alice],node[server]] 

迴圈遍歷節點,列印其作業系統。

chef > nodes.each do |n| 
   chef > puts n['os'] 
   chef ?> 
end  
linux 
windows 
=> [node[server], node[alice]] 

使用陣列、迴圈和字串擴充套件來構建gem名稱,安裝多個Ruby gem。

chef > %w{ec2 essentials}.each do |gem| 
   chef > gem_package "knife-#{gem}" 
   chef ?> end   => ["ec2", "essentials"] 

工作方法

Chef菜譜是Ruby檔案,在Chef執行的上下文中進行評估。它們可以包含純Ruby程式碼,例如if語句和迴圈,以及Chef DSL元素,例如資源。

在菜譜內部,可以簡單地宣告Ruby變數併為其賦值。

廣告