簡體   English   中英

如何從Chef cookbook中的庫訪問當前節點?

[英]How can I access the current node from a library in a Chef cookbook?

我正在嘗試為廚師食譜編寫一個庫,簡化了一些常見搜索。

例如,我希望能夠在cookbook/libraries/library.rb執行類似的操作,然后在同一個cookbook中的配方中使用它:

module Example
    def self.search_attribute(attribute_name)
        return search(:nodes, node[attribute_name])
    end
end

問題是,在Chef庫文件中, node對象或search功能都不可用。

使用Chef::Search::Query.new().search(...)似乎可以Chef::Search::Query.new().search(...) ,但我找不到任何可以訪問node 由此產生的錯誤是:

undefined local variable or method `node' for Example:Module

使用Chef 10.16.4。

您可以做的是將模塊包含在配方中。 這樣,您的模塊函數就可以訪問配方的方法,包括node

我通常為我的庫模塊執行此操作:

# my_cookbook/libraries/helpers.rb
module MyCookbook
  module Helpers
    def foo
      node["foo"]
    end
  end
end

然后,在配方中,我將模塊包含在配方的當前實例中:

# my_cookbook/recipes/default.rb
extend MyCookbook::Helpers

這樣,只有當前配方包含模塊,而不是所有這些都在整個廚師運行中(因此避免了名稱沖突)。

或者,您可以將當前節點作為參數傳遞給函數。 這樣,您不需要包含模塊(它具有保留模塊名稱空間的優點),但具有更復雜的方法調用的缺點。

我試圖訪問庫中的當前環境時遇到了這個問題。 我無法弄清楚如何使用模塊來訪問節點,我不想將節點傳遞給每個方法調用(或實例化調用)所以我做了這個(示例代碼..而不是實際的功能):

# libraries/account.rb
class Account
  @@env = "_default"

  def self.env=(env)
    @@env = env
  end

  def settings
    Chef::EncryptedDataBagItem.load(@@env, "settings") || {}
  end
end

# recipes/accounts.rb
Account.env = node.chef_environment

Account.new.settings

我不知道是否使用類變量是不受歡迎的,但它適用於我的所有測試,它很好用且易於使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM