【问题标题】:Chef: Use library function in attributesChef:在属性中使用库函数
【发布时间】:2014-05-15 15:53:36
【问题描述】:

如何访问食谱属性文件中自己的库函数(在以下模块中创建)?

module Gerrit
  module Helpers
    def gerrit_above?(version)
      require 'chef/version_constraint'
      Chef::VersionConstraint.new(">= #{version}").include?(node['gerrit']['version'])
    end
  end
end

Chef::Recipe.send(:include, ::Gerrit::Helpers)
Chef::Resource.send(:include, ::Gerrit::Helpers)
Chef::Provider.send(:include, ::Gerrit::Helpers)

我可以通过gerrit_above? 在食谱中访问它,但没有找到一种方法让它同时在属性文件中可用。我尝试了以下行

Chef::Node::Attribute.send(:include, ::Gerrit::Helpers)

但随后在访问node 时失败:

Undefined method or attribute `node' on `node'

有人有干净的解决方案吗?

【问题讨论】:

  • 属性是在库之前加载的,所以你真的不能。你想达到什么目的?如果你需要一个库来计算一个属性,那个属性太复杂了imo
  • 我想根据部署的应用程序(gerrit)的版本来设置节点属性。只会是化妆品,我也可以在食谱中这样做。谢谢
  • 我通常在任何类型的计算或编译属性上都是-1。他们给你带来麻烦。另外,问问自己 - 这真的应该是可调的,还是我只是将属性用作全局变量?

标签: chef-infra


【解决方案1】:

我建议使用node.run_state 对象来存储资源和配方之间的瞬态数据。在此处查看更多信息:https://docs.chef.io/recipes/#noderun_state

如果您绝对必须在属性中存储数据,请创建一个计算和设置属性值的配方,并将其设置为在默认配方中执行的第一个配方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2020-11-16
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多