2011-02-06 77 views
3

首先,可以(並且這是一種很好的做法)廚師在特定角色的指定時間間隔運行食譜?廚師 - 重複性配方執行

我有一個ruby腳本來管理用戶帳戶和ssh身份,它每小時都在cron上運行,我想將它變成一個廚師配方,原因很明顯(我希望它在那裏所有機器)。

我可以看到這樣做的方法有兩種:

要麼把腳本到模板,配方只會呈現模板給定的路徑,然後註冊一個cronjob

OR

將腳本分解爲資源,提供者等,並讓廚師每小時運行一次。

想法?

回答

8

您可以運行廚師客戶端作爲一個守護進程(-d選項,在init腳本中使用),或在服務管理工具,如upstartrunit/daemontools或bluepill。你當然也可以從cron啓動它 - 只要確保不在那裏運行守護進程模式:)。

廚師資源提供者採取冪等動作將資源配置爲處於所需狀態。這意味着如果Chef已經在系統上運行,它只會修改資源,如果它們與配方所說的不匹配。舉例來說,如果你有一個食譜,上面寫着:

package "haproxy" 

service "haproxy" do 
    action [:enable, :start] 
end 

template "/etc/haproxy/haproxy.cfg" do 
    source "haproxy.cfg.erb" 
end 

軟件包將被安裝在第一時間廚師運行,除非包從系統中刪除或修改資源不會被再次修改。同樣,haproxy服務將啓用(通過您的平臺的服務管理工具,通常是/etc/rc*.d中的符號鏈接),然後啓動(例如,通過/etc/init.d/haproxy start)。最後,只有當模板的內容發生變化時,廚師才能渲染模板的新版本。對於模板,它基於SHA256校驗和來確定。

有幾個例外 - 執行,腳本和ruby_block資源不冪等沒有你提供某種限定條件。

另外,廚師在使用服務器時沒有「一次性」或「一次性」食譜運行列表。最近有一個thread on the Chef mailing list關於這個話題。

+0

感謝您的回答。代理程序作爲守護程序運行,我的問題是,即使運行之前並且成功完成,每次運行的廚師都可以運行相同的配方嗎? – 2011-02-08 08:46:18

2

兩者都可行。
你你提到的選項分別爲:

1)

打開腳本轉換爲 模板,配方只會 呈現模板給定的路徑 ,然後註冊一個cronjob

這是很容易上手(沒有真正改變你的腳本,它只是確保它在那裏)

請記住,廚師每次都會運行每一個食譜......正如jtimberman所說:「如果它們與配方不匹配,它只會修改資源」。所以你的食譜應該在改變時覆蓋新模板。

OR 2)

破壞腳本資源化, 提供商等,並有廚師運行 每隔一小時。

這個選項更像廚師一樣,可能更可靠和更具可擴展性 - 尤其是當您將更多基礎設施置於廚師管理之下時。

如果您的廚師客戶端是守護進程的,或者廚師獨奏在cron上運行,它會很好用。

在這種情況下,您可以使用'user','group'和'file'等資源來設置配方(以複製ssh密鑰)。詳情請看這裏:http://wiki.opscode.com/display/chef/Resources#Resources-File

然後,你最好打賭是使用'數據包'(json數據)來存儲用戶的詳細信息,並基於此安裝用戶。這正是Opscode公司在這個配方已經做了(看看./recipe/sysadmins.rb靈感): https://github.com/opscode/cookbooks/tree/master/users

要知道他們正在使用的廚師服務器(或Opscode公司平臺)。如果您使用的是廚師獨奏,則需要使用您自己的數據包文件替換搜索(:用戶,組:'sysadmin')',該文件位於廚師獨奏可以訪問的位置(可下載或在您的廚師-repo)。