【问题标题】:Writing a Ruby class inside of a Chef Recipe在 Chef Recipe 中编写 Ruby 类
【发布时间】:2017-09-14 08:40:53
【问题描述】:

我正在尝试“清理”我的 Chef 配方以安装 Zabbix Agent,我知道那里有一百万个,但这是我理解的测试用例。我将我的厨师指令分成一个类,并为需要完成的每个步骤单独的方法。我把类放在配方文件中。所以,当我执行配方时,linked here at GitHub,我收到了这个错误:

NoMethodError
-------------
undefined method `execute' for #<Class:0x000000030e42c0>::Recipe_Zabbix_Agent_Unix

我绝不是 Ruby 大师,所以我心想,我敢打赌,这个类将自己与 Chef 继承“分离”,所以我需要使用 @ 使该类继承 Chef 库987654323@东西。但是,我仍然收到上面列出的错误。尝试执行此操作时,我缺少什么或不理解什么?我见过人们编写一个基本上只是一个 Ruby 脚本的库,然后配方包含该脚本并在其中执行功能,但我想将其仅包含在配方中以供我简单理解。这是可能的还是我正在考虑做图书馆路线的唯一选择?我也在 Chef 10.24 上运行它。

【问题讨论】:

  • 您无权访问重量级提供商中的 Chef DSL。
  • 我将如何继承这些提供者?
  • 使用类形式execute = Chef::Resource::Execute.new(command)
  • 我是否必须为我放入的那个 Ruby 类中的每个“Chef block”都这样做?
  • 是的,你必须这样做。

标签: ruby chef-infra chef-recipe


【解决方案1】:

一般来说,基于类的资源放在库文件中,而不是配方中。有关使用 Poise 在基于类的资源中获取 LWRP DSL 元素的示例,请参阅 https://github.com/poise/berkshelf-api/blob/master/libraries/berkshelf_api.rb

【讨论】:

  • 那么,我会把我的类写成一个库文件,然后 require 或 include 它,然后调用我想要的函数吗?
  • 所有食谱库文件都由 Chef 在聚合开始时自动加载。
  • 我认为你和@sethvargo 都是正确的,因为对于我正在尝试做的事情,我必须按照他所说的去做,并将 Chef 功能分配给对象执行等内部我的班级,我的班级属于图书馆。由于我试图在我的班级中调用 Chef 函数,我将先尝试 sethvargo 的想法,然后尝试将我的代码放入库文件夹中。
  • @Pred 进展如何?
  • 我想我让你失望了@vikingsteve。我最终放弃了课程的想法,而只是使用功能。如果您查看我链接的代码,我只需声明一些def's。
【解决方案2】:

您可以创建一个将配方作为参数的类,以便资源定义方法在范围内。

libraries/useful_thing.rb:

class UsefulThing
  def initialize(blah)
    @blah = blah
  end

  def apply(recipe)
    # Chef resources use instance_eval for blocks, which hides self
    outer_self = self
    recipe.directory "/foo/#{@blah}" do
        user ...
        group outer_self.latest_group
        ...
    end
    ...
  end

  ...
end

然后在recipes/default.rb:

ut = UsefulThing.new(...)
ut.apply(self)

【讨论】:

    猜你喜欢
    • 2011-08-25
    • 2015-04-14
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2015-05-31
    • 2015-08-19
    相关资源
    最近更新 更多