[英]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.