Chef - 資料包指令碼



在某些情況下,無法將伺服器完全置於 Chef 的控制之下。在這種情況下,可能需要從指令碼訪問 Chef 資料包中的值。為此,需要將資料包值儲存在 JSON 檔案中,並讓新增的指令碼訪問這些值。

為此,需要一個 Cookbook。在本例中,我們將像之前一樣使用 test_cookbook,並且節點的執行列表中應包含 test_cookbook 定義。

工作方法

步驟 1 - 建立資料包。

vipin@laptop:~/chef-repo $ mkdir data_bags/servers 
vipin@laptop:~/chef-repo $ knife data bag create servers 
Created data_bag[servers] 

步驟 2 - 建立資料包項。

vipin@laptop:~/chef-repo $ subl data_bags/servers/Storage.json { 
   "id": "storage", 
   "host": "10.0.0.12" 
} 

步驟 3 - 更新資料包項。

vipin@laptop:~/chef-repo $ subl data_bags/servers/Storage.json { 
   "id": "storage", 
   "host": "10.0.0.12" 
} 

在 Cookbook 中使用

步驟 1 - 需要使用上述 Cookbook 建立一個包含資料包值的 JSON 檔案,以便外部指令碼可以訪問這些值。

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
file "/etc/backup_config.json" do 
   owner "root"
   group "root" 
   mode 0644 
   content data_bag_item('servers', 'backup')['host'].to_json 
end

步驟 2 - 將 test_cookbook 上傳到 Chef 伺服器。

vipin@laptop:~/chef-repo $ knife cookbook upload test_cookbook 
Uploading my_cookbook [0.1.0] 

步驟 3 - 在節點上執行 Chef 客戶端。

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-03-14T20:30:33+00:00] INFO: Processing 
file[/etc/backup_config.json] action create 
(my_cookbook::default line 9) 
[2013-03-14T20:30:34+00:00] INFO: entered create 
[2013-03-14T20:30:34+00:00] INFO: 
file[/etc/backup_config.json] owner changed to 0 
[2013-03-14T20:30:34+00:00] INFO: 
file[/etc/backup_config.json] group changed to 0 
[2013-03-14T20:30:34+00:00] INFO: 
file[/etc/backup_config.json] mode changed to 644 
[2013-03-14T20:30:34+00:00] INFO: 
file[/etc/backup_config.json] created file 
/etc/backup_config.json 
...TRUNCATED OUTPUT... 

步驟 4 - 驗證生成的 JSON 檔案的內容。

user@server:~$ cat /etc/backup_config.json 
"10.0.0.12" 

指令碼的工作流程

在上述命令中,我們使用的 file 資源(它在 `/etc` 目錄內建立 JSON 檔案)在 default cookbook 中定義。它使用 `data_bag_item` 方法直接從資料包獲取檔案內容。我們訪問資料包項中的主機值並將其轉換為 JSON。file 資源使用 JSON 轉換後的值作為其內容並將其寫入磁碟。

廣告