我正在編寫一本使用 Chef 12.5 中提供的自訂資源的食譜。我有一個使用模板資源的自訂資源,因此有一個通知重新載入關聯的服務。
然而,相關的服務是在主配方中管理的。目前,此操作失敗,因為它抱怨沒有服務。
在先前的版本中,當使用 LWRP 時,這是由於使用使用內聯資源,我相信您可以透過不在 LWRP 中包含此函數來迴避這個特定問題。
現在我不將這一行包含在我的自訂資源中,但該行為是存在的。有什麼辦法可以關閉這種行為嗎?
或者,是否有其他方法可以將服務「包含」在多個資源中,這樣我就不必在許多地方使用完全相同的程式碼?
答案1
根據 delerious010 的回答,我和一位同事能夠針對這種特殊情況提出更好的解決方法:
action :create do
global_nginx = resources('service[nginx]')
template "/etc/nginx/conf.d/#{name.tr(' ', '_')}.conf" do
cookbook 'nginx_server'
source 'server_block.conf.erb'
owner 'root'
group 'root'
mode '0644'
variables(
listen: listen,
server_name: real_server_name,
root: root,
index: index,
config: config
)
notifies :reload, global_nginx, :delayed
end
end
顯然,這個範例只管理一個資源,但應該允許您管理多個資源,並且只通知您想要的資源。
編輯:請注意,這依賴於一個錯誤(https://github.com/chef/chef/issues/4669)廚師開發人員將修復該問題。因為在 12.9.38 中,對資源集合的搜尋向上遞歸到外部 run_contexts,所以此程式碼仍然有效,但不再是必要的(並且將正確處理多重嵌套子上下文,您需要在根中獲取資源而不是只是父run_context)。這裡最好的解決方案應該是升級。
答案2
在 Chef 12.5 中,use_inline_resources 預設開啟。其效果是,每當更新子資源時,LWRP 將被標記為已變更。因此,您始終可以在「父」LWRP 上定義資源通知。
或者,如果您希望為 LWRP 的所有實例定義通知子句,您始終可以直接在操作區塊中建立通知:
notifies_delayed(:restart, resources("service[rsyslog]"))
但是,請記住任何在 LWRP 中修改資源將導致服務重新啟動。儘管可以使用對資源的呼叫來定義notifies
子資源的屬性。不完全確定,因為我還沒有測試過。
答案3
在 12.9.38 中,新增了從子資源集合 / use_inline_resources 提供者通知外部資源集合的功能:
https://github.com/chef/chef/commit/0ca27b6f30ccd327505bd3a44bd319fb3eba956b
現在這是通知的預設行為,因此您只需要升級。