有没有办法从另一个ruby_block调用一个ruby_block?

时间:2014-07-29 18:16:52

标签: chef

我们说我有:

ruby_block "foo" do
  block do
     puts "do something"
  end
end

ruby_block "bar" do
  block do
    puts "do something else"
  end
end

如何从bar阻止来电话foo

2 个答案:

答案 0 :(得分:5)

如果您希望在Ruby中实现通用功能,则应该编写库函数并从ruby_block调用它们。

您可以将其添加到libraries/helpers.rb

module MyCookbook
  module Helpers
    def foo
      # do something
    end

    def bar
      # do something else
    end
  end
end

然后您可以在ruby_block中调用这些函数,如下所示:

extend MyCookbook::Helpers

ruby_block "foo" do
  block do
    foo
  end
end

ruby_block "bar" do
  block do
    # call the foo helper method
    foo
    # call the bar helper method
    bar
  end
end

除了辅助方法之外,您还可以使用Chef的DSL中提供的notifications来通知其他资源运行,包括其他ruby_block

答案 1 :(得分:1)

Holger的回答是“#34;”正确的做法,但是如果你需要从另一个内部调用一个资源,你可以利用DSL方法的返回值。

每个Recipe DSL方法(fileruby_block等)返回从DSL创建的对象的实例:

bar = ruby_block 'bar' do
  # ...
end

现在bar包含对DSL方法创建的Chef::Resource::RubyBlock实例的引用。然后,您可以在其他ruby_block中使用此功能:

ruby_block 'foo' do
  block do
    # in this context, bar is the RubyBlock resource, so you can call any actions
    # or change any attributes you wish.
  end
end