2013-05-07 157 views
6

下面是一個工作配方示例,它循環訪問一系列網站名稱,並使用函數createIisWebsite()在IIS中創建它們。你如何模仿廚師食譜?

def createIisWebsite(websiteName) 
    iis_site websiteName do 
    protocol :http 
    port 80 
    path "#{node['iis']['docroot']}/#{websiteName}" 
    host_header "#{websiteName}.test.kermit.a-aws.co.uk" 
    action [:add,:start] 
    end 
end 
在我們的實際解決方案中,這些數據存儲在別處並通過web API訪問。
websiteNames = ["website-2", "website-3", "website-4"] 

for websiteName in websiteNames do 
    createIisWebsite websiteName 
end 

現在我希望能夠從本食譜中的多個食譜調用函數createIisWebsite()。

我已經嘗試將它投入輔助模塊(庫)。在那裏,我無法獲得iis_site的參考。

我試着將函數移動到default.rb,然後做include_recipe「:: default」。這似乎也不起作用。

我得到一個「無法找到createIisWebsite資源上的Windows版本6.2.9200」

我採取這種做法的原因是因爲我想有一個包含每個Web服務器集羣網站列表中的配方。我感覺我沒有采取最佳的練習路線。

任何想法?

+0

Ohai!你有沒有找到解決這個問題的辦法?任何答案都有幫助嗎?請不要忘記將其中一個標記爲正確:) – sethvargo 2014-02-01 18:34:21

回答

5

問題是函數是在配方中定義的,只能在該配方中使用。 include_recipe方法可確保給定的配方已加載,但不會將任何內容導入執行包含的配方中。

由於您的函數正用於聲明具有一些計算參數的Chef資源,因此最接近的內容是Definition (Chef Docs)。定義與Resources類似,具有一個名稱和一組可選參數,但實際上是簡單的宏,它們在編譯時擴展到配方中。

在你的食譜目錄下,創建definitions/my_iis_website.rb含有類似:

define :my_iis_website do 
    iis_site websiteName do 
     protocol :http 
     port 80 
     path "#{node['iis']['docroot']}/#{websiteName}" 
     host_header "#{websiteName}.test.kermit.a-aws.co.uk" 
     action [:add,:start] 
    end 
end 

然後,更換循環在你的食譜:

for websiteName in websiteNames do 
    my_iis_website websiteName 
end 

如果你的食譜對服務器的每個集羣將是相同的但對於站點列表,您可能需要考慮將此數據存儲在attributesdata bags中。這可以幫助您避免在食譜中重複自己,並且還可以讓您在不更新食譜的情況下添加網站。

+4

當然,您也可以檢出並創建一個LWRP。有關廚師郵件列表中刪除廚師定義的討論。 – 2013-05-08 11:36:41

+0

Chef社區的不同部分對Chef的使用有不同的意見。雖然定義(和角色)的價值已經多次在郵件列表上進行辯論,但我不知道有任何計劃要刪除。如果您碰巧知道其他情況,請告訴我! – zts 2013-07-22 16:34:28

+0

謝謝,會給這個鏡頭。爲了讓事情順利進行,我只是將這個功能留在配方中。 是的,網站的列表是其他地方可以通過網絡API獲得,而不是其他系統需要訪問的數據包,Chef Web API沒有.Net客戶端庫,並且auth似乎有些定製。 – Janaka 2013-12-30 09:33:28