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

余生颓废 提交于 2019-11-29 07:15:22

What you can do is to include the module in your recipe. That way, your module functions get access to the methods of the recipe, including node.

I normally do this for my library modules:

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

Then, in the recipe, I include the module into the current instance of a recipe:

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

That way, only the current recipe gets the module included, not all of them in the whole chef run (you thus avoid name clashes).

Alternatively, you could pass the current node as a parameter to the function. That way, you don't need to include the module (which has the upside of keeping the module namespaces) but has the downside of a more convoluted method call.

I just ran into this while trying to access the current environment in a library. I couldn't really figure out how to use modules to get access to the node and I didn't want to pass the node into each method call (or the instantiation call) so I did this (example code.. not the actual functionality):

# 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

I don't know if using class variables is frowned upon, but it works in all my tests and it's nice and easy to use.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!