2014-09-21 68 views
4

我看到,如果service['somename']被內部LWRP創建了use_inline_resources啓用,那麼這個資源不是在其他情況下明顯的 - 這裏說明:Notify service defined in included LWRP recipe廚師從LWRP提供商代碼內通知全球服務

我有情況service['somename']在正常配方中定義(不在LWRP提供者中)。然後LWRP提供商正在嘗試通知此服務。在我的示例中,服務是Web服務器,LWRP負責在此Web服務器內創建虛擬主機。

如果我在該提供程序中使用use_inline_resources,提供程序內部的代碼看不到全局範圍(在正常配方中)定義的資源。食譜定義此服務的配方添加爲depends cookbooknamemetadata.rb

所以問題是:實際上是怎樣工作的use_inline_resources-官方解釋對我來說還不清楚(http://docs.getchef.com/lwrp_common_inline_compile.html)。這個解釋說,相反我看到的 - 它說:

爲了確保嵌入輕量資源可以通知 頂級資源添加use_inline_resources到文件

的頂部。在我的情況我有祕方:

include_recipe 「網絡服務器安裝::」 #創建服務[ 'Web服務器']

this_cookbook_my_ lwrp「地王」做#這LWRP試圖通知服務[「Web服務器」]
行動:建立

所以這LWRP在這個食譜中定義。而且它的行爲是這樣的:

  • 如果LWRP包含use_inline_resources,它無法看到服務[ 'Web服務器']
  • 如果LWRP不包含use_inline_resources,就可以看到服務[ 'Web服務器']

此外,是否定義use_inline_resources對其他資源可見性有任何影響?

回答

0

use_inline_resources的主要作用是爲LWRP創建一個新的執行上下文。

它使LWRP內的所有資源在其自己的運行上下文中。

你可能會看到它作爲廚師跑內的廚師。

這個想法是能夠在LWRP內部生成內容並完全抽象它們,LWRP資源將從其內部資源中獲取更新狀態,因此LWRP聲明(配方)中的通知將會通過在LWRP內部發生了變化。使用use_inline_resources,LWRP內部的資源可以互相通知。 沒有use_inline_resources,他們將被添加到主run_contextresource_collection在收斂pahse,而不是在編譯時,它通常以內部通知,沒有工作,有時資源的重複,如果LWRP定義具有固定的服務或資源的結束名稱。

希望這使得它更有點清楚。

1

爲了確保嵌入輕量資源可以通知頂級資源添加use_inline_resources到文件的頂部

這是什麼要說的是,加入use_inline_resources您LWRP將導致LWRP資源被標記爲updated如果有嵌入的資源是updated。這可以讓你治療的LWRP資源作爲一個整體,而不是其它資源的集合(這是一個定義是什麼)。

如果您有LWRP外部資源需要訂閱嵌入資源,那麼您的LWRP可能有設計問題(要麼嘗試做太多,要麼嘗試做得太少)。如果您的外部資源可以,它應該訂閱LWRP本身,而不是嵌入式資源。

同樣的,如果你LWRP需要訪問外部資源來通知它,那麼你的LWRP不自足。我假設您的LWRP需要在添加虛擬主機後通知服務資源以便您的網絡服務器重新加載?如果是這種情況,那麼你就要求你的LWRP做一些它不應該做的事情。您的LWRP負責配置VHOST,但它不負責啓動/重新加載網絡服務器。同樣,您用來安裝網絡服務器的機制不負責啓動它。您聲明service資源與啓動Web服務器時,那service資源還負責訂閱可能需要重新加載發生的任何資源(或這些資源 - 就像你LWRP的情況下 - 應當通知Web服務器)。

mycool_vhost 'some vhost' do 
    attribute value 
    other_attribute value 
end 

service 'mywebserver' do 
    subscribes :reload, "mycool_vhost[some vhost]" 
end 

就是這樣的。

2

如果你在尋找辦法從LRWP裏面,你可以使用以下提供商行動的內部代碼通知全球服務:

webserver = run_context.parent_run_context.resource_collection.find('service[webserver]') 
new_resource.notifies :restart, webserver