【问题标题】:Is it possible to make a Custom Library Module aware of Cookbook Attributes in Chef?是否可以让自定义库模块了解 Chef 中的食谱属性?
【发布时间】:2020-12-16 20:30:06
【问题描述】:

我有一个帮助处理数据库的辅助模块。已根据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]
#...

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

【问题讨论】:

    标签: ruby chef-infra


    【解决方案1】:

    可以从库中以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
    

    【讨论】:

    • 此声明准确且很有帮助(谢谢)。也就是说,虽然我能够通过节点对象访问属性,但我无法将它们用作模块中的实例变量,如我的问题和本答案中所示。我通过定义一个定义变量的方法并在其他模块方法中使用该方法来解决这个问题。有可能要正确执行此操作,我可能需要使用类而不是模块。
    猜你喜欢
    • 2016-03-29
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2014-11-06
    • 2016-09-22
    相关资源
    最近更新 更多