2014-02-20 139 views
4

我有一個廚師的食譜,我想多次使用(多個角色),只有幾個不同的參數。我希望能夠在同一個節點上使用多個這樣的角色。參數化廚師配方

如何「參數化」配方?我不能使用屬性,因爲它們在節點上,所以一個角色會覆蓋另一個屬性。

回答

3

這種情況下的推薦方法是使用輕量級資源提供程序或類似方法。

我認爲當運行列表收斂時,它會刪除所有配方,所以如果您有6個角色,包括相同的配方,並將每個角色添加到運行列表,它只會實際運行該配方一次。

Seems like someone asked opscode this before

簡介LWRP的可以發現here,althought比創建一個新的多執行。

在這種情況下,一旦您擁有LWRP,您可以創建一個配方,多次調用它,或者爲每個調用創建單獨的配方。

您可以考慮利用節點的數據模型層次結構來構建某種代表您要運行的實例並以此方式循環的對象。

+0

我使用了定義,但也會查看LWRP。謝謝。 – amorfis

+1

沒問題,我們爲此安裝了一些內部產品。我們需要爲每個步驟執行一系列常見步驟,因此我們定義了一個資源,該資源定義了我們希望能夠更改的參數,然後定義一個:install操作,然後有一些配方執行爲我們安裝。我們這樣做,而不是自動安裝許多對象,以保持運行列表的可讀性和易於理解 – PatrickWalker

0

我發現這個答案在幫助我使用類似的用例方面非常有用。我想分享一個簡單的例子,創建一個對象來迭代PatrickWalker所指的(「......構建某種代表實例的對象,然後循環......」)。我希望這可以幫助某人。

  1. 創建的值是包含用於每次迭代的陣列和包含用於每次迭代的參數每個陣列條目的JSON字符串的屬性。

  2. 使用JSON字符串中的參數(可以將可重複使用的代碼封裝在定義或LWRP中)在配方中迭代該數組。

簡單的例子

創建一個或多個文件與JSON定義的特定名稱和內容:

屬性:

default['config'] = '{"files":[{"name":"/tmp/file_1","content":"file contents 1"},{"name":"/tmp/file_2","content":"file contents 2"}]}' 

方藥:

config = JSON.parse("#{node['config']}") 
files = config['files'] 

files.each do |file| 
    file "#{file['name']}" do 
    content "#{file['content']}" 
    end 
end 

你能夠推斷這個簡單的例子到你自己的用例。