2015-02-06 65 views
0

我編輯了示例代碼來闡明我的問題。我認爲現在的答案更有意義,因爲我的第一個食譜確實在ruby_block中。廚師客戶端運行期間何時設置默認節點屬性?

在客戶端運行期間何時可以使用默認節點屬性?讓我澄清一下。我的例子是簡化的,但我想要做的比這更復雜,但概念是相似的。

我引導了一個節點,它運行一個空的運行列表。到現在爲止還挺好。

現在我將我的hello_world食譜添加到我的節點的運行列表中。

knife node run_list add node_name "recipe[hello_world]" 

在我的程序hello_world食譜,我已經在屬性/ default.rb定義以下默認屬性

default.hello_world.location = '' 

我有一個食譜/ default.rb,這是否

include_recipe "hello_world::set_location" 
include_recipe "hello_world::show_location" 

recipes/set_location.rb does

ruby_block "Set location" do 
    block do 
    node.set.hello_world.location = "New York!" 
    end 
end 

和食譜/ show_location.rb做到這一點,使用日誌資源

log "Hello #{node.hello_world.location}" 

我應該會看到這樣的廚師客戶端運行...

Hello New York! 

......或者乾脆此,因爲食譜尚未完全運行,因此其屬性尚未與主廚服務器同步?

Hello 

我得到後者,就是沒有「紐約!」就是「你好」。

如何讓我的食譜記錄「紐約你好!」客戶端運行後?

也就是說,一般來說,如何在一個配方中設置節點屬性,以便我可以在廚師客戶端運行期間在同一本食譜的不同配方中使用它們?

回答

1

廚師的裝載描述here和屬性優先描述here

你應該已經爲你更新日誌資源之前的屬性值進行編譯,因爲node.set是預期的結果不在ruby_block中。

我懷疑使用方法的語法是問題,更喜歡使用哈希訪問。

即:

node.set['hello_world']['location'] = "New York!" 

log "Hello #{node['hello_world']['location']}" 

但因爲它不是真正的代碼(如果我理解正確的),我也不敢保證它的真實案例,沒有一個真正的情況下,我可以」請確定你爲什麼得到這個結果。

您可以使用lazy evaluation在其他方面(屬性ruby_block內更新)

+0

這是等價的:「紐約」 node.set.hello_world.location =和node.set ['hello_world'] ['location'] =「紐約!」我會看懶惰的評價。 – 2015-02-06 14:21:00

+0

@ChrisF它是一個真正的「測試食譜」還是基於您的實際問題的一個例子? – Tensibai 2015-02-06 14:32:38

+0

這是一本我遇到問題的實際食譜。這個概念與 – 2015-02-06 18:23:28

相關問題