是否可以让自定义库模块了解 Chef 中的 Cookbook 属性?

Is it possible to make a Custom Library Module aware of Cookbook Attributes in Chef?

我有一个辅助模块可以帮助处理数据库。辅助模块已根据 https://docs.chef.io/custom_resources/#custom-resource-dsl 创建为自定义 DSL。我在配方执行中使用助手而不是自定义资源。 helper 模块有一组方法,每个方法都使用公共数据库参数,如下所示:

module DatabaseHelper
  def self.execute_query(db_user, db_password, db_name, query)
      #...
  end

  def self.patch_exists(patch_class, db_user, db_password, db_name)
    #...
  end

  def self.remove_data_patch(patch_class, db_user, db_password, db_name)
    #...
  end

  def self.check_structure(db_user, db_password, db_name, code)
    #...
  end
end

看到这里明显需要 DRY,我的想法是添加 db_user、db_password 和 db_name 值作为实例变量,如下所示:

module DatabaseHelper
  @db_user = node[:magento][:mysql][:db_user]
  @db_password = node[:magento][:mysql][:db_password]
  @db_name = node[:magento][:mysql][:db_name]
#...

现在,我的问题是:这些数据库值实际上是模块不知道的 chef 属性。是否可以将它们通知模块?我意识到我可以创建一个自定义资源来了解这些属性,如果这是我唯一的办法,那就这样吧。不过,如果可以的话,我更愿意使用这种基于模块的方法,因为这些方法中的大多数 return 布尔值用于条件或守卫。

可以从库中访问节点对象 Chef.node

module DatabaseHelper
  @db_user = Chef.node[:magento][:mysql][:db_user]
  @db_password = Chef.node[:magento][:mysql][:db_password]
  @db_name = Chef.node[:magento][:mysql][:db_name]
  [...]
end