Chef 12.5 自訂資源 - 存取食譜中的資源

Chef 12.5 自訂資源 - 存取食譜中的資源

我正在編寫一本使用 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

現在這是通知的預設行為,因此您只需要升級。

相關內容